From a5c638ceaca09d018d041f15e7e2518c217250bc Mon Sep 17 00:00:00 2001 From: YamaArashi Date: Mon, 8 Feb 2016 03:04:42 -0800 Subject: remove Fortran, Objective C, and C++ --- gcc/Makefile.in | 130 +- gcc/collect2.c | 3742 ------- gcc/collect2.h | 36 - gcc/config/arm/t-arm-elf | 3 - gcc/config/arm/t-thumb-elf | 2 - gcc/configure | 2882 +---- gcc/configure.in | 3005 +----- gcc/cp/.cvsignore | 10 - gcc/cp/ChangeLog | 14199 ------------------------ gcc/cp/ChangeLog.1 | 9451 ---------------- gcc/cp/ChangeLog.Cygnus | 93 - gcc/cp/Make-lang.in | 317 - gcc/cp/Makefile.in | 343 - gcc/cp/NEWS | 232 - gcc/cp/call.c | 4515 -------- gcc/cp/class.c | 5669 ---------- gcc/cp/config-lang.in | 41 - gcc/cp/cp-tree.def | 257 - gcc/cp/cp-tree.h | 3441 ------ gcc/cp/cvt.c | 1143 -- gcc/cp/decl.c | 14623 ------------------------- gcc/cp/decl.h | 59 - gcc/cp/decl2.c | 5040 --------- gcc/cp/errfn.c | 343 - gcc/cp/error.c | 2007 ---- gcc/cp/except.c | 1161 -- gcc/cp/exception.cc | 345 - gcc/cp/expr.c | 433 - gcc/cp/friend.c | 490 - gcc/cp/g++.1 | 642 -- gcc/cp/g++FAQ.texi | 2423 ----- gcc/cp/g++spec.c | 266 - gcc/cp/gxx.gperf | 111 - gcc/cp/gxxint.texi | 1867 ---- gcc/cp/hash.h | 231 - gcc/cp/inc/exception | 39 - gcc/cp/inc/new | 60 - gcc/cp/inc/new.h | 11 - gcc/cp/inc/typeinfo | 58 - gcc/cp/init.c | 3298 ------ gcc/cp/input.c | 213 - gcc/cp/lang-options.h | 137 - gcc/cp/lang-specs.h | 99 - gcc/cp/lex.c | 5157 --------- gcc/cp/lex.h | 137 - gcc/cp/lex_990205.c | 5105 --------- gcc/cp/method.c | 2466 ----- gcc/cp/new.cc | 46 - gcc/cp/new1.cc | 99 - gcc/cp/new2.cc | 80 - gcc/cp/parse.c | 9814 ----------------- gcc/cp/parse.h | 140 - gcc/cp/parse.y | 3763 ------- gcc/cp/pt.c | 9074 ---------------- gcc/cp/ptree.c | 192 - gcc/cp/repo.c | 447 - gcc/cp/rtti.c | 1165 -- gcc/cp/search.c | 3499 ------ gcc/cp/semantics.c | 1678 --- gcc/cp/sig.c | 1071 -- gcc/cp/spew.c | 489 - gcc/cp/tinfo.cc | 134 - gcc/cp/tinfo.h | 55 - gcc/cp/tinfo2.cc | 306 - gcc/cp/tree.c | 2765 ----- gcc/cp/typeck.c | 7495 ------------- gcc/cp/typeck2.c | 1647 --- gcc/cp/xref.c | 838 -- gcc/crtstuff.c | 530 - gcc/f/BUGS | 221 - gcc/f/ChangeLog | 5143 --------- gcc/f/ChangeLog.Cygnus | 0 gcc/f/INSTALL | 1558 --- gcc/f/Make-lang.in | 472 - gcc/f/Makefile.in | 529 - gcc/f/NEWS | 1603 --- gcc/f/README | 7 - gcc/f/ansify.c | 208 - gcc/f/assert.j | 27 - gcc/f/bad.c | 544 - gcc/f/bad.def | 711 -- gcc/f/bad.h | 108 - gcc/f/bit.c | 201 - gcc/f/bit.h | 84 - gcc/f/bld-op.def | 69 - gcc/f/bld.c | 5794 ---------- gcc/f/bld.h | 1024 -- gcc/f/bugs.texi | 320 - gcc/f/bugs0.texi | 17 - gcc/f/com-rt.def | 282 - gcc/f/com.c | 16512 ---------------------------- gcc/f/com.h | 376 - gcc/f/config-lang.in | 37 - gcc/f/config.j | 27 - gcc/f/convert.j | 28 - gcc/f/data.c | 1816 ---- gcc/f/data.h | 74 - gcc/f/equiv.c | 1498 --- gcc/f/equiv.h | 103 - gcc/f/expr.c | 19304 --------------------------------- gcc/f/expr.h | 194 - gcc/f/fini.c | 776 -- gcc/f/flags.j | 27 - gcc/f/g77.1 | 357 - gcc/f/g77.texi | 14971 ------------------------- gcc/f/g77install.texi | 2170 ---- gcc/f/g77spec.c | 577 - gcc/f/glimits.j | 28 - gcc/f/global.c | 1536 --- gcc/f/global.h | 200 - gcc/f/hconfig.j | 27 - gcc/f/implic.c | 382 - gcc/f/implic.h | 74 - gcc/f/info-b.def | 36 - gcc/f/info-k.def | 37 - gcc/f/info-w.def | 41 - gcc/f/info.c | 304 - gcc/f/info.h | 186 - gcc/f/input.j | 27 - gcc/f/install0.texi | 14 - gcc/f/intdoc.c | 1336 --- gcc/f/intdoc.in | 2498 ----- gcc/f/intdoc.texi | 10724 ------------------ gcc/f/intrin.c | 2056 ---- gcc/f/intrin.def | 3351 ------ gcc/f/intrin.h | 130 - gcc/f/lab.c | 159 - gcc/f/lab.h | 154 - gcc/f/lang-options.h | 164 - gcc/f/lang-specs.h | 106 - gcc/f/lex.c | 4759 -------- gcc/f/lex.h | 201 - gcc/f/malloc.c | 552 - gcc/f/malloc.h | 183 - gcc/f/name.c | 242 - gcc/f/name.h | 109 - gcc/f/news.texi | 2284 ---- gcc/f/news0.texi | 14 - gcc/f/output.j | 27 - gcc/f/parse.c | 95 - gcc/f/proj.c | 68 - gcc/f/proj.h | 83 - gcc/f/rtl.j | 28 - gcc/f/src.c | 445 - gcc/f/src.h | 144 - gcc/f/st.c | 554 - gcc/f/st.h | 81 - gcc/f/sta.c | 2000 ---- gcc/f/sta.h | 117 - gcc/f/stb.c | 25199 ------------------------------------------- gcc/f/stb.h | 253 - gcc/f/stc.c | 13898 ------------------------ gcc/f/stc.h | 360 - gcc/f/std.c | 6905 ------------ gcc/f/std.h | 298 - gcc/f/ste.c | 5419 ---------- gcc/f/ste.h | 168 - gcc/f/storag.c | 573 - gcc/f/storag.h | 167 - gcc/f/stp.c | 59 - gcc/f/stp.h | 508 - gcc/f/str-1t.fin | 135 - gcc/f/str-2t.fin | 60 - gcc/f/str-fo.fin | 55 - gcc/f/str-io.fin | 43 - gcc/f/str-nq.fin | 55 - gcc/f/str-op.fin | 57 - gcc/f/str-ot.fin | 50 - gcc/f/str.c | 217 - gcc/f/str.h | 85 - gcc/f/sts.c | 273 - gcc/f/sts.h | 89 - gcc/f/stt.c | 1044 -- gcc/f/stt.h | 230 - gcc/f/stu.c | 1161 -- gcc/f/stu.h | 69 - gcc/f/stv.c | 66 - gcc/f/stv.h | 165 - gcc/f/stw.c | 428 - gcc/f/stw.h | 184 - gcc/f/symbol.c | 1477 --- gcc/f/symbol.def | 654 -- gcc/f/symbol.h | 293 - gcc/f/system.j | 27 - gcc/f/target.c | 2564 ----- gcc/f/target.h | 1865 ---- gcc/f/tconfig.j | 27 - gcc/f/tm.j | 27 - gcc/f/top.c | 922 -- gcc/f/top.h | 264 - gcc/f/toplev.j | 27 - gcc/f/tree.j | 28 - gcc/f/type.c | 107 - gcc/f/type.h | 64 - gcc/f/version.c | 1 - gcc/f/version.h | 6 - gcc/f/where.c | 542 - gcc/f/where.h | 138 - gcc/frame.c | 864 -- gcc/frame.h | 80 - gcc/gbl-ctors.h | 92 - gcc/gcc.c | 9 +- gcc/libgcc2.c | 2878 +---- gcc/objc/Make-lang.in | 173 - gcc/objc/Makefile.in | 73 - gcc/objc/README | 97 - gcc/objc/config-lang.in | 35 - gcc/objc/lang-specs.h | 93 - gcc/objc/objc-act.c | 8555 --------------- gcc/objc/objc-act.h | 117 - gcc/objc/objc-tree.def | 37 - gcc/objc/objc.gperf | 64 - gcc/tlink.c | 647 -- 213 files changed, 36 insertions(+), 336068 deletions(-) delete mode 100755 gcc/collect2.c delete mode 100755 gcc/collect2.h delete mode 100755 gcc/cp/.cvsignore delete mode 100755 gcc/cp/ChangeLog delete mode 100755 gcc/cp/ChangeLog.1 delete mode 100755 gcc/cp/ChangeLog.Cygnus delete mode 100755 gcc/cp/Make-lang.in delete mode 100755 gcc/cp/Makefile.in delete mode 100755 gcc/cp/NEWS delete mode 100755 gcc/cp/call.c delete mode 100755 gcc/cp/class.c delete mode 100755 gcc/cp/config-lang.in delete mode 100755 gcc/cp/cp-tree.def delete mode 100755 gcc/cp/cp-tree.h delete mode 100755 gcc/cp/cvt.c delete mode 100755 gcc/cp/decl.c delete mode 100755 gcc/cp/decl.h delete mode 100755 gcc/cp/decl2.c delete mode 100755 gcc/cp/errfn.c delete mode 100755 gcc/cp/error.c delete mode 100755 gcc/cp/except.c delete mode 100755 gcc/cp/exception.cc delete mode 100755 gcc/cp/expr.c delete mode 100755 gcc/cp/friend.c delete mode 100755 gcc/cp/g++.1 delete mode 100755 gcc/cp/g++FAQ.texi delete mode 100755 gcc/cp/g++spec.c delete mode 100755 gcc/cp/gxx.gperf delete mode 100755 gcc/cp/gxxint.texi delete mode 100755 gcc/cp/hash.h delete mode 100755 gcc/cp/inc/exception delete mode 100755 gcc/cp/inc/new delete mode 100755 gcc/cp/inc/new.h delete mode 100755 gcc/cp/inc/typeinfo delete mode 100755 gcc/cp/init.c delete mode 100755 gcc/cp/input.c delete mode 100755 gcc/cp/lang-options.h delete mode 100755 gcc/cp/lang-specs.h delete mode 100755 gcc/cp/lex.c delete mode 100755 gcc/cp/lex.h delete mode 100755 gcc/cp/lex_990205.c delete mode 100755 gcc/cp/method.c delete mode 100755 gcc/cp/new.cc delete mode 100755 gcc/cp/new1.cc delete mode 100755 gcc/cp/new2.cc delete mode 100644 gcc/cp/parse.c delete mode 100644 gcc/cp/parse.h delete mode 100755 gcc/cp/parse.y delete mode 100755 gcc/cp/pt.c delete mode 100755 gcc/cp/ptree.c delete mode 100755 gcc/cp/repo.c delete mode 100755 gcc/cp/rtti.c delete mode 100755 gcc/cp/search.c delete mode 100755 gcc/cp/semantics.c delete mode 100755 gcc/cp/sig.c delete mode 100755 gcc/cp/spew.c delete mode 100755 gcc/cp/tinfo.cc delete mode 100755 gcc/cp/tinfo.h delete mode 100755 gcc/cp/tinfo2.cc delete mode 100755 gcc/cp/tree.c delete mode 100755 gcc/cp/typeck.c delete mode 100755 gcc/cp/typeck2.c delete mode 100755 gcc/cp/xref.c delete mode 100755 gcc/crtstuff.c delete mode 100755 gcc/f/BUGS delete mode 100755 gcc/f/ChangeLog delete mode 100755 gcc/f/ChangeLog.Cygnus delete mode 100755 gcc/f/INSTALL delete mode 100755 gcc/f/Make-lang.in delete mode 100755 gcc/f/Makefile.in delete mode 100755 gcc/f/NEWS delete mode 100755 gcc/f/README delete mode 100755 gcc/f/ansify.c delete mode 100755 gcc/f/assert.j delete mode 100755 gcc/f/bad.c delete mode 100755 gcc/f/bad.def delete mode 100755 gcc/f/bad.h delete mode 100755 gcc/f/bit.c delete mode 100755 gcc/f/bit.h delete mode 100755 gcc/f/bld-op.def delete mode 100755 gcc/f/bld.c delete mode 100755 gcc/f/bld.h delete mode 100755 gcc/f/bugs.texi delete mode 100755 gcc/f/bugs0.texi delete mode 100755 gcc/f/com-rt.def delete mode 100755 gcc/f/com.c delete mode 100755 gcc/f/com.h delete mode 100755 gcc/f/config-lang.in delete mode 100755 gcc/f/config.j delete mode 100755 gcc/f/convert.j delete mode 100755 gcc/f/data.c delete mode 100755 gcc/f/data.h delete mode 100755 gcc/f/equiv.c delete mode 100755 gcc/f/equiv.h delete mode 100755 gcc/f/expr.c delete mode 100755 gcc/f/expr.h delete mode 100755 gcc/f/fini.c delete mode 100755 gcc/f/flags.j delete mode 100755 gcc/f/g77.1 delete mode 100755 gcc/f/g77.texi delete mode 100755 gcc/f/g77install.texi delete mode 100755 gcc/f/g77spec.c delete mode 100755 gcc/f/glimits.j delete mode 100755 gcc/f/global.c delete mode 100755 gcc/f/global.h delete mode 100755 gcc/f/hconfig.j delete mode 100755 gcc/f/implic.c delete mode 100755 gcc/f/implic.h delete mode 100755 gcc/f/info-b.def delete mode 100755 gcc/f/info-k.def delete mode 100755 gcc/f/info-w.def delete mode 100755 gcc/f/info.c delete mode 100755 gcc/f/info.h delete mode 100755 gcc/f/input.j delete mode 100755 gcc/f/install0.texi delete mode 100755 gcc/f/intdoc.c delete mode 100755 gcc/f/intdoc.in delete mode 100755 gcc/f/intdoc.texi delete mode 100755 gcc/f/intrin.c delete mode 100755 gcc/f/intrin.def delete mode 100755 gcc/f/intrin.h delete mode 100755 gcc/f/lab.c delete mode 100755 gcc/f/lab.h delete mode 100755 gcc/f/lang-options.h delete mode 100755 gcc/f/lang-specs.h delete mode 100755 gcc/f/lex.c delete mode 100755 gcc/f/lex.h delete mode 100755 gcc/f/malloc.c delete mode 100755 gcc/f/malloc.h delete mode 100755 gcc/f/name.c delete mode 100755 gcc/f/name.h delete mode 100755 gcc/f/news.texi delete mode 100755 gcc/f/news0.texi delete mode 100755 gcc/f/output.j delete mode 100755 gcc/f/parse.c delete mode 100755 gcc/f/proj.c delete mode 100755 gcc/f/proj.h delete mode 100755 gcc/f/rtl.j delete mode 100755 gcc/f/src.c delete mode 100755 gcc/f/src.h delete mode 100755 gcc/f/st.c delete mode 100755 gcc/f/st.h delete mode 100755 gcc/f/sta.c delete mode 100755 gcc/f/sta.h delete mode 100755 gcc/f/stb.c delete mode 100755 gcc/f/stb.h delete mode 100755 gcc/f/stc.c delete mode 100755 gcc/f/stc.h delete mode 100755 gcc/f/std.c delete mode 100755 gcc/f/std.h delete mode 100755 gcc/f/ste.c delete mode 100755 gcc/f/ste.h delete mode 100755 gcc/f/storag.c delete mode 100755 gcc/f/storag.h delete mode 100755 gcc/f/stp.c delete mode 100755 gcc/f/stp.h delete mode 100755 gcc/f/str-1t.fin delete mode 100755 gcc/f/str-2t.fin delete mode 100755 gcc/f/str-fo.fin delete mode 100755 gcc/f/str-io.fin delete mode 100755 gcc/f/str-nq.fin delete mode 100755 gcc/f/str-op.fin delete mode 100755 gcc/f/str-ot.fin delete mode 100755 gcc/f/str.c delete mode 100755 gcc/f/str.h delete mode 100755 gcc/f/sts.c delete mode 100755 gcc/f/sts.h delete mode 100755 gcc/f/stt.c delete mode 100755 gcc/f/stt.h delete mode 100755 gcc/f/stu.c delete mode 100755 gcc/f/stu.h delete mode 100755 gcc/f/stv.c delete mode 100755 gcc/f/stv.h delete mode 100755 gcc/f/stw.c delete mode 100755 gcc/f/stw.h delete mode 100755 gcc/f/symbol.c delete mode 100755 gcc/f/symbol.def delete mode 100755 gcc/f/symbol.h delete mode 100755 gcc/f/system.j delete mode 100755 gcc/f/target.c delete mode 100755 gcc/f/target.h delete mode 100755 gcc/f/tconfig.j delete mode 100755 gcc/f/tm.j delete mode 100755 gcc/f/top.c delete mode 100755 gcc/f/top.h delete mode 100755 gcc/f/toplev.j delete mode 100755 gcc/f/tree.j delete mode 100755 gcc/f/type.c delete mode 100755 gcc/f/type.h delete mode 100755 gcc/f/version.c delete mode 100755 gcc/f/version.h delete mode 100755 gcc/f/where.c delete mode 100755 gcc/f/where.h delete mode 100755 gcc/frame.c delete mode 100755 gcc/frame.h delete mode 100755 gcc/gbl-ctors.h delete mode 100755 gcc/objc/Make-lang.in delete mode 100755 gcc/objc/Makefile.in delete mode 100755 gcc/objc/README delete mode 100755 gcc/objc/config-lang.in delete mode 100755 gcc/objc/lang-specs.h delete mode 100755 gcc/objc/objc-act.c delete mode 100755 gcc/objc/objc-act.h delete mode 100755 gcc/objc/objc-tree.def delete mode 100755 gcc/objc/objc.gperf delete mode 100755 gcc/tlink.c (limited to 'gcc') diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 37cbf5a..ec9e239 100755 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -360,10 +360,6 @@ EXTRA_PASSES =@extra_passes@ # Like EXTRA_PASSES, but these are used when linking. EXTRA_PROGRAMS = @extra_programs@ -# List of extra object files that should be compiled for this target machine. -# The rules for compiling them should be in the t-* file for the machine. -EXTRA_PARTS = @extra_parts@ - # List of extra object files that should be compiled and linked with # compiler proper (cc1, cc1obj, cc1plus). EXTRA_OBJS = @extra_objs@ @@ -376,13 +372,6 @@ EXTRA_GCC_OBJS =@host_extra_gcc_objs@ # Often this is edited directly by `configure'. EXTRA_HEADERS =@extra_headers_list@ -# Set this to `collect2' to enable use of collect2. -USE_COLLECT2 = @will_use_collect2@ -MAYBE_USE_COLLECT2 = @maybe_use_collect2@ -# It is convenient for configure to add the assignment at the beginning, -# so don't override it here. -USE_COLLECT2 = collect2$(exeext) - # List of extra C and assembler files to add to libgcc1.a. # Assembler files should have names ending in `.asm'. LIB1FUNCS_EXTRA = @@ -426,7 +415,7 @@ GCC_PASSES=xgcc$(exeext) cc1$(exeext) cpp$(exeext) $(EXTRA_PASSES) # List of things which should already be built whenever we try to use xgcc # to link anything. -GCC_PARTS=$(GCC_PASSES) $(LIBGCC) $(EXTRA_PROGRAMS) $(USE_COLLECT2) $(EXTRA_PARTS) +GCC_PARTS=$(GCC_PASSES) $(LIBGCC) $(EXTRA_PROGRAMS) # Directory to link to, when using the target `maketest'. DIR = ../gcc @@ -484,15 +473,6 @@ RUNTESTFLAGS = # Extra symbols for fixproto to define when parsing headers. FIXPROTO_DEFINES = -# Extra flags to use when compiling crt{begin,end}.o. -CRTSTUFF_T_CFLAGS = - -# Extra flags to use when compiling [m]crt0.o. -CRT0STUFF_T_CFLAGS = - -# "t" or nothing, for building multilibbed versions of, say, crtbegin.o. -T = - # End of variables for you to override. # Definition of `all' is here so that new rules inserted by sed @@ -671,17 +651,17 @@ STAGESTUFF = *$(objext) insn-flags.h insn-config.h insn-codes.h \ insn-attr.h insn-attrtab.c insn-opinit.c genrtl.c genrtl.h tree-check.h \ s-flags s-config s-codes s-mlib s-under\ s-output s-recog s-emit s-extract s-peep s-check \ - s-attr s-attrtab s-opinit s-crt s-crtS s-crt0 \ + s-attr s-attrtab s-opinit \ genemit$(build_exeext) genoutput$(build_exeext) genrecog$(build_exeext) \ genextract$(build_exeext) genflags$(build_exeext) gencodes$(build_exeext) \ genconfig$(build_exeext) genpeep$(build_exeext) genattrtab$(build_exeext) \ genattr$(build_exeext) genopinit$(build_exeext) gengenrtl$(build_exeext) \ gencheck$(build_exeext) \ xgcc$(exeext) cc1$(exeext) cpp$(exeext) $(EXTRA_PASSES) \ - $(EXTRA_PARTS) $(EXTRA_PROGRAMS) gcc-cross$(exeext) \ + $(EXTRA_PROGRAMS) gcc-cross$(exeext) \ $(CCCP)$(exeext) cc1obj$(exeext) enquire$(exeext) \ protoize$(exeext) unprotoize$(exeext) \ - specs collect2$(exeext) $(USE_COLLECT2) underscore.c \ + specs underscore.c \ gcov$(exeext) *.bp \ $(CYGNUS-LOCAL-range) *.range \ *.greg *.lreg *.combine *.flow *.cse *.jump *.rtl *.tree *.loop \ @@ -734,7 +714,6 @@ RTL_BASE_H = rtl.h rtl.def machmode.h machmode.def RTL_H = $(RTL_BASE_H) genrtl.h TREE_H = tree.h real.h tree.def machmode.h machmode.def tree-check.h BASIC_BLOCK_H = basic-block.h bitmap.h sbitmap.h -DEMANGLE_H = $(srcdir)/../include/demangle.h RECOG_H = recog.h EXPR_H = expr.h insn-codes.h REGS_H = regs.h varray.h machmode.h machmode.def @@ -819,17 +798,17 @@ all.internal: start.encap rest.encap # Note that we can compile enquire using the cross-compiler just built, # although we can't run it on this machine. all.cross: native gcc-cross specs stmp-headers $(STMP_FIXPROTO) $(LIBGCC) \ - $(LIBGCC1_TEST) $(EXTRA_PARTS) lang.all.cross + $(LIBGCC1_TEST) lang.all.cross # This is what to compile if making gcc with a cross-compiler. -all.build: native xgcc$(exeext) $(EXTRA_PARTS) lang.all.build +all.build: native xgcc$(exeext) lang.all.build # This is what must be made before installing GCC and converting libraries. start.encap: native xgcc$(exeext) specs $(LIBGCC1) xlimits.h lang.start.encap # These can't be made until after GCC can run. -rest.encap: stmp-headers $(STMP_FIXPROTO) $(LIBGCC) $(EXTRA_PARTS) lang.rest.encap +rest.encap: stmp-headers $(STMP_FIXPROTO) $(LIBGCC) lang.rest.encap # This is what is made with the host's compiler # whether making a cross compiler or not. native: config.status auto-host.h cpp$(exeext) $(LANGUAGES) \ - $(EXTRA_PASSES) $(EXTRA_PROGRAMS) $(USE_COLLECT2) + $(EXTRA_PASSES) $(EXTRA_PROGRAMS) # Define the names for selecting languages in LANGUAGES. C c: cc1$(exeext) @@ -1025,9 +1004,9 @@ libgcc2.ready: $(GCC_PASSES) $(LIBGCC2_DEPS) stmp-int-hdrs $(STMP_FIXPROTO) touch libgcc2.ready; \ fi -LIB2ADD = $(srcdir)/frame.c $(LIB2FUNCS_EXTRA) $(LANG_LIB2FUNCS) +LIB2ADD = $(LIB2FUNCS_EXTRA) $(LANG_LIB2FUNCS) libgcc2.a: libgcc2.c libgcc2.ready $(CONFIG_H) $(FPBIT) $(DPBIT) $(LIB2ADD) \ - machmode.h longlong.h frame.h gbl-ctors.h config.status + machmode.h longlong.h config.status # Actually build it in tmplibgcc2.a, then rename at end, # so that libgcc2.a itself remains nonexistent if compilation is aborted. -rm -f tmplibgcc2.a @@ -1159,8 +1138,7 @@ s-mlib: $(srcdir)/genmultilib Makefile # Build multiple copies of libgcc.a, one for each target switch. stmp-multilib: $(LIBGCC1) libgcc2.c libgcc2.ready $(CONFIG_H) \ - frame.h \ - $(LIB2ADD) machmode.h longlong.h gbl-ctors.h config.status + $(LIB2ADD) machmode.h longlong.h config.status for i in `$(GCC_FOR_TARGET) --print-multi-lib`; do \ dir=`echo $$i | sed -e 's/;.*$$//'`; \ flags=`echo $$i | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`; \ @@ -1236,47 +1214,6 @@ stmp-multilib-sub: else true; \ fi; done -# Compile two additional files that are linked with every program -# linked using GCC on systems using COFF or ELF, for the sake of C++ -# constructors. -$(T)crtbegin.o: crtstuff.c $(GCC_PASSES) $(CONFIG_H) \ - defaults.h frame.h gbl-ctors.h - $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -g0 \ - -finhibit-size-directive -fno-inline-functions -fno-exceptions $(CRTSTUFF_T_CFLAGS) \ - -c $(srcdir)/crtstuff.c -DCRT_BEGIN -o $(T)crtbegin$(objext) - -$(T)crtend.o: crtstuff.c $(GCC_PASSES) $(CONFIG_H) \ - defaults.h frame.h gbl-ctors.h - $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -g0 \ - -finhibit-size-directive -fno-inline-functions -fno-exceptions $(CRTSTUFF_T_CFLAGS) \ - -c $(srcdir)/crtstuff.c -DCRT_END -o $(T)crtend$(objext) - -# On some systems we also want to install versions of these files -# compiled using PIC for use in shared libraries. -crtbeginS.o crtendS.o: s-crtS ; @true - -s-crtS: crtstuff.c $(GCC_PASSES) $(CONFIG_H) \ - defaults.h frame.h gbl-ctors.h - $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(CRTSTUFF_T_CFLAGS_S) \ - -DCRT_BEGIN -DCRTSTUFFS_O -finhibit-size-directive -fno-inline-functions \ - -fno-exceptions -g0 -c $(srcdir)/crtstuff.c - mv crtstuff$(objext) crtbeginS$(objext) - $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(CRTSTUFF_T_CFLAGS_S) \ - -DCRT_END -DCRTSTUFFS_O -finhibit-size-directive -fno-inline-functions \ - -fno-exceptions -g0 -c $(srcdir)/crtstuff.c -o crtendS$(objext) - touch s-crtS - -# Compile the start modules crt0.o and mcrt0.o that are linked with every program -crt0.o: s-crt0 ; @true -mcrt0.o: s-crt0; @true - -s-crt0: $(CRT0_S) $(MCRT0_S) $(GCC_PASSES) $(CONFIG_H) - $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(CRT0STUFF_T_CFLAGS) \ - -o crt0.o -c $(CRT0_S) - $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(CRT0STUFF_T_CFLAGS) \ - -o mcrt0.o -c $(MCRT0_S) - touch s-crt0 -# # Compiling object files from source files. # Note that dependencies on obstack.h are not written @@ -1326,27 +1263,8 @@ graph.o: graph.c $(CONFIG_H) system.h toplev.h flags.h output.h $(RTL_H) \ hard-reg-set.h $(BASIC_BLOCK_H) sbitmap.o: sbitmap.c $(CONFIG_H) system.h $(RTL_H) flags.h $(BASIC_BLOCK_H) -collect2$(exeext): collect2.o tlink.o hash.o cplus-dem.o underscore.o \ - version.o choose-temp.o mkstemp.o $(LIBDEPS) -# Don't try modifying collect2 (aka ld) in place--it might be linking this. - -rm -f collect2$(exeext) - $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ collect2.o tlink.o hash.o \ - cplus-dem.o underscore.o version.o choose-temp.o mkstemp.o $(LIBS) - -collect2.o : collect2.c $(CONFIG_H) system.h gstab.h \ - $(srcdir)/../include/obstack.h $(DEMANGLE_H) collect2.h - $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \ - -DTARGET_MACHINE=\"$(target_alias)\" $(MAYBE_USE_COLLECT2) \ - -c `echo $(srcdir)/collect2.c | sed 's,^\./,,'` - -tlink.o: tlink.c $(DEMANGLE_H) hash.h $(CONFIG_H) system.h toplev.h collect2.h hash.o: hash.c hash.h system.h toplev.h -cplus-dem.o: $(srcdir)/../libiberty/cplus-dem.c $(DEMANGLE_H) - rm -f cplus-dem.c - $(LN_S) $(srcdir)/../libiberty/cplus-dem.c cplus-dem.c - $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) cplus-dem.c - pexecute.o: $(srcdir)/../libiberty/pexecute.c $(CONFIG_H) system.h rm -f pexecute.c $(LN_S) $(srcdir)/../libiberty/pexecute.c pexecute.c @@ -1450,7 +1368,7 @@ toplev.o : toplev.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) \ insn-codes.h insn-config.h $(RECOG_H) Makefile toplev.h dwarfout.h \ dwarf2out.h sdbout.h dbxout.h $(EXPR_H) \ $(lang_options_files) - $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(MAYBE_USE_COLLECT2) \ + $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \ -DTARGET_NAME=\"$(target_alias)\" \ -c `echo $(srcdir)/toplev.c | sed 's,^\./,,'` # END CYGNUS LOCAL @@ -2322,7 +2240,7 @@ mostlyclean: lang.mostlyclean -rm -f */*.sched2 */*.stack */*.regmove */*.gcse # Delete some files made during installation. -rm -f specs float.h-* enquire SYSCALLS.c.X SYSCALLS.c - -rm -f collect collect2 mips-tfile mips-tdump alloca.s + -rm -f collect mips-tfile mips-tdump alloca.s # Delete files generated for fixproto # CYGNUS LOCAL: binary installation -rm -rf fix-header xsys-protos.h deduced.h tmp-deduced.h \ @@ -2427,7 +2345,6 @@ realclean: maintainer-clean # END CYGNUS LOCAL # # Entry points `install' and `uninstall'. -# Also use `install-collect2' to install collect2 when the config files don't. # The semicolon is to prevent the install.sh -> install default rule # from doing anything. Having it run true helps avoid problems and @@ -2489,7 +2406,7 @@ installdirs: -if [ -d $(man1dir) ] ; then true ; else mkdir $(man1dir) ; chmod a+rx $(man1dir) ; fi # Install the compiler executables built during cross compilation. -install-common: native installdirs $(EXTRA_PARTS) lang.install-common +install-common: native installdirs lang.install-common for file in $(COMPILERS); do \ if [ -f $$file ] ; then \ rm -f $(libsubdir)/$$file; \ @@ -2497,19 +2414,12 @@ install-common: native installdirs $(EXTRA_PARTS) lang.install-common else true; \ fi; \ done - for file in $(EXTRA_PASSES) $(EXTRA_PROGRAMS) $(USE_COLLECT2) ..; do \ + for file in $(EXTRA_PASSES) $(EXTRA_PROGRAMS) ..; do \ if [ x"$$file" != x.. ]; then \ rm -f $(libsubdir)/$$file; \ $(INSTALL_PROGRAM) $$file $(libsubdir)/$$file; \ else true; fi; \ done - for file in $(EXTRA_PARTS) ..; do \ - if [ x"$$file" != x.. ]; then \ - rm -f $(libsubdir)/$$file; \ - $(INSTALL_DATA) $$file $(libsubdir)/$$file; \ - chmod a-x $(libsubdir)/$$file; \ - else true; fi; \ - done # Don't mess with specs if it doesn't exist yet. -if [ -f specs ] ; then \ rm -f $(libsubdir)/specs; \ @@ -2714,12 +2624,6 @@ install-assert-h: assert.h installdirs chmod a-x $(assertdir)/assert.h; \ fi -# Use this target to install the program `collect2' under the name `collect2'. -install-collect2: collect2 installdirs - $(INSTALL_PROGRAM) collect2$(exeext) $(libsubdir)/collect2$(exeext) -# Install the driver program as $(libsubdir)/gcc for collect2. - $(INSTALL_PROGRAM) xgcc$(exeext) $(libsubdir)/gcc$(exeext) - # Cancel installation by deleting the installed files. uninstall: lang.uninstall -rm -rf $(libsubdir) @@ -3055,7 +2959,6 @@ stage1-start: # dir will work properly. -if [ -f as$(exeext) ] ; then $(LN_S) ../as$(exeext) stage1 ; else true ; fi -if [ -f ld$(exeext) ] ; then $(LN_S) ../ld$(exeext) stage1 ; else true ; fi - -if [ -f collect-ld$(exeext) ] ; then $(LN_S) ../collect-ld$(exeext) stage1 ; else true ; fi -rm -f stage1/libgcc.a -cp libgcc.a stage1 -if $(RANLIB_TEST_FOR_TARGET) ; then \ @@ -3078,7 +2981,6 @@ stage2-start: # dir will work properly. -if [ -f as$(exeext) ] ; then $(LN_S) ../as$(exeext) stage2 ; else true ; fi -if [ -f ld$(exeext) ] ; then $(LN_S) ../ld$(exeext) stage2 ; else true ; fi - -if [ -f collect-ld ] ; then $(LN_S) ../collect-ld$(exeext) stage2 ; else true ; fi -rm -f stage2/libgcc.a -cp libgcc.a stage2 -if $(RANLIB_TEST_FOR_TARGET) ; then \ @@ -3101,7 +3003,6 @@ stage3-start: # dir will work properly. -if [ -f as$(exeext) ] ; then $(LN_S) ../as$(exeext) stage3 ; else true ; fi -if [ -f ld$(exeext) ] ; then $(LN_S) ../ld$(exeext) stage3 ; else true ; fi - -if [ -f collect-ld$(exeext) ] ; then $(LN_S) ../collect-ld$(exeext) stage3 ; else true ; fi -rm -f stage3/libgcc.a -cp libgcc.a stage3 -if $(RANLIB_TEST_FOR_TARGET) ; then \ @@ -3124,7 +3025,6 @@ stage4-start: # dir will work properly. -if [ -f as$(exeext) ] ; then $(LN_S) ../as$(exeext) stage4 ; else true ; fi -if [ -f ld$(exeext) ] ; then $(LN_S) ../ld$(exeext) stage4 ; else true ; fi - -if [ -f collect-ld$(exeext) ] ; then $(LN_S) ../collect-ld$(exeext) stage4 ; else true ; fi -rm -f stage4/libgcc.a -cp libgcc.a stage4 -if $(RANLIB_TEST_FOR_TARGET) ; then \ diff --git a/gcc/collect2.c b/gcc/collect2.c deleted file mode 100755 index 7060c2e..0000000 --- a/gcc/collect2.c +++ /dev/null @@ -1,3742 +0,0 @@ -/* Collect static initialization info into data structures that can be - traversed by C++ initialization and finalization routines. - Copyright (C) 1992, 93-97, 1998 Free Software Foundation, Inc. - Contributed by Chris Smith (csmith@convex.com). - Heavily modified by Michael Meissner (meissner@cygnus.com), - Per Bothner (bothner@cygnus.com), and John Gilmore (gnu@cygnus.com). - -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 -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - - -/* Build tables of static constructors and destructors and run ld. */ - -#include "config.h" -#include "system.h" -#include - -#ifdef vfork /* Autoconf may define this to fork for us. */ -# define VFORK_STRING "fork" -#else -# define VFORK_STRING "vfork" -#endif -#ifdef HAVE_VFORK_H -#include -#endif -#ifdef VMS -#define vfork() (decc$$alloc_vfork_blocks() >= 0 ? \ - lib$get_current_invo_context(decc$$get_vfork_jmpbuf()) : -1) -#endif /* VMS */ - -#define COLLECT - -#include "collect2.h" -#include "demangle.h" -#include "obstack.h" -#ifdef __CYGWIN__ -#include -#endif - -/* Obstack allocation and deallocation routines. */ -#define obstack_chunk_alloc xmalloc -#define obstack_chunk_free free - -extern char *make_temp_file PROTO ((char *)); - -/* On certain systems, we have code that works by scanning the object file - directly. But this code uses system-specific header files and library - functions, so turn it off in a cross-compiler. Likewise, the names of - the utilities are not correct for a cross-compiler; we have to hope that - cross-versions are in the proper directories. */ - -#ifdef CROSS_COMPILE -#undef SUNOS4_SHARED_LIBRARIES -#undef OBJECT_FORMAT_COFF -#undef OBJECT_FORMAT_ROSE -#undef MD_EXEC_PREFIX -#undef REAL_LD_FILE_NAME -#undef REAL_NM_FILE_NAME -#undef REAL_STRIP_FILE_NAME -#endif - -/* If we cannot use a special method, use the ordinary one: - run nm to find what symbols are present. - In a cross-compiler, this means you need a cross nm, - but that is not quite as unpleasant as special headers. */ - -#if !defined (OBJECT_FORMAT_COFF) && !defined (OBJECT_FORMAT_ROSE) -#define OBJECT_FORMAT_NONE -#endif - -#ifdef OBJECT_FORMAT_COFF - -#include -#include - -#ifdef UMAX -#include -#endif - -/* Many versions of ldfcn.h define these. */ -#ifdef FREAD -#undef FREAD -#undef FWRITE -#endif - -#include - -/* Some systems have an ISCOFF macro, but others do not. In some cases - the macro may be wrong. MY_ISCOFF is defined in tm.h files for machines - that either do not have an ISCOFF macro in /usr/include or for those - where it is wrong. */ - -#ifndef MY_ISCOFF -#define MY_ISCOFF(X) ISCOFF (X) -#endif - -#endif /* OBJECT_FORMAT_COFF */ - -#ifdef OBJECT_FORMAT_ROSE - -#ifdef _OSF_SOURCE -#define USE_MMAP -#endif - -#ifdef USE_MMAP -#include -#endif - -#include -#include -#include -#include -#include - -#endif /* OBJECT_FORMAT_ROSE */ - -#ifdef OBJECT_FORMAT_NONE - -/* Default flags to pass to nm. */ -#ifndef NM_FLAGS -#define NM_FLAGS "-n" -#endif - -#endif /* OBJECT_FORMAT_NONE */ - -/* Some systems use __main in a way incompatible with its use in gcc, in these - cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to - give the same symbol without quotes for an alternative entry point. You - must define both, or neither. */ -#ifndef NAME__MAIN -#define NAME__MAIN "__main" -#define SYMBOL__MAIN __main -#endif - -/* This must match tree.h. */ -#define DEFAULT_INIT_PRIORITY 65535 - -#if defined (LDD_SUFFIX) || SUNOS4_SHARED_LIBRARIES -#define SCAN_LIBRARIES -#endif - -#ifdef USE_COLLECT2 -int do_collecting = 1; -#else -int do_collecting = 0; -#endif - -/* Linked lists of constructor and destructor names. */ - -struct id -{ - struct id *next; - int sequence; - char name[1]; -}; - -struct head -{ - struct id *first; - struct id *last; - int number; -}; - -/* Enumeration giving which pass this is for scanning the program file. */ - -enum pass { - PASS_FIRST, /* without constructors */ - PASS_OBJ, /* individual objects */ - PASS_LIB, /* looking for shared libraries */ - PASS_SECOND /* with constructors linked in */ -}; - -extern char *version_string; - -int vflag; /* true if -v */ -static int rflag; /* true if -r */ -static int strip_flag; /* true if -s */ -#ifdef COLLECT_EXPORT_LIST -static int export_flag; /* true if -bE */ -static int aix64_flag; /* true if -b64 */ -#endif - -int debug; /* true if -debug */ - -static int shared_obj; /* true if -shared */ - -static char *c_file; /* .c for constructor/destructor list. */ -static char *o_file; /* .o for constructor/destructor list. */ -#ifdef COLLECT_EXPORT_LIST -static char *export_file; /* .x for AIX export list. */ -static char *import_file; /* .p for AIX import list. */ -#endif -char *ldout; /* File for ld errors. */ -static char *output_file; /* Output file for ld. */ -static char *nm_file_name; /* pathname of nm */ -#ifdef LDD_SUFFIX -static char *ldd_file_name; /* pathname of ldd (or equivalent) */ -#endif -static char *strip_file_name; /* pathname of strip */ -char *c_file_name; /* pathname of gcc */ -static char *initname, *fininame; /* names of init and fini funcs */ - -static struct head constructors; /* list of constructors found */ -static struct head destructors; /* list of destructors found */ -#ifdef COLLECT_EXPORT_LIST -static struct head exports; /* list of exported symbols */ -static struct head imports; /* list of imported symbols */ -static struct head undefined; /* list of undefined symbols */ -#endif -static struct head frame_tables; /* list of frame unwind info tables */ - -struct obstack temporary_obstack; -struct obstack permanent_obstack; -char * temporary_firstobj; - -/* Defined in the automatically-generated underscore.c. */ -extern int prepends_underscore; - -extern FILE *fdopen (); - -#ifndef GET_ENV_PATH_LIST -#define GET_ENV_PATH_LIST(VAR,NAME) do { (VAR) = getenv (NAME); } while (0) -#endif - -/* Structure to hold all the directories in which to search for files to - execute. */ - -struct prefix_list -{ - char *prefix; /* String to prepend to the path. */ - struct prefix_list *next; /* Next in linked list. */ -}; - -struct path_prefix -{ - struct prefix_list *plist; /* List of prefixes to try */ - int max_len; /* Max length of a prefix in PLIST */ - char *name; /* Name of this list (used in config stuff) */ -}; - -#ifdef COLLECT_EXPORT_LIST -/* Lists to keep libraries to be scanned for global constructors/destructors. */ -static struct head libs; /* list of libraries */ -static struct path_prefix cmdline_lib_dirs; /* directories specified with -L */ -static struct path_prefix libpath_lib_dirs; /* directories in LIBPATH */ -static struct path_prefix *libpaths[3] = {&cmdline_lib_dirs, - &libpath_lib_dirs, NULL}; -static char *libexts[3] = {"a", "so", NULL}; /* possible library extentions */ -#endif - -void error PVPROTO((const char *, ...)) ATTRIBUTE_PRINTF_1; -void fatal PVPROTO((const char *, ...)) - ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN; -void fatal_perror PVPROTO((const char *, ...)) - ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN; -static char *my_strerror PROTO((int)); -static const char *my_strsignal PROTO((int)); -static void handler PROTO((int)); -static int is_ctor_dtor PROTO((char *)); -static char *find_a_file PROTO((struct path_prefix *, char *)); -static void add_prefix PROTO((struct path_prefix *, char *)); -static void prefix_from_env PROTO((char *, struct path_prefix *)); -static void prefix_from_string PROTO((char *, struct path_prefix *)); -static void do_wait PROTO((char *)); -static void fork_execute PROTO((char *, char **)); -static void maybe_unlink PROTO((char *)); -static void add_to_list PROTO((struct head *, char *)); -static int extract_init_priority PROTO((char *)); -static void sort_ids PROTO((struct head *)); -static void write_list PROTO((FILE *, char *, struct id *)); -#ifdef COLLECT_EXPORT_LIST -static void dump_list PROTO((FILE *, char *, struct id *)); -#endif -#if 0 -static void dump_prefix_list PROTO((FILE *, char *, struct prefix_list *)); -#endif -static void write_list_with_asm PROTO((FILE *, char *, struct id *)); -static void write_c_file PROTO((FILE *, char *)); -static void scan_prog_file PROTO((char *, enum pass)); -#ifdef SCAN_LIBRARIES -static void scan_libraries PROTO((char *)); -#endif -#ifdef COLLECT_EXPORT_LIST -static int is_in_list PROTO((char *, struct id *)); -static void write_export_file PROTO((FILE *)); -static void write_import_file PROTO((FILE *)); -static char *resolve_lib_name PROTO((char *)); -static int use_import_list PROTO((char *)); -static int ignore_library PROTO((char *)); -#endif - -#ifdef NO_DUP2 -int -dup2 (oldfd, newfd) - int oldfd; - int newfd; -{ - int fdtmp[256]; - int fdx = 0; - int fd; - - if (oldfd == newfd) - return oldfd; - close (newfd); - while ((fd = dup (oldfd)) != newfd && fd >= 0) /* good enough for low fd's */ - fdtmp[fdx++] = fd; - while (fdx > 0) - close (fdtmp[--fdx]); - - return fd; -} -#endif - -static char * -my_strerror (e) - int e; -{ - -#ifdef HAVE_STRERROR - return strerror (e); - -#else - - static char buffer[30]; - if (!e) - return ""; - - if (e > 0 && e < sys_nerr) - return sys_errlist[e]; - - sprintf (buffer, "Unknown error %d", e); - return buffer; -#endif -} - -static const char * -my_strsignal (s) - int s; -{ -#ifdef HAVE_STRSIGNAL - return strsignal (s); -#else - if (s >= 0 && s < NSIG) - { -# ifdef NO_SYS_SIGLIST - static char buffer[30]; - - sprintf (buffer, "Unknown signal %d", s); - return buffer; -# else - return sys_siglist[s]; -# endif - } - else - return NULL; -#endif /* HAVE_STRSIGNAL */ -} - -/* Delete tempfiles and exit function. */ - -void -collect_exit (status) - int status; -{ - if (c_file != 0 && c_file[0]) - maybe_unlink (c_file); - - if (o_file != 0 && o_file[0]) - maybe_unlink (o_file); - -#ifdef COLLECT_EXPORT_LIST - if (export_file != 0 && export_file[0]) - maybe_unlink (export_file); - - if (import_file != 0 && import_file[0]) - maybe_unlink (import_file); -#endif - - if (ldout != 0 && ldout[0]) - { - dump_file (ldout); - maybe_unlink (ldout); - } - - if (status != 0 && output_file != 0 && output_file[0]) - maybe_unlink (output_file); - - exit (status); -} - - -/* Die when sys call fails. */ - -void -fatal_perror VPROTO((const char * string, ...)) -{ -#ifndef ANSI_PROTOTYPES - const char *string; -#endif - int e = errno; - va_list ap; - - VA_START (ap, string); - -#ifndef ANSI_PROTOTYPES - string = va_arg (ap, const char *); -#endif - - fprintf (stderr, "collect2: "); - vfprintf (stderr, string, ap); - fprintf (stderr, ": %s\n", my_strerror (e)); - va_end (ap); - - collect_exit (FATAL_EXIT_CODE); -} - -/* Just die. */ - -void -fatal VPROTO((const char * string, ...)) -{ -#ifndef ANSI_PROTOTYPES - const char *string; -#endif - va_list ap; - - VA_START (ap, string); - -#ifndef ANSI_PROTOTYPES - string = va_arg (ap, const char *); -#endif - - fprintf (stderr, "collect2: "); - vfprintf (stderr, string, ap); - fprintf (stderr, "\n"); - va_end (ap); - - collect_exit (FATAL_EXIT_CODE); -} - -/* Write error message. */ - -void -error VPROTO((const char * string, ...)) -{ -#ifndef ANSI_PROTOTYPES - const char * string; -#endif - va_list ap; - - VA_START (ap, string); - -#ifndef ANSI_PROTOTYPES - string = va_arg (ap, const char *); -#endif - - fprintf (stderr, "collect2: "); - vfprintf (stderr, string, ap); - fprintf (stderr, "\n"); - va_end(ap); -} - -/* In case obstack is linked in, and abort is defined to fancy_abort, - provide a default entry. */ - -void -fancy_abort () -{ - fatal ("internal error"); -} - - -static void -handler (signo) - int signo; -{ - if (c_file != 0 && c_file[0]) - maybe_unlink (c_file); - - if (o_file != 0 && o_file[0]) - maybe_unlink (o_file); - - if (ldout != 0 && ldout[0]) - maybe_unlink (ldout); - -#ifdef COLLECT_EXPORT_LIST - if (export_file != 0 && export_file[0]) - maybe_unlink (export_file); - - if (import_file != 0 && import_file[0]) - maybe_unlink (import_file); -#endif - - signal (signo, SIG_DFL); - kill (getpid (), signo); -} - - -PTR -xcalloc (size1, size2) - size_t size1, size2; -{ - PTR ptr = (PTR) calloc (size1, size2); - if (!ptr) - fatal ("out of memory"); - return ptr; -} - -PTR -xmalloc (size) - size_t size; -{ - PTR ptr = (PTR) malloc (size); - if (!ptr) - fatal ("out of memory"); - return ptr; -} - -PTR -xrealloc (old, size) - PTR old; - size_t size; -{ - register PTR ptr; - if (ptr) - ptr = (PTR) realloc (old, size); - else - ptr = (PTR) malloc (size); - if (ptr == 0) - fatal ("virtual memory exhausted"); - return ptr; -} - -int -file_exists (name) - char *name; -{ - return access (name, R_OK) == 0; -} - -/* Make a copy of a string INPUT with size SIZE. */ - -char * -savestring (input, size) - char *input; - int size; -{ - char *output = (char *) xmalloc (size + 1); - bcopy (input, output, size); - output[size] = 0; - return output; -} - -/* Parse a reasonable subset of shell quoting syntax. */ - -static char * -extract_string (pp) - char **pp; -{ - char *p = *pp; - int backquote = 0; - int inside = 0; - - for (;;) - { - char c = *p; - if (c == '\0') - break; - ++p; - if (backquote) - obstack_1grow (&temporary_obstack, c); - else if (! inside && c == ' ') - break; - else if (! inside && c == '\\') - backquote = 1; - else if (c == '\'') - inside = !inside; - else - obstack_1grow (&temporary_obstack, c); - } - - obstack_1grow (&temporary_obstack, '\0'); - *pp = p; - return obstack_finish (&temporary_obstack); -} - -void -dump_file (name) - char *name; -{ - FILE *stream = fopen (name, "r"); - int no_demangle = !! getenv ("COLLECT_NO_DEMANGLE"); - - if (stream == 0) - return; - while (1) - { - int c; - while (c = getc (stream), - c != EOF && (ISALNUM (c) || c == '_' || c == '$' || c == '.')) - obstack_1grow (&temporary_obstack, c); - if (obstack_object_size (&temporary_obstack) > 0) - { - char *word, *p, *result; - obstack_1grow (&temporary_obstack, '\0'); - word = obstack_finish (&temporary_obstack); - - if (*word == '.') - ++word, putc ('.', stderr); - p = word; - if (*p == '_' && prepends_underscore) - ++p; - - if (no_demangle) - result = 0; - else - result = cplus_demangle (p, DMGL_PARAMS | DMGL_ANSI); - - if (result) - { - int diff; - fputs (result, stderr); - - diff = strlen (word) - strlen (result); - while (diff > 0) - --diff, putc (' ', stderr); - while (diff < 0 && c == ' ') - ++diff, c = getc (stream); - - free (result); - } - else - fputs (word, stderr); - - fflush (stderr); - obstack_free (&temporary_obstack, temporary_firstobj); - } - if (c == EOF) - break; - putc (c, stderr); - } - fclose (stream); -} - -/* Decide whether the given symbol is: - a constructor (1), a destructor (2), or neither (0). */ - -static int -is_ctor_dtor (s) - char *s; -{ - struct names { char *name; int len; int ret; int two_underscores; }; - - register struct names *p; - register int ch; - register char *orig_s = s; - - static struct names special[] = { -#ifdef NO_DOLLAR_IN_LABEL -#ifdef NO_DOT_IN_LABEL - { "GLOBAL__I_", sizeof ("GLOBAL__I_")-1, 1, 0 }, - { "GLOBAL__D_", sizeof ("GLOBAL__D_")-1, 2, 0 }, - { "GLOBAL__F_", sizeof ("GLOBAL__F_")-1, 5, 0 }, -#else - { "GLOBAL_.I.", sizeof ("GLOBAL_.I.")-1, 1, 0 }, - { "GLOBAL_.D.", sizeof ("GLOBAL_.D.")-1, 2, 0 }, - { "GLOBAL_.F.", sizeof ("GLOBAL_.F.")-1, 5, 0 }, -#endif -#else - { "GLOBAL_$I$", sizeof ("GLOBAL_$I$")-1, 1, 0 }, - { "GLOBAL_$D$", sizeof ("GLOBAL_$D$")-1, 2, 0 }, - { "GLOBAL_$F$", sizeof ("GLOBAL_$F$")-1, 5, 0 }, -#endif - { "GLOBAL__FI_", sizeof ("GLOBAL__FI_")-1, 3, 0 }, - { "GLOBAL__FD_", sizeof ("GLOBAL__FD_")-1, 4, 0 }, -#ifdef CFRONT_LOSSAGE /* Do not collect cfront initialization functions. - cfront has its own linker procedure to collect them; - if collect2 gets them too, they get collected twice - when the cfront procedure is run and the compiler used - for linking happens to be GCC. */ - { "sti__", sizeof ("sti__")-1, 1, 1 }, - { "std__", sizeof ("std__")-1, 2, 1 }, -#endif /* CFRONT_LOSSAGE */ - { NULL, 0, 0, 0 } - }; - - while ((ch = *s) == '_') - ++s; - - if (s == orig_s) - return 0; - - for (p = &special[0]; p->len > 0; p++) - { - if (ch == p->name[0] - && (!p->two_underscores || ((s - orig_s) >= 2)) - && strncmp(s, p->name, p->len) == 0) - { - return p->ret; - } - } - return 0; -} - -/* Routine to add variables to the environment. */ - -#ifndef HAVE_PUTENV - -int -putenv (str) - char *str; -{ -#ifndef VMS /* nor about VMS */ - - extern char **environ; - char **old_environ = environ; - char **envp; - int num_envs = 0; - int name_len = 1; - char *p = str; - int ch; - - while ((ch = *p++) != '\0' && ch != '=') - name_len++; - - if (!ch) - abort (); - - /* Search for replacing an existing environment variable, and - count the number of total environment variables. */ - for (envp = old_environ; *envp; envp++) - { - num_envs++; - if (!strncmp (str, *envp, name_len)) - { - *envp = str; - return 0; - } - } - - /* Add a new environment variable */ - environ = (char **) xmalloc (sizeof (char *) * (num_envs+2)); - *environ = str; - bcopy ((char *) old_environ, (char *) (environ + 1), - sizeof (char *) * (num_envs+1)); - - return 0; -#endif /* VMS */ -} - -#endif /* HAVE_PUTENV */ - -/* By default, colon separates directories in a path. */ -#ifndef PATH_SEPARATOR -#define PATH_SEPARATOR ':' -#endif - -/* We maintain two prefix lists: one from COMPILER_PATH environment variable - and one from the PATH variable. */ - -static struct path_prefix cpath, path; - -#ifdef CROSS_COMPILE -/* This is the name of the target machine. We use it to form the name - of the files to execute. */ - -static char *target_machine = TARGET_MACHINE; -#endif - -/* Search for NAME using prefix list PPREFIX. We only look for executable - files. - - Return 0 if not found, otherwise return its name, allocated with malloc. */ - -static char * -find_a_file (pprefix, name) - struct path_prefix *pprefix; - char *name; -{ - char *temp; - struct prefix_list *pl; - int len = pprefix->max_len + strlen (name) + 1; - - if (debug) - fprintf (stderr, "Looking for '%s'\n", name); - -#ifdef EXECUTABLE_SUFFIX - len += strlen (EXECUTABLE_SUFFIX); -#endif - - temp = xmalloc (len); - - /* Determine the filename to execute (special case for absolute paths). */ - - if (*name == '/' -#ifdef DIR_SEPARATOR - || (DIR_SEPARATOR == '\\' && name[1] == ':' - && (name[2] == DIR_SEPARATOR || name[2] == '/')) -#endif - ) - { - if (access (name, X_OK) == 0) - { - strcpy (temp, name); - - if (debug) - fprintf (stderr, " - found: absolute path\n"); - - return temp; - } - - if (debug) - fprintf (stderr, " - failed to locate using absolute path\n"); - } - else - for (pl = pprefix->plist; pl; pl = pl->next) - { - strcpy (temp, pl->prefix); - strcat (temp, name); - - if (access (temp, X_OK) == 0) - return temp; - -#ifdef EXECUTABLE_SUFFIX - /* Some systems have a suffix for executable files. - So try appending that. */ - strcat (temp, EXECUTABLE_SUFFIX); - - if (access (temp, X_OK) == 0) - return temp; -#endif - } - - if (debug && pprefix->plist == NULL) - fprintf (stderr, " - failed: no entries in prefix list\n"); - - free (temp); - return 0; -} - -/* Add an entry for PREFIX to prefix list PPREFIX. */ - -static void -add_prefix (pprefix, prefix) - struct path_prefix *pprefix; - char *prefix; -{ - struct prefix_list *pl, **prev; - int len; - - if (pprefix->plist) - { - for (pl = pprefix->plist; pl->next; pl = pl->next) - ; - prev = &pl->next; - } - else - prev = &pprefix->plist; - - /* Keep track of the longest prefix */ - - len = strlen (prefix); - if (len > pprefix->max_len) - pprefix->max_len = len; - - pl = (struct prefix_list *) xmalloc (sizeof (struct prefix_list)); - pl->prefix = savestring (prefix, len); - - if (*prev) - pl->next = *prev; - else - pl->next = (struct prefix_list *) 0; - *prev = pl; -} - -/* Take the value of the environment variable ENV, break it into a path, and - add of the entries to PPREFIX. */ - -static void -prefix_from_env (env, pprefix) - char *env; - struct path_prefix *pprefix; -{ - char *p; - GET_ENV_PATH_LIST (p, env); - - if (p) - prefix_from_string (p, pprefix); -} - -static void -prefix_from_string (p, pprefix) - char *p; - struct path_prefix *pprefix; -{ - char *startp, *endp; - char *nstore = (char *) xmalloc (strlen (p) + 3); - - if (debug) - fprintf (stderr, "Convert string '%s' into prefixes, separator = '%c'\n", p, PATH_SEPARATOR); - - startp = endp = p; - while (1) - { - if (*endp == PATH_SEPARATOR || *endp == 0) - { - strncpy (nstore, startp, endp-startp); - if (endp == startp) - { - strcpy (nstore, "./"); - } - else if (endp[-1] != '/') - { - nstore[endp-startp] = '/'; - nstore[endp-startp+1] = 0; - } - else - nstore[endp-startp] = 0; - - if (debug) - fprintf (stderr, " - add prefix: %s\n", nstore); - - add_prefix (pprefix, nstore); - if (*endp == 0) - break; - endp = startp = endp + 1; - } - else - endp++; - } -} - -/* Main program. */ - -int -main (argc, argv) - int argc; - char *argv[]; -{ - char *ld_suffix = "ld"; - char *full_ld_suffix = ld_suffix; - char *real_ld_suffix = "real-ld"; - char *collect_ld_suffix = "collect-ld"; - char *nm_suffix = "nm"; - char *full_nm_suffix = nm_suffix; - char *gnm_suffix = "gnm"; - char *full_gnm_suffix = gnm_suffix; -#ifdef LDD_SUFFIX - char *ldd_suffix = LDD_SUFFIX; - char *full_ldd_suffix = ldd_suffix; -#endif - char *strip_suffix = "strip"; - char *full_strip_suffix = strip_suffix; - char *gstrip_suffix = "gstrip"; - char *full_gstrip_suffix = gstrip_suffix; - char *arg; - FILE *outf; -#ifdef COLLECT_EXPORT_LIST - FILE *exportf; - FILE *importf; -#endif - char *ld_file_name; - char *p; - char **c_argv; - char **c_ptr; - char **ld1_argv = (char **) xcalloc (sizeof (char *), argc+3); - char **ld1 = ld1_argv; - char **ld2_argv = (char **) xcalloc (sizeof (char *), argc+6); - char **ld2 = ld2_argv; - char **object_lst = (char **) xcalloc (sizeof (char *), argc); - char **object = object_lst; - int first_file; - int num_c_args = argc+9; - -#ifdef DEBUG - debug = 1; -#endif - - /* Parse command line early for instances of -debug. This allows - the debug flag to be set before functions like find_a_file() - are called. */ - { - int i; - - for (i = 1; argv[i] != NULL; i ++) - if (! strcmp (argv[i], "-debug")) - debug = 1; - vflag = debug; - } - -#ifndef DEFAULT_A_OUT_NAME - output_file = "a.out"; -#else - output_file = DEFAULT_A_OUT_NAME; -#endif - - obstack_begin (&temporary_obstack, 0); - obstack_begin (&permanent_obstack, 0); - temporary_firstobj = (char *) obstack_alloc (&temporary_obstack, 0); - - current_demangling_style = gnu_demangling; - p = getenv ("COLLECT_GCC_OPTIONS"); - while (p && *p) - { - char *q = extract_string (&p); - if (*q == '-' && (q[1] == 'm' || q[1] == 'f')) - num_c_args++; - } - obstack_free (&temporary_obstack, temporary_firstobj); - ++num_c_args; - - c_ptr = c_argv = (char **) xcalloc (sizeof (char *), num_c_args); - - if (argc < 2) - fatal ("no arguments"); - -#ifdef SIGQUIT - if (signal (SIGQUIT, SIG_IGN) != SIG_IGN) - signal (SIGQUIT, handler); -#endif - if (signal (SIGINT, SIG_IGN) != SIG_IGN) - signal (SIGINT, handler); -#ifdef SIGALRM - if (signal (SIGALRM, SIG_IGN) != SIG_IGN) - signal (SIGALRM, handler); -#endif -#ifdef SIGHUP - if (signal (SIGHUP, SIG_IGN) != SIG_IGN) - signal (SIGHUP, handler); -#endif - if (signal (SIGSEGV, SIG_IGN) != SIG_IGN) - signal (SIGSEGV, handler); -#ifdef SIGBUS - if (signal (SIGBUS, SIG_IGN) != SIG_IGN) - signal (SIGBUS, handler); -#endif - - /* Extract COMPILER_PATH and PATH into our prefix list. */ - prefix_from_env ("COMPILER_PATH", &cpath); - prefix_from_env ("PATH", &path); - -#ifdef CROSS_COMPILE - /* If we look for a program in the compiler directories, we just use - the short name, since these directories are already system-specific. - But it we look for a program in the system directories, we need to - qualify the program name with the target machine. */ - - full_ld_suffix - = xcalloc (strlen (ld_suffix) + strlen (target_machine) + 2, 1); - strcpy (full_ld_suffix, target_machine); - strcat (full_ld_suffix, "-"); - strcat (full_ld_suffix, ld_suffix); - -#if 0 - full_gld_suffix - = xcalloc (strlen (gld_suffix) + strlen (target_machine) + 2, 1); - strcpy (full_gld_suffix, target_machine); - strcat (full_gld_suffix, "-"); - strcat (full_gld_suffix, gld_suffix); -#endif - - full_nm_suffix - = xcalloc (strlen (nm_suffix) + strlen (target_machine) + 2, 1); - strcpy (full_nm_suffix, target_machine); - strcat (full_nm_suffix, "-"); - strcat (full_nm_suffix, nm_suffix); - - full_gnm_suffix - = xcalloc (strlen (gnm_suffix) + strlen (target_machine) + 2, 1); - strcpy (full_gnm_suffix, target_machine); - strcat (full_gnm_suffix, "-"); - strcat (full_gnm_suffix, gnm_suffix); - -#ifdef LDD_SUFFIX - full_ldd_suffix - = xcalloc (strlen (ldd_suffix) + strlen (target_machine) + 2, 1); - strcpy (full_ldd_suffix, target_machine); - strcat (full_ldd_suffix, "-"); - strcat (full_ldd_suffix, ldd_suffix); -#endif - - full_strip_suffix - = xcalloc (strlen (strip_suffix) + strlen (target_machine) + 2, 1); - strcpy (full_strip_suffix, target_machine); - strcat (full_strip_suffix, "-"); - strcat (full_strip_suffix, strip_suffix); - - full_gstrip_suffix - = xcalloc (strlen (gstrip_suffix) + strlen (target_machine) + 2, 1); - strcpy (full_gstrip_suffix, target_machine); - strcat (full_gstrip_suffix, "-"); - strcat (full_gstrip_suffix, gstrip_suffix); -#endif /* CROSS_COMPILE */ - - /* Try to discover a valid linker/nm/strip to use. */ - - /* Maybe we know the right file to use (if not cross). */ - ld_file_name = 0; -#ifdef DEFAULT_LINKER - if (access (DEFAULT_LINKER, X_OK) == 0) - ld_file_name = DEFAULT_LINKER; - if (ld_file_name == 0) -#endif -#ifdef REAL_LD_FILE_NAME - ld_file_name = find_a_file (&path, REAL_LD_FILE_NAME); - if (ld_file_name == 0) -#endif - /* Search the (target-specific) compiler dirs for ld'. */ - ld_file_name = find_a_file (&cpath, real_ld_suffix); - /* Likewise for `collect-ld'. */ - if (ld_file_name == 0) - ld_file_name = find_a_file (&cpath, collect_ld_suffix); - /* Search the compiler directories for `ld'. We have protection against - recursive calls in find_a_file. */ - if (ld_file_name == 0) - ld_file_name = find_a_file (&cpath, ld_suffix); - /* Search the ordinary system bin directories - for `ld' (if native linking) or `TARGET-ld' (if cross). */ - if (ld_file_name == 0) - ld_file_name = find_a_file (&path, full_ld_suffix); - -#ifdef REAL_NM_FILE_NAME - nm_file_name = find_a_file (&path, REAL_NM_FILE_NAME); - if (nm_file_name == 0) -#endif - nm_file_name = find_a_file (&cpath, gnm_suffix); - if (nm_file_name == 0) - nm_file_name = find_a_file (&path, full_gnm_suffix); - if (nm_file_name == 0) - nm_file_name = find_a_file (&cpath, nm_suffix); - if (nm_file_name == 0) - nm_file_name = find_a_file (&path, full_nm_suffix); - -#ifdef LDD_SUFFIX - ldd_file_name = find_a_file (&cpath, ldd_suffix); - if (ldd_file_name == 0) - ldd_file_name = find_a_file (&path, full_ldd_suffix); -#endif - -#ifdef REAL_STRIP_FILE_NAME - strip_file_name = find_a_file (&path, REAL_STRIP_FILE_NAME); - if (strip_file_name == 0) -#endif - strip_file_name = find_a_file (&cpath, gstrip_suffix); - if (strip_file_name == 0) - strip_file_name = find_a_file (&path, full_gstrip_suffix); - if (strip_file_name == 0) - strip_file_name = find_a_file (&cpath, strip_suffix); - if (strip_file_name == 0) - strip_file_name = find_a_file (&path, full_strip_suffix); - - /* Determine the full path name of the C compiler to use. */ - c_file_name = getenv ("COLLECT_GCC"); - if (c_file_name == 0) - { -#ifdef CROSS_COMPILE - c_file_name = xcalloc (sizeof ("gcc-") + strlen (target_machine) + 1, 1); - strcpy (c_file_name, target_machine); - strcat (c_file_name, "-gcc"); -#else - c_file_name = "gcc"; -#endif - } - - p = find_a_file (&cpath, c_file_name); - - /* Here it should be safe to use the system search path since we should have - already qualified the name of the compiler when it is needed. */ - if (p == 0) - p = find_a_file (&path, c_file_name); - - if (p) - c_file_name = p; - - *ld1++ = *ld2++ = ld_file_name; - - /* Make temp file names. */ - c_file = make_temp_file (".c"); - o_file = make_temp_file (".o"); -#ifdef COLLECT_EXPORT_LIST - export_file = make_temp_file (".x"); - import_file = make_temp_file (".p"); -#endif - ldout = make_temp_file (".ld"); - *c_ptr++ = c_file_name; - *c_ptr++ = "-x"; - *c_ptr++ = "c"; - *c_ptr++ = "-c"; - *c_ptr++ = "-o"; - *c_ptr++ = o_file; - -#ifdef COLLECT_EXPORT_LIST - /* Generate a list of directories from LIBPATH. */ - prefix_from_env ("LIBPATH", &libpath_lib_dirs); - /* Add to this list also two standard directories where - AIX loader always searches for libraries. */ - add_prefix (&libpath_lib_dirs, "/lib"); - add_prefix (&libpath_lib_dirs, "/usr/lib"); -#endif - - /* Get any options that the upper GCC wants to pass to the sub-GCC. - - AIX support needs to know if -shared has been specified before - parsing commandline arguments. */ - - p = getenv ("COLLECT_GCC_OPTIONS"); - while (p && *p) - { - char *q = extract_string (&p); - if (*q == '-' && (q[1] == 'm' || q[1] == 'f')) - *c_ptr++ = obstack_copy0 (&permanent_obstack, q, strlen (q)); - if (strcmp (q, "-EL") == 0 || strcmp (q, "-EB") == 0) - *c_ptr++ = obstack_copy0 (&permanent_obstack, q, strlen (q)); - if (strncmp (q, "-shared", sizeof ("-shared") - 1) == 0) - shared_obj = 1; - } - obstack_free (&temporary_obstack, temporary_firstobj); - *c_ptr++ = "-fno-exceptions"; - - /* !!! When GCC calls collect2, - it does not know whether it is calling collect2 or ld. - So collect2 cannot meaningfully understand any options - except those ld understands. - If you propose to make GCC pass some other option, - just imagine what will happen if ld is really ld!!! */ - - /* Parse arguments. Remember output file spec, pass the rest to ld. */ - /* After the first file, put in the c++ rt0. */ - - first_file = 1; - while ((arg = *++argv) != (char *) 0) - { - *ld1++ = *ld2++ = arg; - - if (arg[0] == '-') - { - switch (arg[1]) - { -#ifdef COLLECT_EXPORT_LIST - /* We want to disable automatic exports on AIX when user - explicitly puts an export list in command line */ - case 'b': - if (arg[2] == 'E' || strncmp (&arg[2], "export", 6) == 0) - export_flag = 1; - else if (arg[2] == '6' && arg[3] == '4') - aix64_flag = 1; - break; -#endif - - case 'd': - if (!strcmp (arg, "-debug")) - { - /* Already parsed. */ - ld1--; - ld2--; - } - break; - - case 'l': - if (first_file) - { - /* place o_file BEFORE this argument! */ - first_file = 0; - ld2--; - *ld2++ = o_file; - *ld2++ = arg; - } -#ifdef COLLECT_EXPORT_LIST - { - /* Resolving full library name. */ - char *s = resolve_lib_name (arg+2); - - /* If we will use an import list for this library, - we should exclude it from ld args. */ - if (use_import_list (s)) - { - ld1--; - ld2--; - } - - /* Saving a full library name. */ - add_to_list (&libs, s); - } -#endif - break; - -#ifdef COLLECT_EXPORT_LIST - /* Saving directories where to search for libraries. */ - case 'L': - add_prefix (&cmdline_lib_dirs, arg+2); - break; -#endif - - case 'o': - if (arg[2] == '\0') - output_file = *ld1++ = *ld2++ = *++argv; - else - output_file = &arg[2]; - break; - - case 'r': - if (arg[2] == '\0') - rflag = 1; - break; - - case 's': - if (arg[2] == '\0' && do_collecting) - { - /* We must strip after the nm run, otherwise C++ linking - will not work. Thus we strip in the second ld run, or - else with strip if there is no second ld run. */ - strip_flag = 1; - ld1--; - } - break; - - case 'v': - if (arg[2] == '\0') - vflag = 1; - break; - } - } - else if ((p = rindex (arg, '.')) != (char *) 0 - && (strcmp (p, ".o") == 0 || strcmp (p, ".a") == 0 - || strcmp (p, ".so") == 0)) - { - if (first_file) - { - first_file = 0; - if (p[1] == 'o') - *ld2++ = o_file; - else - { - /* place o_file BEFORE this argument! */ - ld2--; - *ld2++ = o_file; - *ld2++ = arg; - } - } - if (p[1] == 'o') - *object++ = arg; -#ifdef COLLECT_EXPORT_LIST - /* libraries can be specified directly, i.e. without -l flag. */ - else - { - /* If we will use an import list for this library, - we should exclude it from ld args. */ - if (use_import_list (arg)) - { - ld1--; - ld2--; - } - - /* Saving a full library name. */ - add_to_list (&libs, arg); - } -#endif - } - } - -#ifdef COLLECT_EXPORT_LIST - /* This is added only for debugging purposes. */ - if (debug) - { - fprintf (stderr, "List of libraries:\n"); - dump_list (stderr, "\t", libs.first); - } - - /* The AIX linker will discard static constructors in object files if - nothing else in the file is referenced, so look at them first. */ - { - char **export_object_lst = object_lst; - while (export_object_lst < object) - scan_prog_file (*export_object_lst++, PASS_OBJ); - } - { - struct id *list = libs.first; - for (; list; list = list->next) - scan_prog_file (list->name, PASS_FIRST); - } - { - char *buf1 = alloca (strlen (export_file) + 5); - char *buf2 = alloca (strlen (import_file) + 5); - sprintf (buf1, "-bE:%s", export_file); - sprintf (buf2, "-bI:%s", import_file); - *ld1++ = buf1; - *ld2++ = buf1; - *ld1++ = buf2; - *ld2++ = buf2; - exportf = fopen (export_file, "w"); - if (exportf == (FILE *) 0) - fatal_perror ("%s", export_file); - write_export_file (exportf); - if (fclose (exportf)) - fatal_perror ("closing %s", export_file); - importf = fopen (import_file, "w"); - if (importf == (FILE *) 0) - fatal_perror ("%s", import_file); - write_import_file (importf); - if (fclose (importf)) - fatal_perror ("closing %s", import_file); - } -#endif - - *c_ptr++ = c_file; - *object = *c_ptr = *ld1 = (char *) 0; - - if (vflag) - { - fprintf (stderr, "collect2 version %s", version_string); -#ifdef TARGET_VERSION - TARGET_VERSION; -#endif - fprintf (stderr, "\n"); - } - - if (debug) - { - char *ptr; - fprintf (stderr, "ld_file_name = %s\n", - (ld_file_name ? ld_file_name : "not found")); - fprintf (stderr, "c_file_name = %s\n", - (c_file_name ? c_file_name : "not found")); - fprintf (stderr, "nm_file_name = %s\n", - (nm_file_name ? nm_file_name : "not found")); -#ifdef LDD_SUFFIX - fprintf (stderr, "ldd_file_name = %s\n", - (ldd_file_name ? ldd_file_name : "not found")); -#endif - fprintf (stderr, "strip_file_name = %s\n", - (strip_file_name ? strip_file_name : "not found")); - fprintf (stderr, "c_file = %s\n", - (c_file ? c_file : "not found")); - fprintf (stderr, "o_file = %s\n", - (o_file ? o_file : "not found")); - - ptr = getenv ("COLLECT_GCC_OPTIONS"); - if (ptr) - fprintf (stderr, "COLLECT_GCC_OPTIONS = %s\n", ptr); - - ptr = getenv ("COLLECT_GCC"); - if (ptr) - fprintf (stderr, "COLLECT_GCC = %s\n", ptr); - - ptr = getenv ("COMPILER_PATH"); - if (ptr) - fprintf (stderr, "COMPILER_PATH = %s\n", ptr); - - ptr = getenv ("LIBRARY_PATH"); - if (ptr) - fprintf (stderr, "LIBRARY_PATH = %s\n", ptr); - - fprintf (stderr, "\n"); - } - - /* Load the program, searching all libraries and attempting to provide - undefined symbols from repository information. */ - - /* On AIX we do this later. */ -#ifndef COLLECT_EXPORT_LIST - do_tlink (ld1_argv, object_lst); -#endif - - /* If -r or they will be run via some other method, do not build the - constructor or destructor list, just return now. */ - if (rflag -#ifndef COLLECT_EXPORT_LIST - || ! do_collecting -#endif - ) - { -#ifdef COLLECT_EXPORT_LIST - /* But make sure we delete the export file we may have created. */ - if (export_file != 0 && export_file[0]) - maybe_unlink (export_file); - if (import_file != 0 && import_file[0]) - maybe_unlink (import_file); -#endif - maybe_unlink (c_file); - maybe_unlink (o_file); - return 0; - } - - /* Examine the namelist with nm and search it for static constructors - and destructors to call. - Write the constructor and destructor tables to a .s file and reload. */ - - /* On AIX we already done scanning for global constructors/destructors. */ -#ifndef COLLECT_EXPORT_LIST - scan_prog_file (output_file, PASS_FIRST); -#endif - -#ifdef SCAN_LIBRARIES - scan_libraries (output_file); -#endif - - if (debug) - { - fprintf (stderr, "%d constructor(s) found\n", constructors.number); - fprintf (stderr, "%d destructor(s) found\n", destructors.number); - } - - if (constructors.number == 0 && destructors.number == 0 - && frame_tables.number == 0 -#if defined (SCAN_LIBRARIES) || defined (COLLECT_EXPORT_LIST) - /* If we will be running these functions ourselves, we want to emit - stubs into the shared library so that we do not have to relink - dependent programs when we add static objects. */ - && ! shared_obj -#endif - ) - { -#ifdef COLLECT_EXPORT_LIST - /* Doing tlink without additional code generation */ - do_tlink (ld1_argv, object_lst); -#endif - /* Strip now if it was requested on the command line. */ - if (strip_flag) - { - char **strip_argv = (char **) xcalloc (sizeof (char *), 3); - strip_argv[0] = strip_file_name; - strip_argv[1] = output_file; - strip_argv[2] = (char *) 0; - fork_execute ("strip", strip_argv); - } - -#ifdef COLLECT_EXPORT_LIST - maybe_unlink (export_file); - maybe_unlink (import_file); -#endif - maybe_unlink (c_file); - maybe_unlink (o_file); - return 0; - } - - /* Sort ctor and dtor lists by priority. */ - sort_ids (&constructors); - sort_ids (&destructors); - - maybe_unlink(output_file); - outf = fopen (c_file, "w"); - if (outf == (FILE *) 0) - fatal_perror ("%s", c_file); - - write_c_file (outf, c_file); - - if (fclose (outf)) - fatal_perror ("closing %s", c_file); - - /* Tell the linker that we have initializer and finalizer functions. */ -#ifdef LD_INIT_SWITCH - *ld2++ = LD_INIT_SWITCH; - *ld2++ = initname; - *ld2++ = LD_FINI_SWITCH; - *ld2++ = fininame; -#endif - *ld2 = (char*) 0; - -#ifdef COLLECT_EXPORT_LIST - if (shared_obj) - { - add_to_list (&exports, initname); - add_to_list (&exports, fininame); - add_to_list (&exports, "_GLOBAL__DI"); - add_to_list (&exports, "_GLOBAL__DD"); - exportf = fopen (export_file, "w"); - if (exportf == (FILE *) 0) - fatal_perror ("%s", export_file); - write_export_file (exportf); - if (fclose (exportf)) - fatal_perror ("closing %s", export_file); - } -#endif - - if (debug) - { - fprintf (stderr, "\n========== output_file = %s, c_file = %s\n", - output_file, c_file); - write_c_file (stderr, "stderr"); - fprintf (stderr, "========== end of c_file\n\n"); -#ifdef COLLECT_EXPORT_LIST - fprintf (stderr, "\n========== export_file = %s\n", export_file); - write_export_file (stderr); - fprintf (stderr, "========== end of export_file\n\n"); -#endif - } - - /* Assemble the constructor and destructor tables. - Link the tables in with the rest of the program. */ - - fork_execute ("gcc", c_argv); -#ifdef COLLECT_EXPORT_LIST - /* On AIX we must call tlink because of possible templates resolution */ - do_tlink (ld2_argv, object_lst); -#else - /* Otherwise, simply call ld because tlink is already done */ - fork_execute ("ld", ld2_argv); - - /* Let scan_prog_file do any final mods (OSF/rose needs this for - constructors/destructors in shared libraries. */ - scan_prog_file (output_file, PASS_SECOND); -#endif - - maybe_unlink (c_file); - maybe_unlink (o_file); - -#ifdef COLLECT_EXPORT_LIST - maybe_unlink (export_file); - maybe_unlink (import_file); -#endif - - return 0; -} - - -/* Wait for a process to finish, and exit if a non-zero status is found. */ - -int -collect_wait (prog) - char *prog; -{ - int status; - - wait (&status); - if (status) - { - if (WIFSIGNALED (status)) - { - int sig = WTERMSIG (status); - error ("%s terminated with signal %d [%s]%s", - prog, - sig, - my_strsignal(sig), - (status & 0200) ? ", core dumped" : ""); - - collect_exit (FATAL_EXIT_CODE); - } - - if (WIFEXITED (status)) - return WEXITSTATUS (status); - } - return 0; -} - -static void -do_wait (prog) - char *prog; -{ - int ret = collect_wait (prog); - if (ret != 0) - { - error ("%s returned %d exit status", prog, ret); - collect_exit (ret); - } -} - - -/* Fork and execute a program, and wait for the reply. */ - -void -collect_execute (prog, argv, redir) - char *prog; - char **argv; - char *redir; -{ - int pid; - - if (vflag || debug) - { - char **p_argv; - char *str; - - if (argv[0]) - fprintf (stderr, "%s", argv[0]); - else - fprintf (stderr, "[cannot find %s]", prog); - - for (p_argv = &argv[1]; (str = *p_argv) != (char *) 0; p_argv++) - fprintf (stderr, " %s", str); - - fprintf (stderr, "\n"); - } - - fflush (stdout); - fflush (stderr); - - /* If we cannot find a program we need, complain error. Do this here - since we might not end up needing something that we could not find. */ - - if (argv[0] == 0) - fatal ("cannot find `%s'", prog); - -#ifndef __CYGWIN__ - pid = vfork (); - if (pid == -1) - fatal_perror (VFORK_STRING); - - if (pid == 0) /* child context */ - { - if (redir) - { - unlink (redir); - if (freopen (redir, "a", stdout) == NULL) - fatal_perror ("redirecting stdout: %s", redir); - if (freopen (redir, "a", stderr) == NULL) - fatal_perror ("redirecting stderr: %s", redir); - } - - execvp (argv[0], argv); - fatal_perror ("executing %s", prog); - } -#else - pid = _spawnvp (_P_NOWAIT, argv[0], argv); - if (pid == -1) - fatal ("spawnvp failed"); -#endif -} - -static void -fork_execute (prog, argv) - char *prog; - char **argv; -{ - collect_execute (prog, argv, NULL); - do_wait (prog); -} - -/* Unlink a file unless we are debugging. */ - -static void -maybe_unlink (file) - char *file; -{ - if (!debug) - unlink (file); - else - fprintf (stderr, "[Leaving %s]\n", file); -} - - -static long sequence_number = 0; - -/* Add a name to a linked list. */ - -static void -add_to_list (head_ptr, name) - struct head *head_ptr; - char *name; -{ - struct id *newid - = (struct id *) xcalloc (sizeof (struct id) + strlen (name), 1); - struct id *p; - strcpy (newid->name, name); - - if (head_ptr->first) - head_ptr->last->next = newid; - else - head_ptr->first = newid; - - /* Check for duplicate symbols. */ - for (p = head_ptr->first; - strcmp (name, p->name) != 0; - p = p->next) - ; - if (p != newid) - { - head_ptr->last->next = 0; - free (newid); - return; - } - - newid->sequence = ++sequence_number; - head_ptr->last = newid; - head_ptr->number++; -} - -/* Grab the init priority number from an init function name that - looks like "_GLOBAL_.I.12345.foo". */ - -static int -extract_init_priority (name) - char *name; -{ - int pos = 0, pri; - - while (name[pos] == '_') - ++pos; - pos += 10; /* strlen ("GLOBAL__X_") */ - - /* Extract init_p number from ctor/dtor name. */ - pri = atoi (name + pos); - return pri ? pri : DEFAULT_INIT_PRIORITY; -} - -/* Insertion sort the ids from ctor/dtor list HEAD_PTR in descending order. - ctors will be run from right to left, dtors from left to right. */ - -static void -sort_ids (head_ptr) - struct head *head_ptr; -{ - /* id holds the current element to insert. id_next holds the next - element to insert. id_ptr iterates through the already sorted elements - looking for the place to insert id. */ - struct id *id, *id_next, **id_ptr; - - id = head_ptr->first; - - /* We don't have any sorted elements yet. */ - head_ptr->first = NULL; - - for (; id; id = id_next) - { - id_next = id->next; - id->sequence = extract_init_priority (id->name); - - for (id_ptr = &(head_ptr->first); ; id_ptr = &((*id_ptr)->next)) - if (*id_ptr == NULL - /* If the sequence numbers are the same, we put the id from the - file later on the command line later in the list. */ - || id->sequence > (*id_ptr)->sequence - /* Hack: do lexical compare, too. - || (id->sequence == (*id_ptr)->sequence - && strcmp (id->name, (*id_ptr)->name) > 0) */ - ) - { - id->next = *id_ptr; - *id_ptr = id; - break; - } - } - - /* Now set the sequence numbers properly so write_c_file works. */ - for (id = head_ptr->first; id; id = id->next) - id->sequence = ++sequence_number; -} - -/* Write: `prefix', the names on list LIST, `suffix'. */ - -static void -write_list (stream, prefix, list) - FILE *stream; - char *prefix; - struct id *list; -{ - while (list) - { - fprintf (stream, "%sx%d,\n", prefix, list->sequence); - list = list->next; - } -} - -#ifdef COLLECT_EXPORT_LIST -/* This function is really used only on AIX, but may be useful. */ -static int -is_in_list (prefix, list) - char *prefix; - struct id *list; -{ - while (list) - { - if (!strcmp (prefix, list->name)) return 1; - list = list->next; - } - return 0; -} -#endif - -/* Added for debugging purpose. */ -#ifdef COLLECT_EXPORT_LIST -static void -dump_list (stream, prefix, list) - FILE *stream; - char *prefix; - struct id *list; -{ - while (list) - { - fprintf (stream, "%s%s,\n", prefix, list->name); - list = list->next; - } -} -#endif - -#if 0 -static void -dump_prefix_list (stream, prefix, list) - FILE *stream; - char *prefix; - struct prefix_list *list; -{ - while (list) - { - fprintf (stream, "%s%s,\n", prefix, list->prefix); - list = list->next; - } -} -#endif - -static void -write_list_with_asm (stream, prefix, list) - FILE *stream; - char *prefix; - struct id *list; -{ - while (list) - { - fprintf (stream, "%sx%d __asm__ (\"%s\");\n", - prefix, list->sequence, list->name); - list = list->next; - } -} - -/* Write out the constructor and destructor tables statically (for a shared - object), along with the functions to execute them. */ - -static void -write_c_file_stat (stream, name) - FILE *stream; - char *name; -{ - char *prefix, *p, *q; - int frames = (frame_tables.number > 0); - - /* Figure out name of output_file, stripping off .so version. */ - p = rindex (output_file, '/'); - if (p == 0) - p = (char *) output_file; - else - p++; - q = p; - while (q) - { - q = index (q,'.'); - if (q == 0) - { - q = p + strlen (p); - break; - } - else - { - if (strncmp (q, ".so", 3) == 0) - { - q += 3; - break; - } - else - q++; - } - } - /* q points to null at end of the string (or . of the .so version) */ - prefix = xmalloc (q - p + 1); - strncpy (prefix, p, q - p); - prefix[q - p] = 0; - for (q = prefix; *q; q++) - if (!ISALNUM ((unsigned char)*q)) - *q = '_'; - if (debug) - fprintf (stderr, "\nwrite_c_file - output name is %s, prefix is %s\n", - output_file, prefix); - -#define INIT_NAME_FORMAT "_GLOBAL__FI_%s" - initname = xmalloc (strlen (prefix) + sizeof (INIT_NAME_FORMAT) - 2); - sprintf (initname, INIT_NAME_FORMAT, prefix); - -#define FINI_NAME_FORMAT "_GLOBAL__FD_%s" - fininame = xmalloc (strlen (prefix) + sizeof (FINI_NAME_FORMAT) - 2); - sprintf (fininame, FINI_NAME_FORMAT, prefix); - - free (prefix); - - /* Write the tables as C code */ - - fprintf (stream, "static int count;\n"); - fprintf (stream, "typedef void entry_pt();\n"); - write_list_with_asm (stream, "extern entry_pt ", constructors.first); - - if (frames) - { - write_list_with_asm (stream, "extern void *", frame_tables.first); - - fprintf (stream, "\tstatic void *frame_table[] = {\n"); - write_list (stream, "\t\t&", frame_tables.first); - fprintf (stream, "\t0\n};\n"); - - /* This must match what's in frame.h. */ - fprintf (stream, "struct object {\n"); - fprintf (stream, " void *pc_begin;\n"); - fprintf (stream, " void *pc_end;\n"); - fprintf (stream, " void *fde_begin;\n"); - fprintf (stream, " void *fde_array;\n"); - fprintf (stream, " __SIZE_TYPE__ count;\n"); - fprintf (stream, " struct object *next;\n"); - fprintf (stream, "};\n"); - - fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n"); - fprintf (stream, "extern void *__deregister_frame_info (void *);\n"); - - fprintf (stream, "static void reg_frame () {\n"); - fprintf (stream, "\tstatic struct object ob;\n"); - fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n"); - fprintf (stream, "\t}\n"); - - fprintf (stream, "static void dereg_frame () {\n"); - fprintf (stream, "\t__deregister_frame_info (frame_table);\n"); - fprintf (stream, "\t}\n"); - } - - fprintf (stream, "void %s() {\n", initname); - if (constructors.number > 0 || frames) - { - fprintf (stream, "\tstatic entry_pt *ctors[] = {\n"); - write_list (stream, "\t\t", constructors.first); - if (frames) - fprintf (stream, "\treg_frame,\n"); - fprintf (stream, "\t};\n"); - fprintf (stream, "\tentry_pt **p;\n"); - fprintf (stream, "\tif (count++ != 0) return;\n"); - fprintf (stream, "\tp = ctors + %d;\n", constructors.number + frames); - fprintf (stream, "\twhile (p > ctors) (*--p)();\n"); - } - else - fprintf (stream, "\t++count;\n"); - fprintf (stream, "}\n"); - write_list_with_asm (stream, "extern entry_pt ", destructors.first); - fprintf (stream, "void %s() {\n", fininame); - if (destructors.number > 0 || frames) - { - fprintf (stream, "\tstatic entry_pt *dtors[] = {\n"); - write_list (stream, "\t\t", destructors.first); - if (frames) - fprintf (stream, "\tdereg_frame,\n"); - fprintf (stream, "\t};\n"); - fprintf (stream, "\tentry_pt **p;\n"); - fprintf (stream, "\tif (--count != 0) return;\n"); - fprintf (stream, "\tp = dtors;\n"); - fprintf (stream, "\twhile (p < dtors + %d) (*p++)();\n", - destructors.number + frames); - } - fprintf (stream, "}\n"); - - if (shared_obj) - { - fprintf (stream, "void _GLOBAL__DI() {\n\t%s();\n}\n", initname); - fprintf (stream, "void _GLOBAL__DD() {\n\t%s();\n}\n", fininame); - } -} - -/* Write the constructor/destructor tables. */ - -#ifndef LD_INIT_SWITCH -static void -write_c_file_glob (stream, name) - FILE *stream; - char *name; -{ - /* Write the tables as C code */ - - int frames = (frame_tables.number > 0); - - fprintf (stream, "typedef void entry_pt();\n\n"); - - write_list_with_asm (stream, "extern entry_pt ", constructors.first); - - if (frames) - { - write_list_with_asm (stream, "extern void *", frame_tables.first); - - fprintf (stream, "\tstatic void *frame_table[] = {\n"); - write_list (stream, "\t\t&", frame_tables.first); - fprintf (stream, "\t0\n};\n"); - - /* This must match what's in frame.h. */ - fprintf (stream, "struct object {\n"); - fprintf (stream, " void *pc_begin;\n"); - fprintf (stream, " void *pc_end;\n"); - fprintf (stream, " void *fde_begin;\n"); - fprintf (stream, " void *fde_array;\n"); - fprintf (stream, " __SIZE_TYPE__ count;\n"); - fprintf (stream, " struct object *next;\n"); - fprintf (stream, "};\n"); - - fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n"); - fprintf (stream, "extern void *__deregister_frame_info (void *);\n"); - - fprintf (stream, "static void reg_frame () {\n"); - fprintf (stream, "\tstatic struct object ob;\n"); - fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n"); - fprintf (stream, "\t}\n"); - - fprintf (stream, "static void dereg_frame () {\n"); - fprintf (stream, "\t__deregister_frame_info (frame_table);\n"); - fprintf (stream, "\t}\n"); - } - - fprintf (stream, "\nentry_pt * __CTOR_LIST__[] = {\n"); - fprintf (stream, "\t(entry_pt *) %d,\n", constructors.number + frames); - write_list (stream, "\t", constructors.first); - if (frames) - fprintf (stream, "\treg_frame,\n"); - fprintf (stream, "\t0\n};\n\n"); - - write_list_with_asm (stream, "extern entry_pt ", destructors.first); - - fprintf (stream, "\nentry_pt * __DTOR_LIST__[] = {\n"); - fprintf (stream, "\t(entry_pt *) %d,\n", destructors.number + frames); - write_list (stream, "\t", destructors.first); - if (frames) - fprintf (stream, "\tdereg_frame,\n"); - fprintf (stream, "\t0\n};\n\n"); - - fprintf (stream, "extern entry_pt %s;\n", NAME__MAIN); - fprintf (stream, "entry_pt *__main_reference = %s;\n\n", NAME__MAIN); -} -#endif /* ! LD_INIT_SWITCH */ - -static void -write_c_file (stream, name) - FILE *stream; - char *name; -{ - fprintf (stream, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n"); -#ifndef LD_INIT_SWITCH - if (! shared_obj) - write_c_file_glob (stream, name); - else -#endif - write_c_file_stat (stream, name); - fprintf (stream, "#ifdef __cplusplus\n}\n#endif\n"); -} - -#ifdef COLLECT_EXPORT_LIST -static void -write_export_file (stream) - FILE *stream; -{ - struct id *list = exports.first; - for (; list; list = list->next) - fprintf (stream, "%s\n", list->name); -} - -static void -write_import_file (stream) - FILE *stream; -{ - struct id *list = imports.first; - fprintf (stream, "%s\n", "#! ."); - for (; list; list = list->next) - fprintf (stream, "%s\n", list->name); -} -#endif - -#ifdef OBJECT_FORMAT_NONE - -/* Generic version to scan the name list of the loaded program for - the symbols g++ uses for static constructors and destructors. - - The constructor table begins at __CTOR_LIST__ and contains a count - of the number of pointers (or -1 if the constructors are built in a - separate section by the linker), followed by the pointers to the - constructor functions, terminated with a null pointer. The - destructor table has the same format, and begins at __DTOR_LIST__. */ - -static void -scan_prog_file (prog_name, which_pass) - char *prog_name; - enum pass which_pass; -{ - void (*int_handler) (); - void (*quit_handler) (); - char *nm_argv[4]; - int pid; - int argc = 0; - int pipe_fd[2]; - char *p, buf[1024]; - FILE *inf; - - if (which_pass == PASS_SECOND) - return; - - /* If we do not have an `nm', complain. */ - if (nm_file_name == 0) - fatal ("cannot find `nm'"); - - nm_argv[argc++] = nm_file_name; - if (NM_FLAGS[0] != '\0') - nm_argv[argc++] = NM_FLAGS; - - nm_argv[argc++] = prog_name; - nm_argv[argc++] = (char *) 0; - - if (pipe (pipe_fd) < 0) - fatal_perror ("pipe"); - - inf = fdopen (pipe_fd[0], "r"); - if (inf == (FILE *) 0) - fatal_perror ("fdopen"); - - /* Trace if needed. */ - if (vflag) - { - char **p_argv; - char *str; - - for (p_argv = &nm_argv[0]; (str = *p_argv) != (char *) 0; p_argv++) - fprintf (stderr, " %s", str); - - fprintf (stderr, "\n"); - } - - fflush (stdout); - fflush (stderr); - - /* Spawn child nm on pipe */ - pid = vfork (); - if (pid == -1) - fatal_perror (VFORK_STRING); - - if (pid == 0) /* child context */ - { - /* setup stdout */ - if (dup2 (pipe_fd[1], 1) < 0) - fatal_perror ("dup2 (%d, 1)", pipe_fd[1]); - - if (close (pipe_fd[0]) < 0) - fatal_perror ("close (%d)", pipe_fd[0]); - - if (close (pipe_fd[1]) < 0) - fatal_perror ("close (%d)", pipe_fd[1]); - - execv (nm_file_name, nm_argv); - fatal_perror ("executing %s", nm_file_name); - } - - /* Parent context from here on. */ - int_handler = (void (*) ())signal (SIGINT, SIG_IGN); -#ifdef SIGQUIT - quit_handler = (void (*) ())signal (SIGQUIT, SIG_IGN); -#endif - - if (close (pipe_fd[1]) < 0) - fatal_perror ("close (%d)", pipe_fd[1]); - - if (debug) - fprintf (stderr, "\nnm output with constructors/destructors.\n"); - - /* Read each line of nm output. */ - while (fgets (buf, sizeof buf, inf) != (char *) 0) - { - int ch, ch2; - char *name, *end; - - /* If it contains a constructor or destructor name, add the name - to the appropriate list. */ - - for (p = buf; (ch = *p) != '\0' && ch != '\n' && ch != '_'; p++) - if (ch == ' ' && p[1] == 'U' && p[2] == ' ') - break; - - if (ch != '_') - continue; - - name = p; - /* Find the end of the symbol name. - Do not include `|', because Encore nm can tack that on the end. */ - for (end = p; (ch2 = *end) != '\0' && !ISSPACE (ch2) && ch2 != '|'; - end++) - continue; - - - *end = '\0'; - switch (is_ctor_dtor (name)) - { - case 1: - if (which_pass != PASS_LIB) - add_to_list (&constructors, name); - break; - - case 2: - if (which_pass != PASS_LIB) - add_to_list (&destructors, name); - break; - - case 3: - if (which_pass != PASS_LIB) - fatal ("init function found in object %s", prog_name); -#ifndef LD_INIT_SWITCH - add_to_list (&constructors, name); -#endif - break; - - case 4: - if (which_pass != PASS_LIB) - fatal ("fini function found in object %s", prog_name); -#ifndef LD_FINI_SWITCH - add_to_list (&destructors, name); -#endif - break; - - case 5: - if (which_pass != PASS_LIB) - add_to_list (&frame_tables, name); - - default: /* not a constructor or destructor */ - continue; - } - - if (debug) - fprintf (stderr, "\t%s\n", buf); - } - - if (debug) - fprintf (stderr, "\n"); - - if (fclose (inf) != 0) - fatal_perror ("fclose of pipe"); - - do_wait (nm_file_name); - - signal (SIGINT, int_handler); -#ifdef SIGQUIT - signal (SIGQUIT, quit_handler); -#endif -} - -#if SUNOS4_SHARED_LIBRARIES - -/* Routines to scan the SunOS 4 _DYNAMIC structure to find shared libraries - that the output file depends upon and their initialization/finalization - routines, if any. */ - -#include -#include -#include -#include -#include -#include -#include - -/* pointers to the object file */ -unsigned object; /* address of memory mapped file */ -unsigned objsize; /* size of memory mapped to file */ -char * code; /* pointer to code segment */ -char * data; /* pointer to data segment */ -struct nlist *symtab; /* pointer to symbol table */ -struct link_dynamic *ld; -struct link_dynamic_2 *ld_2; -struct head libraries; - -/* Map the file indicated by NAME into memory and store its address. */ - -static void -mapfile (name) - char *name; -{ - int fp; - struct stat s; - if ((fp = open (name, O_RDONLY)) == -1) - fatal ("unable to open file '%s'", name); - if (fstat (fp, &s) == -1) - fatal ("unable to stat file '%s'", name); - - objsize = s.st_size; - object = (unsigned) mmap (0, objsize, PROT_READ|PROT_WRITE, MAP_PRIVATE, - fp, 0); - if (object == -1) - fatal ("unable to mmap file '%s'", name); - - close (fp); -} - -/* Helpers for locatelib. */ - -static char *libname; - -static int -libselect (d) - struct direct *d; -{ - return (strncmp (libname, d->d_name, strlen (libname)) == 0); -} - -/* If one file has an additional numeric extension past LIBNAME, then put - that one first in the sort. If both files have additional numeric - extensions, then put the one with the higher number first in the sort. - - We must verify that the extension is numeric, because Sun saves the - original versions of patched libraries with a .FCS extension. Files with - invalid extensions must go last in the sort, so that they will not be used. */ - -static int -libcompare (d1, d2) - struct direct **d1, **d2; -{ - int i1, i2 = strlen (libname); - char *e1 = (*d1)->d_name + i2; - char *e2 = (*d2)->d_name + i2; - - while (*e1 && *e2 && *e1 == '.' && *e2 == '.' - && e1[1] && ISDIGIT (e1[1]) && e2[1] && ISDIGIT (e2[1])) - { - ++e1; - ++e2; - i1 = strtol (e1, &e1, 10); - i2 = strtol (e2, &e2, 10); - if (i1 != i2) - return i1 - i2; - } - - if (*e1) - { - /* It has a valid numeric extension, prefer this one. */ - if (*e1 == '.' && e1[1] && ISDIGIT (e1[1])) - return 1; - /* It has a invalid numeric extension, must prefer the other one. */ - else - return -1; - } - else if (*e2) - { - /* It has a valid numeric extension, prefer this one. */ - if (*e2 == '.' && e2[1] && ISDIGIT (e2[1])) - return -1; - /* It has a invalid numeric extension, must prefer the other one. */ - else - return 1; - } - else - return 0; -} - -/* Given the name NAME of a dynamic dependency, find its pathname and add - it to the list of libraries. */ - -static void -locatelib (name) - char *name; -{ - static char **l; - static int cnt; - char buf[MAXPATHLEN]; - char *p, *q; - char **pp; - - if (l == 0) - { - char *ld_rules; - char *ldr = 0; - /* counting elements in array, need 1 extra for null */ - cnt = 1; - ld_rules = (char *) (ld_2->ld_rules + code); - if (ld_rules) - { - cnt++; - for (; *ld_rules != 0; ld_rules++) - if (*ld_rules == ':') - cnt++; - ld_rules = (char *) (ld_2->ld_rules + code); - ldr = (char *) malloc (strlen (ld_rules) + 1); - strcpy (ldr, ld_rules); - } - p = getenv ("LD_LIBRARY_PATH"); - q = 0; - if (p) - { - cnt++; - for (q = p ; *q != 0; q++) - if (*q == ':') - cnt++; - q = (char *) malloc (strlen (p) + 1); - strcpy (q, p); - } - l = (char **) malloc ((cnt + 3) * sizeof (char *)); - pp = l; - if (ldr) - { - *pp++ = ldr; - for (; *ldr != 0; ldr++) - if (*ldr == ':') - { - *ldr++ = 0; - *pp++ = ldr; - } - } - if (q) - { - *pp++ = q; - for (; *q != 0; q++) - if (*q == ':') - { - *q++ = 0; - *pp++ = q; - } - } - /* built in directories are /lib, /usr/lib, and /usr/local/lib */ - *pp++ = "/lib"; - *pp++ = "/usr/lib"; - *pp++ = "/usr/local/lib"; - *pp = 0; - } - libname = name; - for (pp = l; *pp != 0 ; pp++) - { - struct direct **namelist; - int entries; - if ((entries = scandir (*pp, &namelist, libselect, libcompare)) > 0) - { - sprintf (buf, "%s/%s", *pp, namelist[entries - 1]->d_name); - add_to_list (&libraries, buf); - if (debug) - fprintf (stderr, "%s\n", buf); - break; - } - } - if (*pp == 0) - { - if (debug) - fprintf (stderr, "not found\n"); - else - fatal ("dynamic dependency %s not found", name); - } -} - -/* Scan the _DYNAMIC structure of the output file to find shared libraries - that it depends upon and any constructors or destructors they contain. */ - -static void -scan_libraries (prog_name) - char *prog_name; -{ - struct exec *header; - char *base; - struct link_object *lo; - char buff[MAXPATHLEN]; - struct id *list; - - mapfile (prog_name); - header = (struct exec *)object; - if (N_BADMAG (*header)) - fatal ("bad magic number in file '%s'", prog_name); - if (header->a_dynamic == 0) - return; - - code = (char *) (N_TXTOFF (*header) + (long) header); - data = (char *) (N_DATOFF (*header) + (long) header); - symtab = (struct nlist *) (N_SYMOFF (*header) + (long) header); - - if (header->a_magic == ZMAGIC && header->a_entry == 0x20) - { - /* shared object */ - ld = (struct link_dynamic *) (symtab->n_value + code); - base = code; - } - else - { - /* executable */ - ld = (struct link_dynamic *) data; - base = code-PAGSIZ; - } - - if (debug) - fprintf (stderr, "dynamic dependencies.\n"); - - ld_2 = (struct link_dynamic_2 *) ((long) ld->ld_un.ld_2 + (long)base); - for (lo = (struct link_object *) ld_2->ld_need; lo; - lo = (struct link_object *) lo->lo_next) - { - char *name; - lo = (struct link_object *) ((long) lo + code); - name = (char *) (code + lo->lo_name); - if (lo->lo_library) - { - if (debug) - fprintf (stderr, "\t-l%s.%d => ", name, lo->lo_major); - sprintf (buff, "lib%s.so.%d.%d", name, lo->lo_major, lo->lo_minor); - locatelib (buff); - } - else - { - if (debug) - fprintf (stderr, "\t%s\n", name); - add_to_list (&libraries, name); - } - } - - if (debug) - fprintf (stderr, "\n"); - - /* now iterate through the library list adding their symbols to - the list. */ - for (list = libraries.first; list; list = list->next) - scan_prog_file (list->name, PASS_LIB); -} - -#else /* SUNOS4_SHARED_LIBRARIES */ -#ifdef LDD_SUFFIX - -/* Use the List Dynamic Dependencies program to find shared libraries that - the output file depends upon and their initialization/finalization - routines, if any. */ - -static void -scan_libraries (prog_name) - char *prog_name; -{ - static struct head libraries; /* list of shared libraries found */ - struct id *list; - void (*int_handler) (); - void (*quit_handler) (); - char *ldd_argv[4]; - int pid; - int argc = 0; - int pipe_fd[2]; - char buf[1024]; - FILE *inf; - - /* If we do not have an `ldd', complain. */ - if (ldd_file_name == 0) - { - error ("cannot find `ldd'"); - return; - } - - ldd_argv[argc++] = ldd_file_name; - ldd_argv[argc++] = prog_name; - ldd_argv[argc++] = (char *) 0; - - if (pipe (pipe_fd) < 0) - fatal_perror ("pipe"); - - inf = fdopen (pipe_fd[0], "r"); - if (inf == (FILE *) 0) - fatal_perror ("fdopen"); - - /* Trace if needed. */ - if (vflag) - { - char **p_argv; - char *str; - - for (p_argv = &ldd_argv[0]; (str = *p_argv) != (char *) 0; p_argv++) - fprintf (stderr, " %s", str); - - fprintf (stderr, "\n"); - } - - fflush (stdout); - fflush (stderr); - - /* Spawn child ldd on pipe */ - pid = vfork (); - if (pid == -1) - fatal_perror (VFORK_STRING); - - if (pid == 0) /* child context */ - { - /* setup stdout */ - if (dup2 (pipe_fd[1], 1) < 0) - fatal_perror ("dup2 (%d, 1)", pipe_fd[1]); - - if (close (pipe_fd[0]) < 0) - fatal_perror ("close (%d)", pipe_fd[0]); - - if (close (pipe_fd[1]) < 0) - fatal_perror ("close (%d)", pipe_fd[1]); - - execv (ldd_file_name, ldd_argv); - fatal_perror ("executing %s", ldd_file_name); - } - - /* Parent context from here on. */ - int_handler = (void (*) ()) signal (SIGINT, SIG_IGN); -#ifdef SIGQUIT - quit_handler = (void (*) ()) signal (SIGQUIT, SIG_IGN); -#endif - - if (close (pipe_fd[1]) < 0) - fatal_perror ("close (%d)", pipe_fd[1]); - - if (debug) - fprintf (stderr, "\nldd output with constructors/destructors.\n"); - - /* Read each line of ldd output. */ - while (fgets (buf, sizeof buf, inf) != (char *) 0) - { - int ch, ch2; - char *name, *end, *p = buf; - - /* Extract names of libraries and add to list. */ - PARSE_LDD_OUTPUT (p); - if (p == 0) - continue; - - name = p; - if (strncmp (name, "not found", sizeof ("not found") - 1) == 0) - fatal ("dynamic dependency %s not found", buf); - - /* Find the end of the symbol name. */ - for (end = p; - (ch2 = *end) != '\0' && ch2 != '\n' && !ISSPACE (ch2) && ch2 != '|'; - end++) - continue; - *end = '\0'; - - if (access (name, R_OK) == 0) - add_to_list (&libraries, name); - else - fatal ("unable to open dynamic dependency '%s'", buf); - - if (debug) - fprintf (stderr, "\t%s\n", buf); - } - if (debug) - fprintf (stderr, "\n"); - - if (fclose (inf) != 0) - fatal_perror ("fclose of pipe"); - - do_wait (ldd_file_name); - - signal (SIGINT, int_handler); -#ifdef SIGQUIT - signal (SIGQUIT, quit_handler); -#endif - - /* now iterate through the library list adding their symbols to - the list. */ - for (list = libraries.first; list; list = list->next) - scan_prog_file (list->name, PASS_LIB); -} - -#endif /* LDD_SUFFIX */ -#endif /* SUNOS4_SHARED_LIBRARIES */ - -#endif /* OBJECT_FORMAT_NONE */ - - -/* - * COFF specific stuff. - */ - -#ifdef OBJECT_FORMAT_COFF - -#if defined(EXTENDED_COFF) -# define GCC_SYMBOLS(X) (SYMHEADER(X).isymMax + SYMHEADER(X).iextMax) -# define GCC_SYMENT SYMR -# define GCC_OK_SYMBOL(X) ((X).st == stProc && (X).sc == scText) -# define GCC_SYMINC(X) (1) -# define GCC_SYMZERO(X) (SYMHEADER(X).isymMax) -# define GCC_CHECK_HDR(X) (PSYMTAB(X) != 0) -#else -# define GCC_SYMBOLS(X) (HEADER(ldptr).f_nsyms) -# define GCC_SYMENT SYMENT -# define GCC_OK_SYMBOL(X) \ - (((X).n_sclass == C_EXT) && \ - ((X).n_scnum > N_UNDEF) && \ - (((X).n_type & N_TMASK) == (DT_NON << N_BTSHFT) || \ - ((X).n_type & N_TMASK) == (DT_FCN << N_BTSHFT))) -# define GCC_UNDEF_SYMBOL(X) \ - (((X).n_sclass == C_EXT) && ((X).n_scnum == N_UNDEF)) -# define GCC_SYMINC(X) ((X).n_numaux+1) -# define GCC_SYMZERO(X) 0 -# define GCC_CHECK_HDR(X) \ - ((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \ - || (HEADER (X).f_magic == 0757 && aix64_flag)) -#endif - -extern char *ldgetname (); - -/* COFF version to scan the name list of the loaded program for - the symbols g++ uses for static constructors and destructors. - - The constructor table begins at __CTOR_LIST__ and contains a count - of the number of pointers (or -1 if the constructors are built in a - separate section by the linker), followed by the pointers to the - constructor functions, terminated with a null pointer. The - destructor table has the same format, and begins at __DTOR_LIST__. */ - -static void -scan_prog_file (prog_name, which_pass) - char *prog_name; - enum pass which_pass; -{ - LDFILE *ldptr = NULL; - int sym_index, sym_count; - int is_shared = 0; -#ifdef COLLECT_EXPORT_LIST - /* Should we generate an import list for given prog_name? */ - int import_flag = (which_pass == PASS_OBJ ? 0 : use_import_list (prog_name)); -#endif - - if (which_pass != PASS_FIRST && which_pass != PASS_OBJ) - return; - -#ifdef COLLECT_EXPORT_LIST - /* We do not need scanning for some standard C libraries. */ - if (which_pass == PASS_FIRST && ignore_library (prog_name)) - return; - - /* On AIX we have a loop, because there is not much difference - between an object and an archive. This trick allows us to - eliminate scan_libraries() function. */ - do - { -#endif - if ((ldptr = ldopen (prog_name, ldptr)) != NULL) - { - if (! MY_ISCOFF (HEADER (ldptr).f_magic)) - fatal ("%s: not a COFF file", prog_name); - - if (GCC_CHECK_HDR (ldptr)) - { - sym_count = GCC_SYMBOLS (ldptr); - sym_index = GCC_SYMZERO (ldptr); - -#ifdef COLLECT_EXPORT_LIST - /* Is current archive member a shared object? */ - is_shared = HEADER (ldptr).f_flags & F_SHROBJ; -#endif - - while (sym_index < sym_count) - { - GCC_SYMENT symbol; - - if (ldtbread (ldptr, sym_index, &symbol) <= 0) - break; - sym_index += GCC_SYMINC (symbol); - - if (GCC_OK_SYMBOL (symbol)) - { - char *name; - - if ((name = ldgetname (ldptr, &symbol)) == NULL) - continue; /* should never happen */ - -#ifdef XCOFF_DEBUGGING_INFO - /* All AIX function names have a duplicate entry - beginning with a dot. */ - if (*name == '.') - ++name; -#endif - - switch (is_ctor_dtor (name)) - { - case 1: - if (! is_shared) add_to_list (&constructors, name); -#ifdef COLLECT_EXPORT_LIST - if (which_pass == PASS_OBJ) - add_to_list (&exports, name); - /* If this symbol was undefined and we are building - an import list, we should add a symbol to this - list. */ - else - if (import_flag - && is_in_list (name, undefined.first)) - add_to_list (&imports, name); -#endif - break; - - case 2: - if (! is_shared) add_to_list (&destructors, name); -#ifdef COLLECT_EXPORT_LIST - if (which_pass == PASS_OBJ) - add_to_list (&exports, name); - /* If this symbol was undefined and we are building - an import list, we should add a symbol to this - list. */ - else - if (import_flag - && is_in_list (name, undefined.first)) - add_to_list (&imports, name); -#endif - break; - -#ifdef COLLECT_EXPORT_LIST - case 3: - if (is_shared) - add_to_list (&constructors, name); - break; - - case 4: - if (is_shared) - add_to_list (&destructors, name); - break; -#endif - - default: /* not a constructor or destructor */ -#ifdef COLLECT_EXPORT_LIST - /* If we are building a shared object on AIX we need - to explicitly export all global symbols or add - them to import list. */ - if (shared_obj) - { - if (which_pass == PASS_OBJ && (! export_flag)) - add_to_list (&exports, name); - else if (! is_shared && which_pass == PASS_FIRST - && import_flag - && is_in_list(name, undefined.first)) - add_to_list (&imports, name); - } -#endif - continue; - } - -#if !defined(EXTENDED_COFF) - if (debug) - fprintf (stderr, "\tsec=%d class=%d type=%s%o %s\n", - symbol.n_scnum, symbol.n_sclass, - (symbol.n_type ? "0" : ""), symbol.n_type, - name); -#else - if (debug) - fprintf (stderr, - "\tiss = %5d, value = %5ld, index = %5d, name = %s\n", - symbol.iss, (long) symbol.value, symbol.index, name); -#endif - } -#ifdef COLLECT_EXPORT_LIST - /* If we are building a shared object we should collect - information about undefined symbols for later - import list generation. */ - else if (shared_obj && GCC_UNDEF_SYMBOL (symbol)) - { - char *name; - - if ((name = ldgetname (ldptr, &symbol)) == NULL) - continue; /* should never happen */ - - /* All AIX function names have a duplicate entry - beginning with a dot. */ - if (*name == '.') - ++name; - add_to_list (&undefined, name); - } -#endif - } - } -#ifdef COLLECT_EXPORT_LIST - else - { - /* If archive contains both 32-bit and 64-bit objects, - we want to skip objects in other mode so mismatch normal. */ - if (debug) - fprintf (stderr, "%s : magic=%o aix64=%d mismatch\n", - prog_name, HEADER (ldptr).f_magic, aix64_flag); - } -#endif - } - else - { - fatal ("%s: cannot open as COFF file", prog_name); - } -#ifdef COLLECT_EXPORT_LIST - /* On AIX loop continues while there are more members in archive. */ - } - while (ldclose (ldptr) == FAILURE); -#else - /* Otherwise we simply close ldptr. */ - (void) ldclose(ldptr); -#endif -} - - -#ifdef COLLECT_EXPORT_LIST - -/* This new function is used to decide whether we should - generate import list for an object or to use it directly. */ -static int -use_import_list (prog_name) - char *prog_name; -{ - char *p; - - /* If we do not build a shared object then import list should not be used. */ - if (! shared_obj) return 0; - - /* Currently we check only for libgcc, but this can be changed in future. */ - p = strstr (prog_name, "libgcc.a"); - if (p != 0 && (strlen (p) == sizeof ("libgcc.a") - 1)) - return 1; - return 0; -} - -/* Given a library name without "lib" prefix, this function - returns a full library name including a path. */ -static char * -resolve_lib_name (name) - char *name; -{ - char *lib_buf; - int i, j, l = 0; - - for (i = 0; libpaths[i]; i++) - if (libpaths[i]->max_len > l) - l = libpaths[i]->max_len; - - lib_buf = xmalloc (l + strlen(name) + 10); - - for (i = 0; libpaths[i]; i++) - { - struct prefix_list *list = libpaths[i]->plist; - for (; list; list = list->next) - { - for (j = 0; libexts[j]; j++) - { - /* The following lines are needed because path_prefix list - may contain directories both with trailing '/' and - without it. */ - char *p = ""; - if (list->prefix[strlen(list->prefix)-1] != '/') - p = "/"; - sprintf (lib_buf, "%s%slib%s.%s", - list->prefix, p, name, libexts[j]); -if (debug) fprintf (stderr, "searching for: %s\n", lib_buf); - if (file_exists (lib_buf)) - { -if (debug) fprintf (stderr, "found: %s\n", lib_buf); - return (lib_buf); - } - } - } - } - if (debug) - fprintf (stderr, "not found\n"); - else - fatal ("Library lib%s not found", name); - return (NULL); -} - -/* Array of standard AIX libraries which should not - be scanned for ctors/dtors. */ -static char* aix_std_libs[] = { - "/unix", - "/lib/libc.a", - "/lib/libc_r.a", - "/usr/lib/libc.a", - "/usr/lib/libc_r.a", - "/usr/lib/threads/libc.a", - "/usr/ccs/lib/libc.a", - "/usr/ccs/lib/libc_r.a", - NULL -}; - -/* This function checks the filename and returns 1 - if this name matches the location of a standard AIX library. */ -static int -ignore_library (name) - char *name; -{ - char **p = &aix_std_libs[0]; - while (*p++ != NULL) - if (! strcmp (name, *p)) return 1; - return 0; -} - -#endif - -#endif /* OBJECT_FORMAT_COFF */ - - -/* - * OSF/rose specific stuff. - */ - -#ifdef OBJECT_FORMAT_ROSE - -/* Union of the various load commands */ - -typedef union load_union -{ - ldc_header_t hdr; /* common header */ - load_cmd_map_command_t map; /* map indexing other load cmds */ - interpreter_command_t iprtr; /* interpreter pathname */ - strings_command_t str; /* load commands strings section */ - region_command_t region; /* region load command */ - reloc_command_t reloc; /* relocation section */ - package_command_t pkg; /* package load command */ - symbols_command_t sym; /* symbol sections */ - entry_command_t ent; /* program start section */ - gen_info_command_t info; /* object information */ - func_table_command_t func; /* function constructors/destructors */ -} load_union_t; - -/* Structure to point to load command and data section in memory. */ - -typedef struct load_all -{ - load_union_t *load; /* load command */ - char *section; /* pointer to section */ -} load_all_t; - -/* Structure to contain information about a file mapped into memory. */ - -struct file_info -{ - char *start; /* start of map */ - char *name; /* filename */ - long size; /* size of the file */ - long rounded_size; /* size rounded to page boundary */ - int fd; /* file descriptor */ - int rw; /* != 0 if opened read/write */ - int use_mmap; /* != 0 if mmap'ed */ -}; - -extern int decode_mach_o_hdr (); -extern int encode_mach_o_hdr (); - -static void add_func_table PROTO((mo_header_t *, load_all_t *, - symbol_info_t *, int)); -static void print_header PROTO((mo_header_t *)); -static void print_load_command PROTO((load_union_t *, size_t, int)); -static void bad_header PROTO((int)); -static struct file_info *read_file PROTO((char *, int, int)); -static void end_file PROTO((struct file_info *)); - -/* OSF/rose specific version to scan the name list of the loaded - program for the symbols g++ uses for static constructors and - destructors. - - The constructor table begins at __CTOR_LIST__ and contains a count - of the number of pointers (or -1 if the constructors are built in a - separate section by the linker), followed by the pointers to the - constructor functions, terminated with a null pointer. The - destructor table has the same format, and begins at __DTOR_LIST__. */ - -static void -scan_prog_file (prog_name, which_pass) - char *prog_name; - enum pass which_pass; -{ - char *obj; - mo_header_t hdr; - load_all_t *load_array; - load_all_t *load_end; - load_all_t *load_cmd; - int symbol_load_cmds; - off_t offset; - int i; - int num_syms; - int status; - char *str_sect; - struct file_info *obj_file; - int prog_fd; - mo_lcid_t cmd_strings = -1; - symbol_info_t *main_sym = 0; - int rw = (which_pass != PASS_FIRST); - - prog_fd = open (prog_name, (rw) ? O_RDWR : O_RDONLY); - if (prog_fd < 0) - fatal_perror ("cannot read %s", prog_name); - - obj_file = read_file (prog_name, prog_fd, rw); - obj = obj_file->start; - - status = decode_mach_o_hdr (obj, MO_SIZEOF_RAW_HDR, MOH_HEADER_VERSION, &hdr); - if (status != MO_HDR_CONV_SUCCESS) - bad_header (status); - - - /* Do some basic sanity checks. Note we explicitly use the big endian magic number, - since the hardware will automatically swap bytes for us on loading little endian - integers. */ - -#ifndef CROSS_COMPILE - if (hdr.moh_magic != MOH_MAGIC_MSB - || hdr.moh_header_version != MOH_HEADER_VERSION - || hdr.moh_byte_order != OUR_BYTE_ORDER - || hdr.moh_data_rep_id != OUR_DATA_REP_ID - || hdr.moh_cpu_type != OUR_CPU_TYPE - || hdr.moh_cpu_subtype != OUR_CPU_SUBTYPE - || hdr.moh_vendor_type != OUR_VENDOR_TYPE) - { - fatal ("incompatibilities between object file & expected values"); - } -#endif - - if (debug) - print_header (&hdr); - - offset = hdr.moh_first_cmd_off; - load_end = load_array - = (load_all_t *) xcalloc (sizeof (load_all_t), hdr.moh_n_load_cmds + 2); - - /* Build array of load commands, calculating the offsets */ - for (i = 0; i < hdr.moh_n_load_cmds; i++) - { - load_union_t *load_hdr; /* load command header */ - - load_cmd = load_end++; - load_hdr = (load_union_t *) (obj + offset); - - /* If modifying the program file, copy the header. */ - if (rw) - { - load_union_t *ptr = (load_union_t *) xmalloc (load_hdr->hdr.ldci_cmd_size); - bcopy ((char *)load_hdr, (char *)ptr, load_hdr->hdr.ldci_cmd_size); - load_hdr = ptr; - - /* null out old command map, because we will rewrite at the end. */ - if (ptr->hdr.ldci_cmd_type == LDC_CMD_MAP) - { - cmd_strings = ptr->map.lcm_ld_cmd_strings; - ptr->hdr.ldci_cmd_type = LDC_UNDEFINED; - } - } - - load_cmd->load = load_hdr; - if (load_hdr->hdr.ldci_section_off > 0) - load_cmd->section = obj + load_hdr->hdr.ldci_section_off; - - if (debug) - print_load_command (load_hdr, offset, i); - - offset += load_hdr->hdr.ldci_cmd_size; - } - - /* If the last command is the load command map and is not undefined, - decrement the count of load commands. */ - if (rw && load_end[-1].load->hdr.ldci_cmd_type == LDC_UNDEFINED) - { - load_end--; - hdr.moh_n_load_cmds--; - } - - /* Go through and process each symbol table section. */ - symbol_load_cmds = 0; - for (load_cmd = load_array; load_cmd < load_end; load_cmd++) - { - load_union_t *load_hdr = load_cmd->load; - - if (load_hdr->hdr.ldci_cmd_type == LDC_SYMBOLS) - { - symbol_load_cmds++; - - if (debug) - { - char *kind = "unknown"; - - switch (load_hdr->sym.symc_kind) - { - case SYMC_IMPORTS: kind = "imports"; break; - case SYMC_DEFINED_SYMBOLS: kind = "defined"; break; - case SYMC_STABS: kind = "stabs"; break; - } - - fprintf (stderr, "\nProcessing symbol table #%d, offset = 0x%.8lx, kind = %s\n", - symbol_load_cmds, load_hdr->hdr.ldci_section_off, kind); - } - - if (load_hdr->sym.symc_kind != SYMC_DEFINED_SYMBOLS) - continue; - - str_sect = load_array[load_hdr->sym.symc_strings_section].section; - if (str_sect == (char *) 0) - fatal ("string section missing"); - - if (load_cmd->section == (char *) 0) - fatal ("section pointer missing"); - - num_syms = load_hdr->sym.symc_nentries; - for (i = 0; i < num_syms; i++) - { - symbol_info_t *sym = ((symbol_info_t *) load_cmd->section) + i; - char *name = sym->si_name.symbol_name + str_sect; - - if (name[0] != '_') - continue; - - if (rw) - { - char *n = name + strlen (name) - strlen (NAME__MAIN); - - if ((n - name) < 0 || strcmp (n, NAME__MAIN)) - continue; - while (n != name) - if (*--n != '_') - continue; - - main_sym = sym; - } - else - { - switch (is_ctor_dtor (name)) - { - case 1: - add_to_list (&constructors, name); - break; - - case 2: - add_to_list (&destructors, name); - break; - - default: /* not a constructor or destructor */ - continue; - } - } - - if (debug) - fprintf (stderr, "\ttype = 0x%.4x, sc = 0x%.2x, flags = 0x%.8x, name = %.30s\n", - sym->si_type, sym->si_sc_type, sym->si_flags, name); - } - } - } - - if (symbol_load_cmds == 0) - fatal ("no symbol table found"); - - /* Update the program file now, rewrite header and load commands. At present, - we assume that there is enough space after the last load command to insert - one more. Since the first section written out is page aligned, and the - number of load commands is small, this is ok for the present. */ - - if (rw) - { - load_union_t *load_map; - size_t size; - - if (cmd_strings == -1) - fatal ("no cmd_strings found"); - - /* Add __main to initializer list. - If we are building a program instead of a shared library, do not - do anything, since in the current version, you cannot do mallocs - and such in the constructors. */ - - if (main_sym != (symbol_info_t *) 0 - && ((hdr.moh_flags & MOH_EXECABLE_F) == 0)) - add_func_table (&hdr, load_array, main_sym, FNTC_INITIALIZATION); - - if (debug) - fprintf (stderr, "\nUpdating header and load commands.\n\n"); - - hdr.moh_n_load_cmds++; - size = sizeof (load_cmd_map_command_t) + (sizeof (mo_offset_t) * (hdr.moh_n_load_cmds - 1)); - - /* Create new load command map. */ - if (debug) - fprintf (stderr, "load command map, %d cmds, new size %ld.\n", - (int)hdr.moh_n_load_cmds, (long)size); - - load_map = (load_union_t *) xcalloc (1, size); - load_map->map.ldc_header.ldci_cmd_type = LDC_CMD_MAP; - load_map->map.ldc_header.ldci_cmd_size = size; - load_map->map.lcm_ld_cmd_strings = cmd_strings; - load_map->map.lcm_nentries = hdr.moh_n_load_cmds; - load_array[hdr.moh_n_load_cmds-1].load = load_map; - - offset = hdr.moh_first_cmd_off; - for (i = 0; i < hdr.moh_n_load_cmds; i++) - { - load_map->map.lcm_map[i] = offset; - if (load_array[i].load->hdr.ldci_cmd_type == LDC_CMD_MAP) - hdr.moh_load_map_cmd_off = offset; - - offset += load_array[i].load->hdr.ldci_cmd_size; - } - - hdr.moh_sizeofcmds = offset - MO_SIZEOF_RAW_HDR; - - if (debug) - print_header (&hdr); - - /* Write header */ - status = encode_mach_o_hdr (&hdr, obj, MO_SIZEOF_RAW_HDR); - if (status != MO_HDR_CONV_SUCCESS) - bad_header (status); - - if (debug) - fprintf (stderr, "writing load commands.\n\n"); - - /* Write load commands */ - offset = hdr.moh_first_cmd_off; - for (i = 0; i < hdr.moh_n_load_cmds; i++) - { - load_union_t *load_hdr = load_array[i].load; - size_t size = load_hdr->hdr.ldci_cmd_size; - - if (debug) - print_load_command (load_hdr, offset, i); - - bcopy ((char *) load_hdr, (char *) (obj + offset), size); - offset += size; - } - } - - end_file (obj_file); - - if (close (prog_fd)) - fatal_perror ("closing %s", prog_name); - - if (debug) - fprintf (stderr, "\n"); -} - - -/* Add a function table to the load commands to call a function - on initiation or termination of the process. */ - -static void -add_func_table (hdr_p, load_array, sym, type) - mo_header_t *hdr_p; /* pointer to global header */ - load_all_t *load_array; /* array of ptrs to load cmds */ - symbol_info_t *sym; /* pointer to symbol entry */ - int type; /* fntc_type value */ -{ - /* Add a new load command. */ - int num_cmds = ++hdr_p->moh_n_load_cmds; - int load_index = num_cmds - 1; - size_t size = sizeof (func_table_command_t) + sizeof (mo_addr_t); - load_union_t *ptr = xcalloc (1, size); - load_all_t *load_cmd; - int i; - - /* Set the unresolved address bit in the header to force the loader to be - used, since kernel exec does not call the initialization functions. */ - hdr_p->moh_flags |= MOH_UNRESOLVED_F; - - load_cmd = &load_array[load_index]; - load_cmd->load = ptr; - load_cmd->section = (char *) 0; - - /* Fill in func table load command. */ - ptr->func.ldc_header.ldci_cmd_type = LDC_FUNC_TABLE; - ptr->func.ldc_header.ldci_cmd_size = size; - ptr->func.ldc_header.ldci_section_off = 0; - ptr->func.ldc_header.ldci_section_len = 0; - ptr->func.fntc_type = type; - ptr->func.fntc_nentries = 1; - - /* copy address, turn it from abs. address to (region,offset) if necessary. */ - /* Is the symbol already expressed as (region, offset)? */ - if ((sym->si_flags & SI_ABSOLUTE_VALUE_F) == 0) - { - ptr->func.fntc_entry_loc[i].adr_lcid = sym->si_value.def_val.adr_lcid; - ptr->func.fntc_entry_loc[i].adr_sctoff = sym->si_value.def_val.adr_sctoff; - } - - /* If not, figure out which region it's in. */ - else - { - mo_vm_addr_t addr = sym->si_value.abs_val; - int found = 0; - - for (i = 0; i < load_index; i++) - { - if (load_array[i].load->hdr.ldci_cmd_type == LDC_REGION) - { - region_command_t *region_ptr = &load_array[i].load->region; - - if ((region_ptr->regc_flags & REG_ABS_ADDR_F) != 0 - && addr >= region_ptr->regc_addr.vm_addr - && addr <= region_ptr->regc_addr.vm_addr + region_ptr->regc_vm_size) - { - ptr->func.fntc_entry_loc[0].adr_lcid = i; - ptr->func.fntc_entry_loc[0].adr_sctoff = addr - region_ptr->regc_addr.vm_addr; - found++; - break; - } - } - } - - if (!found) - fatal ("could not convert 0x%l.8x into a region", addr); - } - - if (debug) - fprintf (stderr, - "%s function, region %d, offset = %ld (0x%.8lx)\n", - (type == FNTC_INITIALIZATION) ? "init" : "term", - (int)ptr->func.fntc_entry_loc[i].adr_lcid, - (long)ptr->func.fntc_entry_loc[i].adr_sctoff, - (long)ptr->func.fntc_entry_loc[i].adr_sctoff); - -} - - -/* Print the global header for an OSF/rose object. */ - -static void -print_header (hdr_ptr) - mo_header_t *hdr_ptr; -{ - fprintf (stderr, "\nglobal header:\n"); - fprintf (stderr, "\tmoh_magic = 0x%.8lx\n", hdr_ptr->moh_magic); - fprintf (stderr, "\tmoh_major_version = %d\n", (int)hdr_ptr->moh_major_version); - fprintf (stderr, "\tmoh_minor_version = %d\n", (int)hdr_ptr->moh_minor_version); - fprintf (stderr, "\tmoh_header_version = %d\n", (int)hdr_ptr->moh_header_version); - fprintf (stderr, "\tmoh_max_page_size = %d\n", (int)hdr_ptr->moh_max_page_size); - fprintf (stderr, "\tmoh_byte_order = %d\n", (int)hdr_ptr->moh_byte_order); - fprintf (stderr, "\tmoh_data_rep_id = %d\n", (int)hdr_ptr->moh_data_rep_id); - fprintf (stderr, "\tmoh_cpu_type = %d\n", (int)hdr_ptr->moh_cpu_type); - fprintf (stderr, "\tmoh_cpu_subtype = %d\n", (int)hdr_ptr->moh_cpu_subtype); - fprintf (stderr, "\tmoh_vendor_type = %d\n", (int)hdr_ptr->moh_vendor_type); - fprintf (stderr, "\tmoh_load_map_cmd_off = %d\n", (int)hdr_ptr->moh_load_map_cmd_off); - fprintf (stderr, "\tmoh_first_cmd_off = %d\n", (int)hdr_ptr->moh_first_cmd_off); - fprintf (stderr, "\tmoh_sizeofcmds = %d\n", (int)hdr_ptr->moh_sizeofcmds); - fprintf (stderr, "\tmon_n_load_cmds = %d\n", (int)hdr_ptr->moh_n_load_cmds); - fprintf (stderr, "\tmoh_flags = 0x%.8lx", (long)hdr_ptr->moh_flags); - - if (hdr_ptr->moh_flags & MOH_RELOCATABLE_F) - fprintf (stderr, ", relocatable"); - - if (hdr_ptr->moh_flags & MOH_LINKABLE_F) - fprintf (stderr, ", linkable"); - - if (hdr_ptr->moh_flags & MOH_EXECABLE_F) - fprintf (stderr, ", execable"); - - if (hdr_ptr->moh_flags & MOH_EXECUTABLE_F) - fprintf (stderr, ", executable"); - - if (hdr_ptr->moh_flags & MOH_UNRESOLVED_F) - fprintf (stderr, ", unresolved"); - - fprintf (stderr, "\n\n"); - return; -} - - -/* Print a short summary of a load command. */ - -static void -print_load_command (load_hdr, offset, number) - load_union_t *load_hdr; - size_t offset; - int number; -{ - mo_long_t type = load_hdr->hdr.ldci_cmd_type; - char *type_str = (char *) 0; - - switch (type) - { - case LDC_UNDEFINED: type_str = "UNDEFINED"; break; - case LDC_CMD_MAP: type_str = "CMD_MAP"; break; - case LDC_INTERPRETER: type_str = "INTERPRETER"; break; - case LDC_STRINGS: type_str = "STRINGS"; break; - case LDC_REGION: type_str = "REGION"; break; - case LDC_RELOC: type_str = "RELOC"; break; - case LDC_PACKAGE: type_str = "PACKAGE"; break; - case LDC_SYMBOLS: type_str = "SYMBOLS"; break; - case LDC_ENTRY: type_str = "ENTRY"; break; - case LDC_FUNC_TABLE: type_str = "FUNC_TABLE"; break; - case LDC_GEN_INFO: type_str = "GEN_INFO"; break; - } - - fprintf (stderr, - "cmd %2d, sz: 0x%.2lx, coff: 0x%.3lx, doff: 0x%.6lx, dlen: 0x%.6lx", - number, - (long) load_hdr->hdr.ldci_cmd_size, - (long) offset, - (long) load_hdr->hdr.ldci_section_off, - (long) load_hdr->hdr.ldci_section_len); - - if (type_str == (char *) 0) - fprintf (stderr, ", ty: unknown (%ld)\n", (long) type); - - else if (type != LDC_REGION) - fprintf (stderr, ", ty: %s\n", type_str); - - else - { - char *region = ""; - switch (load_hdr->region.regc_usage_type) - { - case REG_TEXT_T: region = ", .text"; break; - case REG_DATA_T: region = ", .data"; break; - case REG_BSS_T: region = ", .bss"; break; - case REG_GLUE_T: region = ", .glue"; break; -#if defined (REG_RDATA_T) && defined (REG_SDATA_T) && defined (REG_SBSS_T) /*mips*/ - case REG_RDATA_T: region = ", .rdata"; break; - case REG_SDATA_T: region = ", .sdata"; break; - case REG_SBSS_T: region = ", .sbss"; break; -#endif - } - - fprintf (stderr, ", ty: %s, vaddr: 0x%.8lx, vlen: 0x%.6lx%s\n", - type_str, - (long) load_hdr->region.regc_vm_addr, - (long) load_hdr->region.regc_vm_size, - region); - } - - return; -} - - -/* Fatal error when {en,de}code_mach_o_header fails. */ - -static void -bad_header (status) - int status; -{ - char *msg = (char *) 0; - - switch (status) - { - case MO_ERROR_BAD_MAGIC: msg = "bad magic number"; break; - case MO_ERROR_BAD_HDR_VERS: msg = "bad header version"; break; - case MO_ERROR_BAD_RAW_HDR_VERS: msg = "bad raw header version"; break; - case MO_ERROR_BUF2SML: msg = "raw header buffer too small"; break; - case MO_ERROR_OLD_RAW_HDR_FILE: msg = "old raw header file"; break; - case MO_ERROR_UNSUPPORTED_VERS: msg = "unsupported version"; break; - } - - if (msg == (char *) 0) - fatal ("unknown {de,en}code_mach_o_hdr return value %d", status); - else - fatal ("%s", msg); -} - - -/* Read a file into a memory buffer. */ - -static struct file_info * -read_file (name, fd, rw) - char *name; /* filename */ - int fd; /* file descriptor */ - int rw; /* read/write */ -{ - struct stat stat_pkt; - struct file_info *p = (struct file_info *) xcalloc (sizeof (struct file_info), 1); -#ifdef USE_MMAP - static int page_size; -#endif - - if (fstat (fd, &stat_pkt) < 0) - fatal_perror ("fstat %s", name); - - p->name = name; - p->size = stat_pkt.st_size; - p->rounded_size = stat_pkt.st_size; - p->fd = fd; - p->rw = rw; - -#ifdef USE_MMAP - if (debug) - fprintf (stderr, "mmap %s, %s\n", name, (rw) ? "read/write" : "read-only"); - - if (page_size == 0) - page_size = sysconf (_SC_PAGE_SIZE); - - p->rounded_size = ((p->size + page_size - 1) / page_size) * page_size; - p->start = mmap ((caddr_t) 0, - (rw) ? p->rounded_size : p->size, - (rw) ? (PROT_READ | PROT_WRITE) : PROT_READ, - MAP_FILE | MAP_VARIABLE | MAP_SHARED, - fd, - 0L); - - if (p->start != (char *) 0 && p->start != (char *) -1) - p->use_mmap = 1; - - else -#endif /* USE_MMAP */ - { - long len; - - if (debug) - fprintf (stderr, "read %s\n", name); - - p->use_mmap = 0; - p->start = xmalloc (p->size); - if (lseek (fd, 0L, SEEK_SET) < 0) - fatal_perror ("lseek to 0 on %s", name); - - len = read (fd, p->start, p->size); - if (len < 0) - fatal_perror ("read %s", name); - - if (len != p->size) - fatal ("read %ld bytes, expected %ld, from %s", len, p->size, name); - } - - return p; -} - -/* Do anything necessary to write a file back from memory. */ - -static void -end_file (ptr) - struct file_info *ptr; /* file information block */ -{ -#ifdef USE_MMAP - if (ptr->use_mmap) - { - if (ptr->rw) - { - if (debug) - fprintf (stderr, "msync %s\n", ptr->name); - - if (msync (ptr->start, ptr->rounded_size, MS_ASYNC)) - fatal_perror ("msync %s", ptr->name); - } - - if (debug) - fprintf (stderr, "munmap %s\n", ptr->name); - - if (munmap (ptr->start, ptr->size)) - fatal_perror ("munmap %s", ptr->name); - } - else -#endif /* USE_MMAP */ - { - if (ptr->rw) - { - long len; - - if (debug) - fprintf (stderr, "write %s\n", ptr->name); - - if (lseek (ptr->fd, 0L, SEEK_SET) < 0) - fatal_perror ("lseek to 0 on %s", ptr->name); - - len = write (ptr->fd, ptr->start, ptr->size); - if (len < 0) - fatal_perror ("write %s", ptr->name); - - if (len != ptr->size) - fatal ("wrote %ld bytes, expected %ld, to %s", len, ptr->size, ptr->name); - } - - free (ptr->start); - } - - free (ptr); -} - -#endif /* OBJECT_FORMAT_ROSE */ diff --git a/gcc/collect2.h b/gcc/collect2.h deleted file mode 100755 index 04844bc..0000000 --- a/gcc/collect2.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Header file for collect/tlink routines. - Copyright (C) 1998 Free Software Foundation, Inc. - -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 -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#ifndef __COLLECT2_H__ -#define __COLLECT2_H__ - -extern void do_tlink PARAMS ((char **, char **)); - -extern void collect_execute PARAMS ((char *, char **, char *)); - -extern void collect_exit PARAMS ((int)) ATTRIBUTE_NORETURN; - -extern int collect_wait PARAMS ((char *)); - -extern void dump_file PARAMS ((char *)); - -extern int file_exists PARAMS ((char *)); - -#endif /* ! __COLLECT2_H__ */ diff --git a/gcc/config/arm/t-arm-elf b/gcc/config/arm/t-arm-elf index 5890380..b57eeca 100755 --- a/gcc/config/arm/t-arm-elf +++ b/gcc/config/arm/t-arm-elf @@ -4,8 +4,6 @@ LIB1ASMSRC = arm/lib1funcs.asm LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _call_via_rX # END CYGNUS LOCAL interworking -EXTRA_PARTS = crtbegin.o crtend.o - # These are really part of libgcc1, but this will cause them to be # built correctly, so... @@ -30,7 +28,6 @@ MULTILIB_OPTIONS = mlittle-endian/mbig-endian mhard-float/msoft-float mapcs-32/ MULTILIB_DIRNAMES = le be fpu soft 32bit 26bit normal interwork elf under nofmult MULTILIB_EXCEPTIONS = *mapcs-26/*mthumb-interwork* *mthumb-interwork*/*mcpu=arm7* MULTILIB_MATCHES = mbig-endian=mbe mlittle-endian=mle mcpu?arm7=mcpu?arm7d mcpu?arm7=mcpu?arm7di mcpu?arm7=mcpu?arm70 mcpu?arm7=mcpu?arm700 mcpu?arm7=mcpu?arm700i mcpu?arm7=mcpu?arm710 mcpu?arm7=mcpu?arm710c mcpu?arm7=mcpu?arm7100 mcpu?arm7=mcpu?arm7500 mcpu?arm7=mcpu?arm7500fe mcpu?arm7=mcpu?arm6 mcpu?arm7=mcpu?arm60 mcpu?arm7=mcpu?arm600 mcpu?arm7=mcpu?arm610 mcpu?arm7=mcpu?arm620 -EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o LIBGCC = stmp-multilib INSTALL_LIBGCC = install-multilib # END CYGNUS LOCAL diff --git a/gcc/config/arm/t-thumb-elf b/gcc/config/arm/t-thumb-elf index 57b5d7b..2f5054d 100755 --- a/gcc/config/arm/t-thumb-elf +++ b/gcc/config/arm/t-thumb-elf @@ -4,7 +4,6 @@ LIB1ASMSRC = arm/lib1thumb.asm LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _call_via_rX _interwork_call_via_rX # adddi3/subdi3 added to machine description -EXTRA_PARTS=crtbegin.o crtend.o # These are really part of libgcc1, but this will cause them to be # built correctly, so... @@ -28,7 +27,6 @@ dp-bit.c: $(srcdir)/config/fp-bit.c MULTILIB_OPTIONS = mlittle-endian/mbig-endian mno-thumb-interwork/mthumb-interwork fno-leading-underscore/fleading-underscore MULTILIB_DIRNAMES = le be normal interwork elf under MULTILIB_MATCHES = mbig-endian=mbe mlittle-endian=mle -EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o LIBGCC = stmp-multilib INSTALL_LIBGCC = install-multilib diff --git a/gcc/configure b/gcc/configure index d2d1749..05c0782 100755 --- a/gcc/configure +++ b/gcc/configure @@ -2819,8 +2819,6 @@ for machine in $build $host $target; do extra_gcc_objs= xm_defines= float_format= - # Set this to force installation and use of collect2. - use_collect2= # Set this to override the default target model. target_cpu_default= # Set this to control which fixincludes program to use. @@ -2895,2578 +2893,11 @@ for machine in $build $host $target; do case $machine in # Support site-specific machine types. - *local*) - cpu_type=`echo $machine | sed -e 's/-.*//'` - rest=`echo $machine | sed -e "s/$cpu_type-//"` - xm_file=${cpu_type}/xm-$rest.h - tm_file=${cpu_type}/$rest.h - if test -f $srcdir/config/${cpu_type}/x-$rest; \ - then xmake_file=${cpu_type}/x-$rest; \ - else true; \ - fi - if test -f $srcdir/config/${cpu_type}/t-$rest; \ - then tmake_file=${cpu_type}/t-$rest; \ - else true; \ - fi - ;; - 1750a-*-*) - ;; - a29k-*-bsd* | a29k-*-sym1*) - tm_file="${tm_file} a29k/unix.h" - xm_defines=USG - xmake_file=a29k/x-unix - use_collect2=yes - ;; - a29k-*-udi | a29k-*-coff) - tm_file="${tm_file} dbxcoff.h a29k/udi.h" - tmake_file=a29k/t-a29kbare - ;; - a29k-wrs-vxworks*) - tm_file="${tm_file} dbxcoff.h a29k/udi.h a29k/vx29k.h" - tmake_file=a29k/t-vx29k - extra_parts="crtbegin.o crtend.o" - thread_file='vxworks' - ;; - a29k-*-*) # Default a29k environment. - use_collect2=yes - ;; - alpha*-*-linux-gnuecoff*) - tm_file="${tm_file} alpha/linux-ecoff.h alpha/linux.h" - target_cpu_default="MASK_GAS" - gas=no - xmake_file=none - gas=yes gnu_ld=yes - ;; - alpha*-*-linux-gnulibc1*) - tm_file="${tm_file} alpha/elf.h alpha/linux.h alpha/linux-elf.h" - target_cpu_default="MASK_GAS" - tmake_file="t-linux t-linux-gnulibc1 alpha/t-linux alpha/t-crtbe" - extra_parts="crtbegin.o crtend.o" - fixincludes=fixinc.wrap - xmake_file=none - gas=yes gnu_ld=yes - if test x$enable_threads = xyes; then - thread_file='posix' - fi - ;; - alpha*-*-linux-gnu*) - tm_file="${tm_file} alpha/elf.h alpha/linux.h alpha/linux-elf.h" - target_cpu_default="MASK_GAS" - tmake_file="t-linux alpha/t-linux alpha/t-crtbe" - extra_parts="crtbegin.o crtend.o" - xmake_file=none - fixincludes=Makefile.in - gas=yes gnu_ld=yes - if test x$enable_threads = xyes; then - thread_file='posix' - fi - ;; - alpha*-*-netbsd*) - tm_file="${tm_file} alpha/elf.h alpha/netbsd.h alpha/netbsd-elf.h" - target_cpu_default="MASK_GAS" - tmake_file="alpha/t-crtbe" - extra_parts="crtbegin.o crtend.o" - xmake_file=none - fixincludes=fixinc.wrap - gas=yes gnu_ld=yes - ;; - - alpha*-dec-osf*) - if test x$stabs = xyes - then - tm_file="${tm_file} dbx.h" - fi - if test x$gas != xyes - then - extra_passes="mips-tfile mips-tdump" - fi - use_collect2=yes - case $machine in - *-*-osf1*) - tm_file="${tm_file} alpha/osf.h alpha/osf12.h alpha/osf2or3.h" - ;; - *-*-osf[23]*) - tm_file="${tm_file} alpha/osf.h alpha/osf2or3.h" - ;; - *-*-osf4*) - tm_file="${tm_file} alpha/osf.h" - # Some versions of OSF4 (specifically X4.0-9 296.7) have - # a broken tar, so we use cpio instead. - install_headers_dir=install-headers-cpio - ;; - esac - case $machine in - *-*-osf4.0[b-z] | *-*-osf4.[1-9]*) - target_cpu_default=MASK_SUPPORT_ARCH - ;; - esac - ;; - alpha*-*-vxworks*) - tm_file="${tm_file} dbx.h alpha/vxworks.h" - if x$gas != xyes - then - extra_passes="mips-tfile mips-tdump" - fi - use_collect2=yes - ;; - alpha*-*-winnt*) - tm_file="${tm_file} alpha/win-nt.h" - xm_file="${xm_file} config/winnt/xm-winnt.h alpha/xm-winnt.h" - tmake_file=t-libc-ok - xmake_file=winnt/x-winnt - extra_host_objs=oldnames.o - extra_gcc_objs="spawnv.o oldnames.o" - fixincludes=fixinc.winnt - if test x$gnu_ld != xyes - then - extra_programs=ld.exe - fi - if test x$enable_threads = xyes; then - thread_file='win32' - fi - ;; - alpha*-dec-vms*) - tm_file=alpha/vms.h - xm_file="${xm_file} alpha/xm-vms.h" - tmake_file=alpha/t-vms - fixincludes=Makefile.in - ;; - arc-*-elf*) - extra_parts="crtinit.o crtfini.o" - ;; - arm-*-coff* | armel-*-coff*) - tm_file=arm/coff.h - tmake_file=arm/t-bare - ;; - arm-*-riscix1.[01]*) # Acorn RISC machine (early versions) - tm_file=arm/riscix1-1.h - use_collect2=yes - ;; - arm-*-riscix*) # Acorn RISC machine - if test x$gas = xyes - then - tm_file=arm/rix-gas.h - else - tm_file=arm/riscix.h - fi - xmake_file=arm/x-riscix - tmake_file=arm/t-riscix - use_collect2=yes - ;; - arm-semi-aout | armel-semi-aout) - tm_file=arm/semi.h - tmake_file=arm/t-semi - fixincludes=Makefile.in # There is nothing to fix - ;; - arm-semi-aof | armel-semi-aof) - tm_file=arm/semiaof.h - tmake_file=arm/t-semiaof - fixincludes=Makefile.in # There is nothing to fix - ;; - arm*-*-netbsd*) - tm_file=arm/netbsd.h - xm_file="arm/xm-netbsd.h ${xm_file}" - tmake_file="t-netbsd arm/t-netbsd" - # On NetBSD, the headers are already okay, except for math.h. - fixincludes=fixinc.wrap - ;; - arm*-*-linux-gnuaout*) # ARM GNU/Linux with a.out - cpu_type=arm - xmake_file=x-linux - tm_file=arm/linux-aout.h - tmake_file=arm/t-linux - fixincludes=Makefile.in - gnu_ld=yes - ;; - arm*-*-linux-gnu*) # ARM GNU/Linux with ELF - xm_file=arm/xm-linux.h - xmake_file=x-linux - case $machine in - armv2*-*-*) - tm_file=arm/linux-elf26.h - ;; - *) - tm_file=arm/linux-elf.h - ;; - esac - tmake_file="t-linux arm/t-linux" - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - fixincludes=Makefile.in # Nothing to fix - gnu_ld=yes - ;; - arm*-*-aout) - tm_file=arm/aout.h - tmake_file=arm/t-bare - ;; - arm*-*-ecos-elf) - tm_file=arm/ecos-elf.h - tmake_file=arm/t-elf - ;; - arm*-*-elf) - tm_file=arm/unknown-elf.h - tmake_file=arm/t-arm-elf - ;; - arm*-*-oabi) - tm_file=arm/unknown-elf-oabi.h - tmake_file=arm/t-arm-elf - ;; - c1-convex-*) # Convex C1 - target_cpu_default=1 - use_collect2=yes - fixincludes=Makefile.in - ;; - c2-convex-*) # Convex C2 - target_cpu_default=2 - use_collect2=yes - fixincludes=Makefile.in - ;; - c32-convex-*) - target_cpu_default=4 - use_collect2=yes - fixincludes=Makefile.in - ;; - c34-convex-*) - target_cpu_default=8 - use_collect2=yes - fixincludes=Makefile.in - ;; - c38-convex-*) - target_cpu_default=16 - use_collect2=yes - fixincludes=Makefile.in - ;; - c4x-*) - cpu_type=c4x - tmake_file=c4x/t-c4x - ;; - clipper-intergraph-clix*) - tm_file="${tm_file} svr3.h clipper/clix.h" - xm_file=clipper/xm-clix.h - xmake_file=clipper/x-clix - extra_headers=va-clipper.h - extra_parts="crtbegin.o crtend.o" - install_headers_dir=install-headers-cpio - ;; - dsp16xx-*) - ;; - elxsi-elxsi-*) - use_collect2=yes - ;; -# This hasn't been upgraded to GCC 2. -# fx80-alliant-*) # Alliant FX/80 -# ;; - h8300-*-*) - float_format=i32 - ;; - hppa1.1-*-pro*) - tm_file="pa/pa-pro.h ${tm_file} pa/pa-pro-end.h libgloss.h" - xm_file=pa/xm-papro.h - tmake_file=pa/t-pro - ;; - hppa1.1-*-osf*) - target_cpu_default=1 - tm_file="${tm_file} pa/pa-osf.h" - use_collect2=yes - fixincludes=Makefile.in - ;; - hppa1.1-*-rtems*) - tm_file="pa/pa-pro.h ${tm_file} pa/pa-pro-end.h libgloss.h pa/rtems.h" - xm_file=pa/xm-papro.h - tmake_file=pa/t-pro - ;; - hppa1.0-*-osf*) - tm_file="${tm_file} pa/pa-osf.h" - use_collect2=yes - fixincludes=Makefile.in - ;; - hppa1.1-*-bsd*) - target_cpu_default=1 - use_collect2=yes - fixincludes=Makefile.in - ;; - hppa1.0-*-bsd*) - use_collect2=yes - fixincludes=Makefile.in - ;; - hppa1.0-*-hpux7*) - tm_file="pa/pa-oldas.h ${tm_file} pa/pa-hpux7.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if test x$gas = xyes - then - tm_file="${tm_file} pa/gas.h" - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.0-*-hpux8.0[0-2]*) - tm_file="${tm_file} pa/pa-hpux.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if test x$gas = xyes - then - tm_file="${tm_file} pa/pa-gas.h" - else - tm_file="pa/pa-oldas.h ${tm_file}" - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.1-*-hpux8.0[0-2]*) - target_cpu_default=1 - tm_file="${tm_file} pa/pa-hpux.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if test x$gas = xyes - then - tm_file="${tm_file} pa/pa-gas.h" - else - tm_file="pa/pa-oldas.h ${tm_file}" - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.1-*-hpux8*) - target_cpu_default=1 - tm_file="${tm_file} pa/pa-hpux.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if test x$gas = xyes - then - tm_file="${tm_file} pa/pa-gas.h" - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.0-*-hpux8*) - tm_file="${tm_file} pa/pa-hpux.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if test x$gas = xyes - then - tm_file="${tm_file} pa/pa-gas.h" - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.1-*-hpux10* | hppa2*-*-hpux10*) - target_cpu_default=1 - tm_file="${tm_file} pa/pa-hpux.h pa/pa-hpux10.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - tmake_file=pa/t-pa - if test x$gas = xyes - then - tm_file="${tm_file} pa/pa-gas.h" - fi - if test x$enable_threads = x; then - enable_threads=$have_pthread_h - fi - if test x$enable_threads = xyes; then - thread_file='dce' - tmake_file="${tmake_file} pa/t-dce-thr" - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.0-*-hpux10*) - tm_file="${tm_file} pa/pa-hpux.h pa/pa-hpux10.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if test x$gas = xyes - then - tm_file="${tm_file} pa/pa-gas.h" - fi - if test x$enable_threads = x; then - enable_threads=$have_pthread_h - fi - if test x$enable_threads = xyes; then - thread_file='dce' - tmake_file="${tmake_file} pa/t-dce-thr" - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - # CYGNUS LOCAL hpux11 - hppa1.1-*-hpux11* | hppa2*-*-hpux11*) - target_cpu_default=1 - tm_file="${tm_file} pa/pa-hpux.h pa/pa-hpux11.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - tmake_file=pa/t-pa - if [ x$gas = xyes ] - then - tm_file="${tm_file} pa/pa-gas.h" - fi -# if [[ x$enable_threads = x ]]; then -# enable_threads=$have_pthread_h -# fi -# if [[ x$enable_threads = xyes ]]; then -# thread_file='dce' -# tmake_file="${tmake_file} pa/t-dce-thr" -# fi - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.0-*-hpux11*) - tm_file="${tm_file} pa/pa-hpux.h pa/pa-hpux11.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if [ x$gas = xyes ] - then - tm_file="${tm_file} pa/pa-gas.h" - fi -# if [[ x$enable_threads = x ]]; then -# enable_threads=$have_pthread_h -# fi -# if [[ x$enable_threads = xyes ]]; then -# thread_file='dce' -# tmake_file="${tmake_file} pa/t-dce-thr" -# fi - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - # END CYGNUS LOCAL - hppa1.1-*-hpux* | hppa2*-*-hpux*) - target_cpu_default=1 - tm_file="${tm_file} pa/pa-hpux.h pa/pa-hpux9.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if test x$gas = xyes - then - tm_file="${tm_file} pa/pa-gas.h" - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.0-*-hpux*) - tm_file="${tm_file} pa/pa-hpux.h pa/pa-hpux9.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if test x$gas = xyes - then - tm_file="${tm_file} pa/pa-gas.h" - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.1-*-hiux* | hppa2*-*-hiux*) - target_cpu_default=1 - tm_file="${tm_file} pa/pa-hpux.h pa/pa-hiux.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if test x$gas = xyes - then - tm_file="${tm_file} pa/pa-gas.h" - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.0-*-hiux*) - tm_file="${tm_file} pa/pa-hpux.h pa/pa-hiux.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if test x$gas = xyes - then - tm_file="${tm_file} pa/pa-gas.h" - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa*-*-lites*) - target_cpu_default=1 - use_collect2=yes - fixincludes=Makefile.in - ;; - i370-*-mvs*) - ;; - i[34567]86-ibm-aix*) # IBM PS/2 running AIX - if test x$gas = xyes - then - tm_file=i386/aix386.h - extra_parts="crtbegin.o crtend.o" - tmake_file=i386/t-crtstuff - else - tm_file=i386/aix386ng.h - use_collect2=yes - fi - xm_file="xm-alloca.h i386/xm-aix.h ${xm_file}" - xm_defines=USG - xmake_file=i386/x-aix - ;; - i[34567]86-ncr-sysv4*) # NCR 3000 - ix86 running system V.4 - xm_file="xm-siglist.h xm-alloca.h ${xm_file}" - xm_defines="USG POSIX SMALL_ARG_MAX" - xmake_file=i386/x-ncr3000 - if test x$stabs = xyes -a x$gas = xyes - then - tm_file=i386/sysv4gdb.h - else - tm_file=i386/sysv4.h - fi - extra_parts="crtbegin.o crtend.o" - tmake_file=i386/t-crtpic - ;; - i[34567]86-next-*) - tm_file=i386/next.h - xm_file=i386/xm-next.h - tmake_file=i386/t-next - xmake_file=i386/x-next - extra_objs=nextstep.o - extra_parts="crtbegin.o crtend.o" - if test x$enable_threads = xyes; then - thread_file='mach' - fi - ;; - i[34567]86-sequent-bsd*) # 80386 from Sequent - use_collect2=yes - if test x$gas = xyes - then - tm_file=i386/seq-gas.h - else - tm_file=i386/sequent.h - fi - ;; - i[34567]86-sequent-ptx1*) - xm_defines="USG SVR3" - xmake_file=i386/x-sysv3 - tm_file=i386/seq-sysv3.h - tmake_file=i386/t-crtstuff - fixincludes=fixinc.ptx - extra_parts="crtbegin.o crtend.o" - install_headers_dir=install-headers-cpio - ;; - i[34567]86-sequent-ptx2* | i[34567]86-sequent-sysv3*) - xm_defines="USG SVR3" - xmake_file=i386/x-sysv3 - tm_file=i386/seq2-sysv3.h - tmake_file=i386/t-crtstuff - extra_parts="crtbegin.o crtend.o" - fixincludes=fixinc.ptx - install_headers_dir=install-headers-cpio - ;; - i[34567]86-sequent-ptx4* | i[34567]86-sequent-sysv4*) - xm_file="xm-siglist.h xm-alloca.h ${xm_file}" - xm_defines="USG POSIX SMALL_ARG_MAX" - xmake_file=x-svr4 - tm_file=i386/ptx4-i.h - tmake_file=t-svr4 - extra_parts="crtbegin.o crtend.o" - fixincludes=fixinc.ptx - install_headers_dir=install-headers-cpio - ;; - i386-sun-sunos*) # Sun i386 roadrunner - xm_defines=USG - tm_file=i386/sun.h - use_collect2=yes - ;; - i[34567]86-wrs-vxworks*) - tm_file=i386/vxi386.h - tmake_file=i386/t-i386bare - ;; - i[34567]86-*-aout*) - tm_file=i386/i386-aout.h - tmake_file=i386/t-i386bare - ;; - i[34567]86-*-bsdi* | i[34567]86-*-bsd386*) - tm_file=i386/bsd386.h -# tmake_file=t-libc-ok - ;; - i[34567]86-*-bsd*) - tm_file=i386/386bsd.h -# tmake_file=t-libc-ok -# Next line turned off because both 386BSD and BSD/386 use GNU ld. -# use_collect2=yes - ;; - i[34567]86-*-freebsdelf*) - tm_file="i386/i386.h i386/att.h linux.h i386/freebsd-elf.h i386/perform.h" - # On FreeBSD, the headers are already ok, except for math.h. - fixincludes=fixinc.wrap - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - tmake_file=i386/t-freebsd - gas=yes - gnu_ld=yes - stabs=yes - ;; - i[34567]86-*-freebsd*) - tm_file=i386/freebsd.h - # On FreeBSD, the headers are already ok, except for math.h. - fixincludes=fixinc.wrap - tmake_file=i386/t-freebsd - ;; - # We are hoping OpenBSD is still close enough to NetBSD that we can - # share the configurations. - i[34567]86-*-netbsd* | i[34567]86-*-openbsd*) - tm_file=i386/netbsd.h - # On NetBSD, the headers are already okay, except for math.h. - fixincludes=fixinc.wrap - tmake_file=t-netbsd - ;; - i[34567]86-*-coff*) - tm_file=i386/i386-coff.h - tmake_file=i386/t-i386bare - ;; - i[34567]86-*-isc*) # 80386 running ISC system - xm_file="${xm_file} i386/xm-isc.h" - xm_defines="USG SVR3" - case $machine in - i[34567]86-*-isc[34]*) - xmake_file=i386/x-isc3 - ;; - *) - xmake_file=i386/x-isc - ;; - esac - if test x$gas = xyes -a x$stabs = xyes - then - tm_file=i386/iscdbx.h - tmake_file=i386/t-svr3dbx - extra_parts="svr3.ifile svr3z.ifile" - else - tm_file=i386/isccoff.h - tmake_file=i386/t-crtstuff - extra_parts="crtbegin.o crtend.o" - fi - install_headers_dir=install-headers-cpio - ;; - i[34567]86-*-linux-gnuoldld*) # Intel 80386's running GNU/Linux - # pre BFD linkers - xmake_file=x-linux-aout - tmake_file="t-linux-aout i386/t-crtstuff" - tm_file=i386/linux-oldld.h - fixincludes=fixinc.x86-linux-gnu - gnu_ld=yes - float_format=i386 - ;; - i[34567]86-*-linux-gnuaout*) # Intel 80386's running GNU/Linux - xmake_file=x-linux-aout - tmake_file="t-linux-aout i386/t-crtstuff" - tm_file=i386/linux-aout.h - fixincludes=fixinc.x86-linux-gnu - gnu_ld=yes - float_format=i386 - ;; - i[34567]86-*-linux-gnulibc1) # Intel 80386's running GNU/Linux - # GNU/Linux C library 5 - xmake_file=x-linux - tm_file=i386/linux.h - tmake_file="t-linux t-linux-gnulibc1 i386/t-crtstuff" - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - fixincludes=fixinc.x86-linux-gnu - gnu_ld=yes - float_format=i386 - if test x$enable_threads = xyes; then - thread_file='single' - fi - ;; - i[34567]86-*-linux-gnu*) # Intel 80386's running GNU/Linux - # aka GNU/Linux C library 6 - xmake_file=x-linux - tm_file=i386/linux.h - tmake_file="t-linux i386/t-crtstuff" - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - fixincludes=fixinc.x86-linux-gnu - gnu_ld=yes - float_format=i386 - if test x$enable_threads = xyes; then - thread_file='posix' - fi - ;; - i[34567]86-*-gnu*) - ;; - i[34567]86-go32-msdos | i[34567]86-*-go32*) - xm_file=i386/xm-go32.h - tm_file=i386/go32.h - xmake_file=i386/x-go32 # CYGNUS LOCAL - tmake_file=i386/t-go32 - ;; - i[34567]86-pc-msdosdjgpp*) - xm_file=i386/xm-go32.h - tm_file=i386/go32.h - tmake_file=i386/t-go32 - xmake_file=i386/x-go32 - gnu_ld=yes - gas=yes - exeext=.exe - case $host in - *pc-msdosdjgpp*) - target_alias=djgpp - ;; - esac - ;; - i[34567]86-moss-msdos* | i[34567]86-*-moss*) - tm_file=i386/moss.h - tmake_file=t-libc-ok - fixincludes=Makefile.in - gnu_ld=yes - gas=yes - ;; - i[34567]86-*-lynxos*) - if test x$gas = xyes - then - tm_file=i386/lynx.h - else - tm_file=i386/lynx-ng.h - fi - xm_file=i386/xm-lynx.h - tmake_file=i386/t-i386bare - xmake_file=x-lynx - ;; - i[34567]86-*-mach*) - tm_file=i386/mach.h -# tmake_file=t-libc-ok - use_collect2=yes - ;; - i[34567]86-*-osfrose*) # 386 using OSF/rose - if test x$elf = xyes - then - tm_file=i386/osfelf.h - use_collect2= - else - tm_file=i386/osfrose.h - use_collect2=yes - fi - xm_file="i386/xm-osf.h ${xm_file}" - xmake_file=i386/x-osfrose - tmake_file=i386/t-osf - extra_objs=halfpic.o - ;; - i[34567]86-go32-rtems*) - cpu_type=i386 - xm_file=i386/xm-go32.h - tm_file=i386/go32-rtems.h - tmake_file="i386/t-go32 t-rtems" - ;; - i[34567]86-*-rtemself*) - cpu_type=i386 - tm_file=i386/rtemself.h - tmake_file="i386/t-i386bare t-rtems" - ;; - i[34567]86-*-rtems*) - cpu_type=i386 - tm_file=i386/rtems.h - tmake_file="i386/t-i386bare t-rtems" - ;; - i[34567]86-*-sco3.2v5*) # 80386 running SCO Open Server 5 - xm_file="xm-siglist.h xm-alloca.h ${xm_file} i386/xm-sco5.h" - xm_defines="USG SVR3" - xmake_file=i386/x-sco5 - fixincludes=fixinc.sco - install_headers_dir=install-headers-cpio - tm_file=i386/sco5.h - if test x$gas = xyes - then - tm_file="i386/sco5gas.h ${tm_file}" - tmake_file=i386/t-sco5gas - else - tmake_file=i386/t-sco5 - fi - extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o" - ;; - i[34567]86-*-sco3.2v4*) # 80386 running SCO 3.2v4 system - xm_file="${xm_file} i386/xm-sco.h" - xm_defines="USG SVR3 BROKEN_LDEXP SMALL_ARG_MAX NO_SYS_SIGLIST" - xmake_file=i386/x-sco4 - fixincludes=fixinc.sco - install_headers_dir=install-headers-cpio - if test x$stabs = xyes - then - tm_file=i386/sco4dbx.h - tmake_file=i386/t-svr3dbx - extra_parts="svr3.ifile svr3z.rfile" - else - tm_file=i386/sco4.h - tmake_file=i386/t-crtstuff - extra_parts="crtbegin.o crtend.o" - fi - truncate_target=yes - ;; - i[34567]86-*-sco*) # 80386 running SCO system - xm_file=i386/xm-sco.h - xmake_file=i386/x-sco - install_headers_dir=install-headers-cpio - if test x$stabs = xyes - then - tm_file=i386/scodbx.h - tmake_file=i386/t-svr3dbx - extra_parts="svr3.ifile svr3z.rfile" - else - tm_file=i386/sco.h - extra_parts="crtbegin.o crtend.o" - tmake_file=i386/t-crtstuff - fi - truncate_target=yes - ;; - i[34567]86-*-solaris2*) - xm_file="xm-siglist.h xm-alloca.h ${xm_file}" - xm_defines="USG POSIX SMALL_ARG_MAX" - if test x$stabs = xyes - then - tm_file=i386/sol2dbg.h - else - tm_file=i386/sol2.h - fi - tmake_file=i386/t-sol2 - extra_parts="crt1.o crti.o crtn.o gcrt1.o gmon.o crtbegin.o crtend.o" - xmake_file=x-svr4 - case $machine in - *-*-solaris2.[0-4]) - fixincludes=fixinc.svr4;; - *) - fixincludes=fixinc.wrap;; - esac - if test x$enable_threads = xyes; then - thread_file='solaris' - fi - ;; - i[34567]86-*-sysv5*) # Intel x86 on System V Release 5 - xm_file="xm-alloca.h xm-siglist.h ${xm_file}" - xm_defines="USG POSIX" - tm_file=i386/sysv4.h - if test x$stabs = xyes - then - tm_file="${tm_file} dbx.h" - fi - tmake_file=i386/t-crtpic - xmake_file=x-svr4 - extra_parts="crtbegin.o crtend.o" - fixincludes=fixinc.svr4 - ;; - i[34567]86-*-sysv4*) # Intel 80386's running system V.4 - xm_file="xm-siglist.h xm-alloca.h ${xm_file}" - xm_defines="USG POSIX SMALL_ARG_MAX" - tm_file=i386/sysv4.h - if test x$stabs = xyes - then - tm_file="${tm_file} dbx.h" - fi - tmake_file=i386/t-crtpic - xmake_file=x-svr4 - extra_parts="crtbegin.o crtend.o" - ;; - i[34567]86-*-udk*) # Intel x86 on SCO UW/OSR5 Dev Kit - xm_file="xm-alloca.h xm-siglist.h ${xm_file}" - xm_defines="USG POSIX" - tm_file=i386/udk.h - tmake_file="i386/t-crtpic i386/t-udk" - xmake_file=x-svr4 - extra_parts="crtbegin.o crtend.o" - fixincludes="fixinc.svr4" - ;; - i[34567]86-*-osf1*) # Intel 80386's running OSF/1 1.3+ - cpu_type=i386 - xm_file="${xm_file} xm-svr4.h i386/xm-sysv4.h i386/xm-osf1elf.h" - xm_defines="USE_C_ALLOCA SMALL_ARG_MAX" - fixincludes=Makefile.in #Don't do it on OSF/1 - if test x$stabs = xyes - then - tm_file=i386/osf1elfgdb.h - else - tm_file=i386/osf1elf.h - fi - tmake_file=i386/t-osf1elf - xmake_file=i386/x-osf1elf - extra_parts="crti.o crtn.o crtbegin.o crtend.o" - ;; - i[34567]86-*-sysv*) # Intel 80386's running system V - xm_defines="USG SVR3" - xmake_file=i386/x-sysv3 - if test x$gas = xyes - then - if test x$stabs = xyes - then - tm_file=i386/svr3dbx.h - tmake_file=i386/t-svr3dbx - extra_parts="svr3.ifile svr3z.rfile" - else - tm_file=i386/svr3gas.h - extra_parts="crtbegin.o crtend.o" - tmake_file=i386/t-crtstuff - fi - else - tm_file=i386/sysv3.h - extra_parts="crtbegin.o crtend.o" - tmake_file=i386/t-crtstuff - fi - ;; - i386-*-vsta) # Intel 80386's running VSTa kernel - xm_file="${xm_file} i386/xm-vsta.h" - tm_file=i386/vsta.h - tmake_file=i386/t-vsta - xmake_file=i386/x-vsta - ;; - i[34567]86-*-win32) - xm_file="${xm_file} i386/xm-cygwin.h" - tmake_file=i386/t-cygwin - tm_file=i386/win32.h - xmake_file=i386/x-cygwin - extra_objs=winnt.o - fixincludes=Makefile.in - if test x$enable_threads = xyes; then - thread_file='win32' - fi - exeext=.exe - ;; - i[34567]86-*-pe | i[34567]86-*-cygwin*) - xm_file="${xm_file} i386/xm-cygwin.h" - tmake_file=i386/t-cygwin - tm_file=i386/cygwin.h - xmake_file=i386/x-cygwin - extra_objs=winnt.o - fixincludes=Makefile.in - if test x$enable_threads = xyes; then - thread_file='win32' - fi - exeext=.exe - ;; - i[34567]86-*-mingw32*) - tm_file=i386/mingw32.h - xm_file="${xm_file} i386/xm-mingw32.h" - tmake_file="i386/t-cygwin i386/t-mingw32" - extra_objs=winnt.o - xmake_file=i386/x-cygwin - fixincludes=Makefile.in - if test x$enable_threads = xyes; then - thread_file='win32' - fi - exeext=.exe - case $machine in - *mingw32msv*) - ;; - *minwg32crt* | *mingw32*) - tm_file="${tm_file} i386/crtdll.h" - ;; - esac - ;; - i[34567]86-*-winnt3*) - tm_file=i386/win-nt.h - out_file=i386/i386.c - xm_file="xm-winnt.h ${xm_file}" - xmake_file=winnt/x-winnt - tmake_file=i386/t-winnt - extra_host_objs="winnt.o oldnames.o" - extra_gcc_objs="spawnv.o oldnames.o" - fixincludes=fixinc.winnt - if test x$gnu_ld != xyes - then - extra_programs=ld.exe - fi - if test x$enable_threads = xyes; then - thread_file='win32' - fi - ;; - i[34567]86-dg-dgux*) - xm_file="xm-alloca.h xm-siglist.h ${xm_file}" - xm_defines="USG POSIX" - out_file=i386/dgux.c - tm_file=i386/dgux.h - tmake_file=i386/t-dgux - xmake_file=i386/x-dgux - fixincludes=fixinc.dgux - install_headers_dir=install-headers-cpio - ;; - i860-alliant-*) # Alliant FX/2800 - tm_file="${tm_file} svr4.h i860/sysv4.h i860/fx2800.h" - xm_file="${xm_file}" - xmake_file=i860/x-fx2800 - tmake_file=i860/t-fx2800 - extra_parts="crtbegin.o crtend.o" - ;; - i860-*-bsd*) - tm_file="${tm_file} i860/bsd.h" - if test x$gas = xyes - then - tm_file="${tm_file} i860/bsd-gas.h" - fi - use_collect2=yes - ;; - i860-*-mach*) - tm_file="${tm_file} i860/mach.h" - tmake_file=t-libc-ok - ;; - i860-*-osf*) # Intel Paragon XP/S, OSF/1AD - tm_file="${tm_file} svr3.h i860/paragon.h" - xm_defines="USG SVR3" - tmake_file=t-osf - ;; - i860-*-sysv3*) - tm_file="${tm_file} svr3.h i860/sysv3.h" - xm_defines="USG SVR3" - xmake_file=i860/x-sysv3 - extra_parts="crtbegin.o crtend.o" - ;; - i860-*-sysv4*) - tm_file="${tm_file} svr4.h i860/sysv4.h" - xm_defines="USG SVR3" - xmake_file=i860/x-sysv4 - tmake_file=t-svr4 - extra_parts="crtbegin.o crtend.o" - ;; - i960-wrs-vxworks5 | i960-wrs-vxworks5.0*) - tm_file="${tm_file} i960/vx960.h" - tmake_file=i960/t-vxworks960 - use_collect2=yes - thread_file='vxworks' - ;; - i960-wrs-vxworks5* | i960-wrs-vxworks) - tm_file="${tm_file} dbxcoff.h i960/i960-coff.h i960/vx960-coff.h" - tmake_file=i960/t-vxworks960 - use_collect2=yes - thread_file='vxworks' - ;; - i960-wrs-vxworks*) - tm_file="${tm_file} i960/vx960.h" - tmake_file=i960/t-vxworks960 - use_collect2=yes - thread_file='vxworks' - ;; - i960-*-coff*) - tm_file="${tm_file} dbxcoff.h i960/i960-coff.h libgloss.h" - tmake_file=i960/t-960bare - use_collect2=yes - ;; - i960-*-rtems) - tmake_file="i960/t-960bare t-rtems" - tm_file="${tm_file} dbxcoff.h i960/rtems.h" - use_collect2=yes - ;; - i960-*-*) # Default i960 environment. - use_collect2=yes - ;; - m32r-*-elf*) - extra_parts="crtinit.o crtfini.o" - extra_parts="crtinit.o crtfini.o m32rx/crtinit.o m32rx/crtfini.o" - ;; - m68000-convergent-sysv*) - tm_file=m68k/ctix.h - xm_file="m68k/xm-3b1.h ${xm_file}" - xm_defines=USG - use_collect2=yes - extra_headers=math-68881.h - ;; - m68000-hp-bsd*) # HP 9000/200 running BSD - tm_file=m68k/hp2bsd.h - xmake_file=m68k/x-hp2bsd - use_collect2=yes - extra_headers=math-68881.h - ;; - m68000-hp-hpux*) # HP 9000 series 300 - xm_file="xm_alloca.h ${xm_file}" - xm_defines="USG NO_SYS_SIGLIST" - if test x$gas = xyes - then - xmake_file=m68k/x-hp320g - tm_file=m68k/hp310g.h - else - xmake_file=m68k/x-hp320 - tm_file=m68k/hp310.h - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - extra_headers=math-68881.h - ;; - m68000-sun-sunos3*) - tm_file=m68k/sun2.h - use_collect2=yes - extra_headers=math-68881.h - ;; - m68000-sun-sunos4*) - tm_file=m68k/sun2o4.h - use_collect2=yes - extra_headers=math-68881.h - ;; - m68000-att-sysv*) - xm_file="m68k/xm-3b1.h ${xm_file}" - xm_defines=USG - if test x$gas = xyes - then - tm_file=m68k/3b1g.h - else - tm_file=m68k/3b1.h - fi - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-apple-aux*) # Apple Macintosh running A/UX - xm_defines="USG AUX" - tmake_file=m68k/t-aux - install_headers_dir=install-headers-cpio - extra_headers=math-68881.h - extra_parts="crt1.o mcrt1.o maccrt1.o crt2.o crtn.o" - tm_file= - if test "$gnu_ld" = yes - then - tm_file="${tm_file} m68k/auxgld.h" - else - tm_file="${tm_file} m68k/auxld.h" - fi - if test "$gas" = yes - then - tm_file="${tm_file} m68k/auxgas.h" - else - tm_file="${tm_file} m68k/auxas.h" - fi - tm_file="${tm_file} m68k/a-ux.h" - float_format=m68k - ;; - m68k-apollo-*) - tm_file=m68k/apollo68.h - xmake_file=m68k/x-apollo68 - use_collect2=yes - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-altos-sysv*) # Altos 3068 - if test x$gas = xyes - then - tm_file=m68k/altos3068.h - xm_defines=USG - else - echo "The Altos is supported only with the GNU assembler" 1>&2 - exit 1 - fi - extra_headers=math-68881.h - ;; - m68k-bull-sysv*) # Bull DPX/2 - if test x$gas = xyes - then - if test x$stabs = xyes - then - tm_file=m68k/dpx2cdbx.h - else - tm_file=m68k/dpx2g.h - fi - else - tm_file=m68k/dpx2.h - fi - xm_file="xm-alloca.h ${xm_file}" - xm_defines=USG - xmake_file=m68k/x-dpx2 - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-atari-sysv4*) # Atari variant of V.4. - tm_file=m68k/atari.h - xm_file="xm-alloca.h ${xm_file}" - xm_defines="USG FULL_PROTOTYPES" - tmake_file=t-svr4 - extra_parts="crtbegin.o crtend.o" - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-motorola-sysv*) - tm_file=m68k/mot3300.h - xm_file="xm-alloca.h m68k/xm-mot3300.h ${xm_file}" - xm_defines=NO_SYS_SIGLIST - if test x$gas = xyes - then - xmake_file=m68k/x-mot3300-gas - if test x$gnu_ld = xyes - then - tmake_file=m68k/t-mot3300-gald - else - tmake_file=m68k/t-mot3300-gas - use_collect2=yes - fi - else - xmake_file=m68k/x-mot3300 - if test x$gnu_ld = xyes - then - tmake_file=m68k/t-mot3300-gld - else - tmake_file=m68k/t-mot3300 - use_collect2=yes - fi - fi - gdb_needs_out_file_path=yes - extra_parts="crt0.o mcrt0.o" - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-ncr-sysv*) # NCR Tower 32 SVR3 - tm_file=m68k/tower-as.h - xm_defines="USG SVR3" - xmake_file=m68k/x-tower - extra_parts="crtbegin.o crtend.o" - extra_headers=math-68881.h - ;; - m68k-plexus-sysv*) - tm_file=m68k/plexus.h - xm_file="xm-alloca.h m68k/xm-plexus.h ${xm_file}" - xm_defines=USG - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-tti-*) - tm_file=m68k/pbb.h - xm_file="xm-alloca.h ${xm_file}" - xm_defines=USG - extra_headers=math-68881.h - ;; - m68k-crds-unos*) - xm_file="xm-alloca.h m68k/xm-crds.h ${xm_file}" - xm_defines="USG unos" - xmake_file=m68k/x-crds - tm_file=m68k/crds.h - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-cbm-sysv4*) # Commodore variant of V.4. - tm_file=m68k/amix.h - xm_file="xm-alloca.h ${xm_file}" - xm_defines="USG FULL_PROTOTYPES" - xmake_file=m68k/x-amix - tmake_file=t-svr4 - extra_parts="crtbegin.o crtend.o" - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-ccur-rtu) - tm_file=m68k/ccur-GAS.h - xmake_file=m68k/x-ccur - extra_headers=math-68881.h - use_collect2=yes - float_format=m68k - ;; - m68k-hp-bsd4.4*) # HP 9000/3xx running 4.4bsd - tm_file=m68k/hp3bsd44.h - xmake_file=m68k/x-hp3bsd44 - use_collect2=yes - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-hp-bsd*) # HP 9000/3xx running Berkeley Unix - tm_file=m68k/hp3bsd.h - use_collect2=yes - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-isi-bsd*) - if test x$with_fp = xno - then - tm_file=m68k/isi-nfp.h - else - tm_file=m68k/isi.h - float_format=m68k - fi - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-hp-hpux7*) # HP 9000 series 300 running HPUX version 7. - xm_file="xm_alloca.h ${xm_file}" - xm_defines="USG NO_SYS_SIGLIST" - if test x$gas = xyes - then - xmake_file=m68k/x-hp320g - tm_file=m68k/hp320g.h - else - xmake_file=m68k/x-hp320 - tm_file=m68k/hpux7.h - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-hp-hpux*) # HP 9000 series 300 - xm_file="xm_alloca.h ${xm_file}" - xm_defines="USG NO_SYS_SIGLIST" - if test x$gas = xyes - then - xmake_file=m68k/x-hp320g - tm_file=m68k/hp320g.h - else - xmake_file=m68k/x-hp320 - tm_file=m68k/hp320.h - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-sun-mach*) - tm_file=m68k/sun3mach.h - use_collect2=yes - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-sony-newsos3*) - if test x$gas = xyes - then - tm_file=m68k/news3gas.h - else - tm_file=m68k/news3.h - fi - use_collect2=yes - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-sony-bsd* | m68k-sony-newsos*) - if test x$gas = xyes - then - tm_file=m68k/newsgas.h - else - tm_file=m68k/news.h - fi - use_collect2=yes - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-next-nextstep2*) - tm_file=m68k/next21.h - xm_file="m68k/xm-next.h ${xm_file}" - tmake_file=m68k/t-next - xmake_file=m68k/x-next - extra_objs=nextstep.o - extra_headers=math-68881.h - use_collect2=yes - float_format=m68k - ;; - m68k-next-nextstep3*) - tm_file=m68k/next.h - xm_file="m68k/xm-next.h ${xm_file}" - tmake_file=m68k/t-next - xmake_file=m68k/x-next - extra_objs=nextstep.o - extra_parts="crtbegin.o crtend.o" - extra_headers=math-68881.h - float_format=m68k - if test x$enable_threads = xyes; then - thread_file='mach' - fi - ;; - m68k-sun-sunos3*) - if test x$with_fp = xno - then - tm_file=m68k/sun3n3.h - else - tm_file=m68k/sun3o3.h - float_format=m68k - fi - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-sun-sunos*) # For SunOS 4 (the default). - if test x$with_fp = xno - then - tm_file=m68k/sun3n.h - else - tm_file=m68k/sun3.h - float_format=m68k - fi - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-wrs-vxworks*) - tm_file=m68k/vxm68k.h - tmake_file=m68k/t-vxworks68 - extra_headers=math-68881.h - thread_file='vxworks' - float_format=m68k - ;; - m68k-*-aout*) - tmake_file=m68k/t-m68kbare - tm_file="m68k/m68k-aout.h libgloss.h" - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-*-coff*) - tmake_file=m68k/t-m68kbare - tm_file="m68k/m68k-coff.h dbx.h libgloss.h" - extra_headers=math-68881.h - float_format=m68k - ;; - m68020-*-elf* | m68k-*-elf*) - tm_file="m68k/m68020-elf.h libgloss.h" - xm_file=m68k/xm-m68kv.h - tmake_file=m68k/t-m68kelf - header_files=math-68881.h - ;; - m68k-*-lynxos*) - if test x$gas = xyes - then - tm_file=m68k/lynx.h - else - tm_file=m68k/lynx-ng.h - fi - xm_file=m68k/xm-lynx.h - xmake_file=x-lynx - tmake_file=m68k/t-lynx - extra_headers=math-68881.h - float_format=m68k - ;; - m68k*-*-netbsd*) - tm_file=m68k/netbsd.h - # On NetBSD, the headers are already okay, except for math.h. - fixincludes=fixinc.wrap - tmake_file=t-netbsd - float_format=m68k - ;; - m68k-*-sysv3*) # Motorola m68k's running system V.3 - xm_file="xm-alloca.h ${xm_file}" - xm_defines=USG - xmake_file=m68k/x-m68kv - extra_parts="crtbegin.o crtend.o" - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-*-sysv4*) # Motorola m68k's running system V.4 - tm_file=m68k/m68kv4.h - xm_file="xm-alloca.h ${xm_file}" - xm_defines=USG - tmake_file=t-svr4 - extra_parts="crtbegin.o crtend.o" - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-*-linux-gnuaout*) # Motorola m68k's running GNU/Linux - # with a.out format - xmake_file=x-linux - tm_file=m68k/linux-aout.h - tmake_file="t-linux-aout m68k/t-linux-aout" - fixincludes=Makefile.in # The headers are ok already. - extra_headers=math-68881.h - float_format=m68k - gnu_ld=yes - ;; - m68k-*-linux-gnulibc1) # Motorola m68k's running GNU/Linux - # with ELF format using the - # GNU/Linux C library 5 - xmake_file=x-linux - tm_file=m68k/linux.h - tmake_file="t-linux t-linux-gnulibc1 m68k/t-linux" - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - fixincludes=Makefile.in # The headers are ok already. - extra_headers=math-68881.h - float_format=m68k - gnu_ld=yes - ;; - m68k-*-linux-gnu*) # Motorola m68k's running GNU/Linux - # with ELF format using glibc 2 - # aka the GNU/Linux C library 6. - xmake_file=x-linux - tm_file=m68k/linux.h - tmake_file="t-linux m68k/t-linux" - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - fixincludes=Makefile.in # The headers are ok already. - extra_headers=math-68881.h - float_format=m68k - gnu_ld=yes - if test x$enable_threads = xyes; then - thread_file='posix' - fi - ;; - m68k-*-psos*) - tmake_file=m68k/t-m68kbare - tm_file=m68k/m68k-psos.h - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-*-rtems*) - tmake_file="m68k/t-m68kbare t-rtems" - tm_file=m68k/rtems.h - extra_headers=math-68881.h - float_format=m68k - ;; - - m88k-dg-dgux*) - case $machine in - m88k-dg-dguxbcs*) - tm_file=m88k/dguxbcs.h - tmake_file=m88k/t-dguxbcs - ;; - *) - tm_file=m88k/dgux.h - tmake_file=m88k/t-dgux - ;; - esac - extra_parts="crtbegin.o bcscrtbegin.o crtend.o m88kdgux.ld" - xmake_file=m88k/x-dgux - if test x$gas = xyes - then - tmake_file=m88k/t-dgux-gas - fi - fixincludes=fixinc.dgux - ;; - m88k-dolphin-sysv3*) - tm_file=m88k/dolph.h - extra_parts="crtbegin.o crtend.o" - xm_file="m88k/xm-sysv3.h ${xm_file}" - xmake_file=m88k/x-dolph - if test x$gas = xyes - then - tmake_file=m88k/t-m88k-gas - fi - ;; - m88k-tektronix-sysv3) - tm_file=m88k/tekXD88.h - extra_parts="crtbegin.o crtend.o" - xm_file="m88k/xm-sysv3.h ${xm_file}" - xmake_file=m88k/x-tekXD88 - if test x$gas = xyes - then - tmake_file=m88k/t-m88k-gas - fi - ;; - m88k-*-aout*) - tm_file=m88k/m88k-aout.h - ;; - m88k-*-coff*) - tm_file=m88k/m88k-coff.h - tmake_file=m88k/t-bug - ;; - m88k-*-luna*) - tm_file=m88k/luna.h - extra_parts="crtbegin.o crtend.o" - if test x$gas = xyes - then - tmake_file=m88k/t-luna-gas - else - tmake_file=m88k/t-luna - fi - ;; - m88k-*-sysv3*) - tm_file=m88k/sysv3.h - extra_parts="crtbegin.o crtend.o" - xm_file="m88k/xm-sysv3.h ${xm_file}" - xmake_file=m88k/x-sysv3 - if test x$gas = xyes - then - tmake_file=m88k/t-m88k-gas - fi - ;; - m88k-*-sysv4*) - tm_file=m88k/sysv4.h - extra_parts="crtbegin.o crtend.o" - xmake_file=m88k/x-sysv4 - tmake_file=m88k/t-sysv4 - ;; - mips-lsi-elf*) # CYGNUS LOCAL angela - tm_file="mips/elf.h" - tmake_file=mips/t-lsi - ;; - mips-sgi-irix6*) # SGI System V.4., IRIX 6 - tm_file=mips/iris6.h - xm_file=mips/xm-iris6.h - fixincludes=fixinc.irix - xmake_file=mips/x-iris6 - tmake_file=mips/t-iris6 -# if test x$enable_threads = xyes; then -# thread_file='irix' -# fi - ;; - mips-wrs-vxworks) - tm_file="mips/elf.h libgloss.h mips/vxworks.h" - tmake_file=mips/t-ecoff - gas=yes - gnu_ld=yes - extra_parts="crtbegin.o crtend.o" -# thread_file='vxworks' - ;; - mips-sgi-irix5cross64) # Irix5 host, Irix 6 target, cross64 - tm_file="mips/iris6.h mips/cross64.h" - xm_defines=USG - xm_file="mips/xm-iris5.h" - fixincludes=Makefile.in - xmake_file=mips/x-iris - tmake_file=mips/t-cross64 - # See comment in mips/iris[56].h files. - use_collect2=yes -# if test x$enable_threads = xyes; then -# thread_file='irix' -# fi - ;; - mips-sni-sysv4) - if test x$gas = xyes - then - if test x$stabs = xyes - then - tm_file=mips/iris5gdb.h - else - tm_file="mips/sni-svr4.h mips/sni-gas.h" - fi - else - tm_file=mips/sni-svr4.h - fi - xm_defines=USG - xmake_file=mips/x-sni-svr4 - tmake_file=mips/t-mips-gas - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; - mips-sgi-irix5*) # SGI System V.4., IRIX 5 - if test x$gas = xyes - then - tm_file="mips/iris5.h mips/iris5gas.h" - if test x$stabs = xyes - then - tm_file="${tm_file} dbx.h" - fi - else - tm_file=mips/iris5.h - fi - xm_defines=USG - xm_file="mips/xm-iris5.h" - fixincludes=fixinc.irix - xmake_file=mips/x-iris - # mips-tfile doesn't work yet - tmake_file=mips/t-mips-gas - # See comment in mips/iris5.h file. - use_collect2=yes -# if test x$enable_threads = xyes; then -# thread_file='irix' -# fi - ;; - mips-sgi-irix4loser*) # Mostly like a MIPS. - tm_file="mips/iris4loser.h mips/iris3.h ${tm_file} mips/iris4.h" - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - xm_defines=USG - xmake_file=mips/x-iris - if test x$gas = xyes - then - tmake_file=mips/t-mips-gas - else - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi -# if test x$enable_threads = xyes; then -# thread_file='irix' -# fi - ;; - mips-sgi-irix4*) # Mostly like a MIPS. - tm_file="mips/iris3.h ${tm_file} mips/iris4.h" - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - xm_defines=USG - xmake_file=mips/x-iris - if test x$gas = xyes - then - tmake_file=mips/t-mips-gas - else - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi -# if test x$enable_threads = xyes; then -# thread_file='irix' -# fi - ;; - mips-sgi-*) # Mostly like a MIPS. - tm_file="mips/iris3.h ${tm_file}" - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - xm_defines=USG - xmake_file=mips/x-iris3 - if test x$gas = xyes - then - tmake_file=mips/t-mips-gas - else - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; - mips-dec-osfrose*) # Decstation running OSF/1 reference port with OSF/rose. - tm_file="mips/osfrose.h ${tm_file}" - xmake_file=mips/x-osfrose - tmake_file=mips/t-osfrose - extra_objs=halfpic.o - use_collect2=yes - ;; - mips-dec-osf*) # Decstation running OSF/1 as shipped by DIGITAL - tm_file=mips/dec-osf1.h - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - xmake_file=mips/x-dec-osf1 - if test x$gas = xyes - then - tmake_file=mips/t-mips-gas - else - tmake_file=mips/t-ultrix - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; - mips-dec-bsd*) # Decstation running 4.4 BSD - tm_file=mips/dec-bsd.h - fixincludes= - if test x$gas = xyes - then - tmake_file=mips/t-mips-gas - else - tmake_file=mips/t-ultrix - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; - mipsel-*-netbsd* | mips-dec-netbsd*) # Decstation running NetBSD - tm_file=mips/netbsd.h - # On NetBSD, the headers are already okay, except for math.h. - fixincludes=fixinc.wrap - tmake_file=t-netbsd - ;; - mips*-*-linux*) # Linux MIPS, either endian. - xmake_file=x-linux - xm_file="xm-siglist.h ${xm_file}" - case $machine in - mipsel-*) tm_file="mips/elfl.h mips/linux.h" ;; - *) tm_file="mips/elf.h mips/linux.h" ;; - esac - extra_parts="crtbegin.o crtend.o" - gnu_ld=yes - gas=yes - fixincludes=Makefile.in - ;; - mips-sony-bsd* | mips-sony-newsos*) # Sony NEWS 3600 or risc/news. - tm_file="mips/news4.h ${tm_file}" - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - if test x$gas = xyes - then - tmake_file=mips/t-mips-gas - else - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - xmake_file=mips/x-sony - ;; - mips-sony-sysv*) # Sony NEWS 3800 with NEWSOS5.0. - # That is based on svr4. - # t-svr4 is not right because this system doesn't use ELF. - tm_file="mips/news5.h ${tm_file}" - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - xm_file="xm-siglist.h ${xm_file}" - xm_defines=USG - if test x$gas = xyes - then - tmake_file=mips/t-mips-gas - else - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; - mips-tandem-sysv4*) # Tandem S2 running NonStop UX - tm_file="mips/svr4-5.h mips/svr4-t.h" - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - xm_file="xm-siglist.h ${xm_file}" - xm_defines=USG - xmake_file=mips/x-sysv - if test x$gas = xyes - then - tmake_file=mips/t-mips-gas - extra_parts="crtbegin.o crtend.o" - else - tmake_file=mips/t-mips - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; - mips-*-ultrix* | mips-dec-mach3) # Decstation. - tm_file="mips/ultrix.h ${tm_file}" - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - xmake_file=mips/x-ultrix - if test x$gas = xyes - then - tmake_file=mips/t-mips-gas - else - tmake_file=mips/t-ultrix - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; - mips-*-riscos[56789]bsd*) - tm_file=mips/bsd-5.h # MIPS BSD 4.3, RISC-OS 5.0 - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - if test x$gas = xyes - then - tmake_file=mips/t-bsd-gas - else - tmake_file=mips/t-bsd - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; - mips-*-bsd* | mips-*-riscosbsd* | mips-*-riscos[1234]bsd*) - tm_file="mips/bsd-4.h ${tm_file}" # MIPS BSD 4.3, RISC-OS 4.0 - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - if test x$gas = xyes - then - tmake_file=mips/t-bsd-gas - else - tmake_file=mips/t-bsd - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; - mips-*-riscos[56789]sysv4*) - tm_file=mips/svr4-5.h # MIPS System V.4., RISC-OS 5.0 - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - xm_file="xm-siglist.h ${xm_file}" - xmake_file=mips/x-sysv - if test x$gas = xyes - then - tmake_file=mips/t-svr4-gas - else - tmake_file=mips/t-svr4 - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; - mips-*-sysv4* | mips-*-riscos[1234]sysv4* | mips-*-riscossysv4*) - tm_file="mips/svr4-4.h ${tm_file}" - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - xm_defines=USG - xmake_file=mips/x-sysv - if test x$gas = xyes - then - tmake_file=mips/t-svr4-gas - else - tmake_file=mips/t-svr4 - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; - mips-*-riscos[56789]sysv*) - tm_file=mips/svr3-5.h # MIPS System V.3, RISC-OS 5.0 - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - xm_defines=USG - xmake_file=mips/x-sysv - if test x$gas = xyes - then - tmake_file=mips/t-svr3-gas - else - tmake_file=mips/t-svr3 - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; - mips-*-sysv* | mips-*-riscos*sysv*) - tm_file="mips/svr3-4.h ${tm_file}" - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - xm_defines=USG - xmake_file=mips/x-sysv - if test x$gas = xyes - then - tmake_file=mips/t-svr3-gas - else - tmake_file=mips/t-svr3 - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; - mips-*-riscos[56789]*) # Default MIPS RISC-OS 5.0. - tm_file=mips/mips-5.h - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - if test x$gas = xyes - then - tmake_file=mips/t-mips-gas - else - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; - mips-*-gnu*) - ;; - mipsel-*-ecoff*) - tm_file=mips/ecoffl.h - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - tmake_file=mips/t-ecoff - ;; - mips-*-ecoff*) - tm_file="gofast.h mips/ecoff.h" - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - tmake_file=mips/t-ecoff - ;; - mipsel-*-elf*) - tm_file="mips/elfl.h libgloss.h" - tmake_file=mips/t-elf - ;; - mips-*-elf*) - tm_file="mips/elf.h" - tmake_file=mips/t-elf - ;; - mips64el-*-elf*) - tm_file="mips/elfl64.h" - tmake_file=mips/t-elf - ;; - mips64orionel-*-elf*) - tm_file="mips/elforion.h mips/elfl64.h libgloss.h" - tmake_file=mips/t-elf - ;; - mips64-*-elf*) - tm_file="mips/elf64.h" - tmake_file=mips/t-elf - ;; - mips64orion-*-elf*) - tm_file="mips/elforion.h mips/elf64.h libgloss.h" - tmake_file=mips/t-elf - ;; - mips64orion-*-rtems*) - tm_file="mips/elforion.h mips/elf64.h mips/rtems64.h" - tmake_file="mips/t-ecoff t-rtems" - ;; - mipstx39el-*-elf*) - tm_file="mips/r3900.h mips/elfl.h mips/abi64.h" - tmake_file=mips/t-r3900 - ;; - mipstx39-*-elf*) - tm_file="mips/r3900.h mips/elf.h mips/abi64.h" - tmake_file=mips/t-r3900 - ;; - mips-*-*) # Default MIPS RISC-OS 4.0. - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - if test x$gas = xyes - then - tmake_file=mips/t-mips-gas - else - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; - mn10200-*-*) - cpu_type=mn10200 - tm_file="mn10200/mn10200.h" - if test x$stabs = xyes - then - tm_file="${tm_file} dbx.h" - fi - use_collect2=no - ;; - mn10300-*-*) - cpu_type=mn10300 - tm_file="mn10300/mn10300.h" - if test x$stabs = xyes - then - tm_file="${tm_file} dbx.h" - fi - use_collect2=no - ;; - ns32k-encore-bsd*) - tm_file=ns32k/encore.h - use_collect2=yes - ;; - ns32k-sequent-bsd*) - tm_file=ns32k/sequent.h - use_collect2=yes - ;; - ns32k-tek6100-bsd*) - tm_file=ns32k/tek6100.h - use_collect2=yes - ;; - ns32k-tek6200-bsd*) - tm_file=ns32k/tek6200.h - use_collect2=yes - ;; -# This has not been updated to GCC 2. -# ns32k-ns-genix*) -# xm_defines=USG -# xmake_file=ns32k/x-genix -# tm_file=ns32k/genix.h -# use_collect2=yes -# ;; - ns32k-merlin-*) - tm_file=ns32k/merlin.h - use_collect2=yes - ;; - ns32k-pc532-mach*) - tm_file=ns32k/pc532-mach.h - use_collect2=yes - ;; - ns32k-pc532-minix*) - tm_file=ns32k/pc532-min.h - xm_file="ns32k/xm-pc532-min.h ${xm-file}" - xm_defines=USG - use_collect2=yes - ;; - ns32k-*-netbsd*) - tm_file=ns32k/netbsd.h - xm_file="ns32k/xm-netbsd.h ${xm_file}" - # On NetBSD, the headers are already okay, except for math.h. - fixincludes=fixinc.wrap - tmake_file=t-netbsd - ;; - pdp11-*-bsd) - tm_file="${tm_file} pdp11/2bsd.h" - ;; - pdp11-*-*) - ;; - pyramid-*-*) - cpu_type=pyr - xmake_file=pyr/x-pyr - use_collect2=yes - ;; - romp-*-aos*) - use_collect2=yes - ;; - romp-*-mach*) - xmake_file=romp/x-mach - use_collect2=yes - ;; - powerpc-*-beos*) - cpu_type=rs6000 - tm_file=rs6000/beos.h - xm_file=rs6000/xm-beos.h - tmake_file=rs6000/t-beos - xmake_file=rs6000/x-beos - ;; - powerpc-*-sysv* | powerpc-*-elf*) - tm_file=rs6000/sysv4.h - xm_file="xm-siglist.h rs6000/xm-sysv4.h" - xm_defines="USG POSIX" - extra_headers=ppc-asm.h - if test x$gas = xyes - then - tmake_file="rs6000/t-ppcos rs6000/t-ppccomm" - else - tmake_file="rs6000/t-ppc rs6000/t-ppccomm" - fi - xmake_file=rs6000/x-sysv4 - ;; - powerpc-*-eabiaix*) - tm_file=rs6000/eabiaix.h - tmake_file="rs6000/t-ppcgas rs6000/t-ppccomm" - fixincludes=Makefile.in - extra_headers=ppc-asm.h - ;; - powerpc-*-eabisim*) - tm_file=rs6000/eabisim.h - tmake_file="rs6000/t-ppcgas rs6000/t-ppccomm" - fixincludes=Makefile.in - extra_headers=ppc-asm.h - ;; - powerpc-*-eabi*) - tm_file=rs6000/eabi.h - if test x$gas = xyes - then - tmake_file="rs6000/t-ppcgas rs6000/t-ppccomm" - else - tmake_file="rs6000/t-ppc rs6000/t-ppccomm" - fi - fixincludes=Makefile.in - extra_headers=ppc-asm.h - ;; - powerpc-*-rtems*) - tm_file=rs6000/rtems.h - if test x$gas = xyes - then - tmake_file="rs6000/t-ppcgas t-rtems rs6000/t-ppccomm" - else - tmake_file="rs6000/t-ppc t-rtems rs6000/t-ppccomm" - fi - fixincludes=Makefile.in - extra_headers=ppc-asm.h - ;; - powerpc-*-linux-gnulibc1) - tm_file=rs6000/linux.h - xm_file=rs6000/xm-sysv4.h - out_file=rs6000/rs6000.c - if test x$gas = xyes - then - tmake_file="rs6000/t-ppcos t-linux t-linux-gnulibc1 rs6000/t-ppccomm" - else - tmake_file="rs6000/t-ppc t-linux t-linux-gnulibc1 rs6000/t-ppccomm" - fi - xmake_file=x-linux - fixincludes=Makefile.in - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - extra_headers=ppc-asm.h - if test x$enable_threads = xyes; then - thread_file='posix' - fi - ;; - powerpc-*-linux-gnu*) - tm_file=rs6000/linux.h - xm_file="xm-siglist.h rs6000/xm-sysv4.h" - xm_defines="USG ${xm_defines}" - out_file=rs6000/rs6000.c - if test x$gas = xyes - then - tmake_file="rs6000/t-ppcos t-linux rs6000/t-ppccomm" - else - tmake_file="rs6000/t-ppc t-linux rs6000/t-ppccomm" - fi - xmake_file=x-linux - fixincludes=Makefile.in - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - extra_headers=ppc-asm.h - if test x$enable_threads = xyes; then - thread_file='posix' - fi - ;; - powerpc-wrs-vxworks*) - cpu_type=rs6000 - xm_file="xm-siglist.h rs6000/xm-sysv4.h" - xm_defines="USG POSIX" - tm_file=rs6000/vxppc.h - tmake_file="rs6000/t-ppcgas rs6000/t-ppccomm" - extra_headers=ppc-asm.h - thread_file='vxworks' - ;; - powerpcle-*-sysv* | powerpcle-*-elf*) - tm_file=rs6000/sysv4le.h - xm_file="xm-siglist.h rs6000/xm-sysv4.h" - xm_defines="USG POSIX" - if test x$gas = xyes - then - tmake_file="rs6000/t-ppcos rs6000/t-ppccomm" - else - tmake_file="rs6000/t-ppc rs6000/t-ppccomm" - fi - xmake_file=rs6000/x-sysv4 - extra_headers=ppc-asm.h - ;; - powerpcle-*-eabisim*) - tm_file=rs6000/eabilesim.h - tmake_file="rs6000/t-ppcgas rs6000/t-ppccomm" - fixincludes=Makefile.in - extra_headers=ppc-asm.h - ;; - powerpcle-*-eabi*) - tm_file=rs6000/eabile.h - if test x$gas = xyes - then - tmake_file="rs6000/t-ppcgas rs6000/t-ppccomm" - else - tmake_file="rs6000/t-ppc rs6000/t-ppccomm" - fi - fixincludes=Makefile.in - extra_headers=ppc-asm.h - ;; - powerpcle-*-winnt* ) - tm_file=rs6000/win-nt.h - tmake_file=rs6000/t-winnt -# extra_objs=pe.o - fixincludes=Makefile.in - if test x$enable_threads = xyes; then - thread_file='win32' - fi - extra_headers=ppc-asm.h - ;; - powerpcle-*-pe | powerpcle-*-cygwin*) - tm_file=rs6000/cygwin.h - xm_file="rs6000/xm-cygwin.h ${xm_file}" - tmake_file=rs6000/t-winnt - xmake_file=rs6000/x-cygwin -# extra_objs=pe.o - fixincludes=Makefile.in - if test x$enable_threads = xyes; then - thread_file='win32' - fi - exeext=.exe - extra_headers=ppc-asm.h - ;; - powerpcle-*-solaris2*) - tm_file=rs6000/sol2.h - xm_file="xm-siglist.h rs6000/xm-sysv4.h" - xm_defines="USG POSIX" - if test x$gas = xyes - then - tmake_file="rs6000/t-ppcos rs6000/t-ppccomm" - else - tmake_file="rs6000/t-ppc rs6000/t-ppccomm" - fi - xmake_file=rs6000/x-sysv4 - case $machine in - *-*-solaris2.[0-4]) - fixincludes=fixinc.svr4;; - *) - fixincludes=fixinc.wrap;; - esac - extra_headers=ppc-asm.h - ;; - rs6000-ibm-aix3.[01]*) - tm_file=rs6000/aix31.h - xmake_file=rs6000/x-aix31 - use_collect2=yes - ;; - rs6000-ibm-aix3.2.[456789]* | powerpc-ibm-aix3.2.[456789]*) - tm_file=rs6000/aix3newas.h - if test x$host != x$target - then - tmake_file=rs6000/t-xnewas - else - tmake_file=rs6000/t-newas - fi - use_collect2=yes - ;; - rs6000-ibm-aix4.[12]* | powerpc-ibm-aix4.[12]*) - tm_file=rs6000/aix41.h - if test x$host != x$target - then - tmake_file=rs6000/t-xnewas - else - tmake_file=rs6000/t-newas - fi - xmake_file=rs6000/x-aix41 - use_collect2=yes - ;; - rs6000-ibm-aix4.[3456789].* | powerpc-ibm-aix4.[3456789].*) - tm_file=rs6000/aix43.h - if test x$host != x$target - then - tmake_file=rs6000/t-xaix43 - else - tmake_file=rs6000/t-aix43 - fi - xmake_file=rs6000/x-aix43 - use_collect2=yes - ;; - rs6000-ibm-aix[56789].* | powerpc-ibm-aix[56789].*) - tm_file=rs6000/aix43.h - if test x$host != x$target - then - tmake_file=rs6000/t-xaix43 - else - tmake_file=rs6000/t-aix43 - fi - xmake_file=rs6000/x-aix43 - use_collect2=yes - ;; - rs6000-ibm-aix*) - use_collect2=yes - ;; - rs6000-bull-bosx) - use_collect2=yes - ;; - rs6000-*-mach*) - tm_file=rs6000/mach.h - xm_file="${xm_file} rs6000/xm-mach.h" - xmake_file=rs6000/x-mach - use_collect2=yes - ;; - rs6000-*-lynxos*) - tm_file=rs6000/lynx.h - xm_file=rs6000/xm-lynx.h - tmake_file=rs6000/t-rs6000 - xmake_file=rs6000/x-lynx - use_collect2=yes - ;; - sh-*-elf*) - tm_file=sh/elf.h - float_format=sh - ;; - sh-*-rtemself*) - tmake_file="sh/t-sh t-rtems" - tm_file=sh/rtemself.h - float_format=sh - ;; - sh-*-rtems*) - tmake_file="sh/t-sh t-rtems" - tm_file=sh/rtems.h - float_format=sh - ;; - sh-*-*) - float_format=sh - ;; - sparc-tti-*) - tm_file=sparc/pbd.h - xm_file="xm-alloca.h ${xm_file}" - xm_defines=USG - ;; - sparc-wrs-vxworks* | sparclite-wrs-vxworks*) - tm_file=sparc/vxsparc.h - tmake_file=sparc/t-vxsparc - use_collect2=yes - thread_file='vxworks' - ;; - sparc-*-aout*) - tmake_file=sparc/t-sparcbare - tm_file="sparc/aout.h libgloss.h" - ;; - sparc-*-netbsd*) - tm_file=sparc/netbsd.h - # On NetBSD, the headers are already okay, except for math.h. - fixincludes=fixinc.wrap - tmake_file=t-netbsd - ;; - sparc-*-bsd*) - tm_file=sparc/bsd.h - ;; - sparc-*-elf*) - tm_file=sparc/elf.h - tmake_file=sparc/t-elf - extra_parts="crti.o crtn.o crtbegin.o crtend.o" - #float_format=i128 - float_format=i64 - ;; - sparc-*-linux-gnuaout*) # Sparc's running GNU/Linux, a.out - xm_file="${xm_file} sparc/xm-linux.h" - tm_file=sparc/linux-aout.h - xmake_file=x-linux - fixincludes=Makefile.in #On Linux, the headers are ok already. - gnu_ld=yes - ;; - sparc-*-linux-gnulibc1*) # Sparc's running GNU/Linux, libc5 - xm_file="${xm_file} sparc/xm-linux.h" - xmake_file=x-linux - tm_file=sparc/linux.h - tmake_file="t-linux t-linux-gnulibc1" - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - fixincludes=Makefile.in #On Linux, the headers are ok already. - gnu_ld=yes - ;; - sparc-*-linux-gnu*) # Sparc's running GNU/Linux, libc6 - xm_file="${xm_file} sparc/xm-linux.h" - xmake_file=x-linux - tm_file=sparc/linux.h - tmake_file="t-linux" - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - fixincludes=Makefile.in #On Linux, the headers are ok already. - gnu_ld=yes - if test x$enable_threads = xyes; then - thread_file='posix' - fi - ;; - sparc-*-lynxos*) - if test x$gas = xyes - then - tm_file=sparc/lynx.h - else - tm_file=sparc/lynx-ng.h - fi - xm_file=sparc/xm-lynx.h - tmake_file=sparc/t-sunos41 - xmake_file=x-lynx - ;; - sparc-*-rtems*) - tmake_file="sparc/t-sparcbare t-rtems" - tm_file=sparc/rtems.h - ;; - sparcv9-*-solaris2*) - tm_file=sparc/sol2-sld-64.h - xm_file="sparc/xm-sysv4-64.h sparc/xm-sol2.h" - xm_defines="USG POSIX" - tmake_file="sparc/t-sol2 sparc/t-sol2-64" - xmake_file=sparc/x-sysv4 - extra_parts="crt1.o crti.o crtn.o gcrt1.o crtbegin.o crtend.o" - fixincludes=fixinc.wrap - float_format=none - if test x${enable_threads} = x ; then - enable_threads=$have_pthread_h - if test x${enable_threads} = x ; then - enable_threads=$have_thread_h - fi - fi - if test x${enable_threads} = xyes ; then - if test x${have_pthread_h} = xyes ; then - thread_file='posix' - else - thread_file='solaris' - fi - fi - ;; - sparc-*-solaris2*) - if test x$gnu_ld = xyes - then - tm_file=sparc/sol2.h - else - tm_file=sparc/sol2-sld.h - fi - xm_file="xm-siglist.h sparc/xm-sysv4.h sparc/xm-sol2.h" - xm_defines="USG POSIX" - tmake_file=sparc/t-sol2 - xmake_file=sparc/x-sysv4 - extra_parts="crt1.o crti.o crtn.o gcrt1.o gmon.o crtbegin.o crtend.o" - case $machine in - *-*-solaris2.[0-4]) - fixincludes=fixinc.svr4 - float_format=i128 - ;; - *) - fixincludes=fixinc.wrap - float_format=none - ;; - esac - if test x${enable_threads} = x; then - enable_threads=$have_pthread_h - if test x${enable_threads} = x; then - enable_threads=$have_thread_h - fi - fi - if test x${enable_threads} = xyes; then - if test x${have_pthread_h} = xyes; then - thread_file='posix' - else - thread_file='solaris' - fi - fi - ;; - sparc-*-sunos4.0*) - tm_file=sparc/sunos4.h - tmake_file=sparc/t-sunos40 - use_collect2=yes - ;; - sparc-*-sunos4*) - tm_file=sparc/sunos4.h - tmake_file=sparc/t-sunos41 - use_collect2=yes - if test x$gas = xyes; then - tm_file="${tm_file} sparc/sun4gas.h" - fi - ;; - sparc-*-sunos3*) - tm_file=sparc/sun4o3.h - use_collect2=yes - ;; - sparc-*-sysv4*) - tm_file=sparc/sysv4.h - xm_file="xm-siglist.h sparc/xm-sysv4.h" - xm_defines="USG POSIX" - tmake_file=t-svr4 - xmake_file=sparc/x-sysv4 - extra_parts="crtbegin.o crtend.o" - ;; - sparc-*-vxsim*) - xm_file="xm-siglist.h sparc/xm-sysv4.h sparc/xm-sol2.h" - xm_defines="USG POSIX" - tm_file=sparc/vxsim.h - tmake_file=sparc/t-vxsparc - xmake_file=sparc/x-sysv4 - ;; - sparclet-*-aout*) - tm_file="sparc/splet.h libgloss.h" - tmake_file=sparc/t-splet - ;; - sparclite-*-coff*) - tm_file="sparc/litecoff.h libgloss.h" - tmake_file=sparc/t-sparclite - ;; - sparclite-*-aout*) - tm_file="sparc/lite.h aoutos.h" - tmake_file=sparc/t-sparclite - use_collect2=yes - ;; - sparclite-*-elf*) - tm_file="sparc/liteelf.h" - tmake_file=sparc/t-sparclite - extra_parts="crtbegin.o crtend.o" - ;; - sparc86x-*-aout*) - tm_file="sparc/sp86x-aout.h aoutos.h libgloss.h" - tmake_file=sparc/t-sp86x - use_collect2=yes - ;; - sparc86x-*-elf*) - tm_file="sparc/sp86x-elf.h libgloss.h" - tmake_file=sparc/t-sp86x - extra_parts="crtbegin.o crtend.o" - ;; - sparc64-*-aout*) - tmake_file=sparc/t-sp64 - tm_file=sparc/sp64-aout.h - ;; - sparc64-*-elf*) - tmake_file=sparc/t-sp64 - tm_file=sparc/sp64-elf.h - extra_parts="crtbegin.o crtend.o" - ;; - sparc64-*-linux*) # 64-bit Sparc's running GNU/Linux - tmake_file="t-linux sparc/t-linux64" - xm_file="sparc/xm-sp64.h sparc/xm-linux.h" - tm_file=sparc/linux64.h - xmake_file=x-linux - fixincludes=Makefile.in # The headers are ok already. - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - gnu_ld=yes - ;; -# This hasn't been upgraded to GCC 2. -# tahoe-harris-*) # Harris tahoe, using COFF. -# tm_file=tahoe/harris.h -# ;; -# tahoe-*-bsd*) # tahoe running BSD -# ;; - thumb-*-coff* | thumbel-*-coff*) - tm_file=arm/tcoff.h - out_file=arm/thumb.c - xm_file=arm/xm-thumb.h - md_file=arm/thumb.md - tmake_file=arm/t-thumb + arm*-*-elf*) + tm_file=arm/unknown-elf.h + tmake_file=arm/t-arm-elf ;; - # CYGNUS LOCAL clm/arm-elf - thumb-*-elf* | thumbel-*-elf*) + thumb-*-elf*) tm_file=arm/telf.h out_file=arm/thumb.c xm_file=arm/xm-thumb.h @@ -5474,277 +2905,6 @@ for machine in $build $host $target; do tmake_file=arm/t-thumb-elf fixincludes=Makefile.in # There is nothing to fix ;; - thumb*-*-oabi*) - tm_file=arm/telf-oabi.h - out_file=arm/thumb.c - xm_file=arm/xm-thumb.h - md_file=arm/thumb.md - tmake_file=arm/t-thumb-elf - fixincludes=Makefile.in # There is nothing to fix - ;; - # END CYGNUS LOCAL -# This hasn't been upgraded to GCC 2. -# tron-*-*) -# cpu_type=gmicro -# use_collect2=yes -# ;; - v850-*-*) - cpu_type=v850 - tm_file="v850/v850.h" - xm_file="v850/xm-v850.h" - tmake_file=v850/t-v850 - if test x$stabs = xyes - then - tm_file="${tm_file} dbx.h" - fi - use_collect2=no - ;; - # CYGNUS LOCAL v850e/nick - v850e-*-*) - cpu_type=v850 - tm_file="v850/v850e.h" - xm_file="v850/xm-v850.h" - tmake_file=v850/t-v850 - if [ x$stabs = xyes ] - then - tm_file="${tm_file} dbx.h" - fi - use_collect2=no - ;; - v850ea-*-*) - cpu_type=v850 - tm_file="v850/v850ea.h" - xm_file="v850/xm-v850.h" - tmake_file=v850/t-v850 - if [ x$stabs = xyes ] - then - tm_file="${tm_file} dbx.h" - fi - use_collect2=no - ;; - # end CYGNUS LOCAL - vax-*-bsd*) # vaxen running BSD - use_collect2=yes - float_format=vax - ;; - vax-*-sysv*) # vaxen running system V - tm_file="${tm_file} vax/vaxv.h" - xm_defines=USG - float_format=vax - ;; - vax-*-netbsd*) - tm_file="${tm_file} netbsd.h vax/netbsd.h" - # On NetBSD, the headers are already okay, except for math.h. - fixincludes=fixinc.wrap - tmake_file=t-netbsd - float_format=vax - ;; - vax-*-ultrix*) # vaxen running ultrix - tm_file="${tm_file} vax/ultrix.h" - use_collect2=yes - float_format=vax - ;; - vax-*-vms*) # vaxen running VMS - xm_file=vax/xm-vms.h - tm_file=vax/vms.h - float_format=vax - ;; - vax-*-*) # vax default entry - float_format=vax - ;; - we32k-att-sysv*) - xm_file="${xm_file} xm-svr3" - use_collect2=yes - ;; - # CYGNUS LOCAL ports - arm-*-pe*) - tm_file=arm/pe.h - tmake_file=arm/t-pe - extra_objs=pe.o - ;; - d10v-*-*) - float_format=d10v - ;; - d30v-*-*) - float_format=i64 - ;; - fr30-*-elf) - tm_file="fr30/fr30.h" - tmake_file=fr30/t-fr30 - extra_parts="crti.o crtn.o crtbegin.o crtend.o" - ;; - i[34567]86-*-elf*) - xm_file="${xm_file} xm-svr4.h i386/xm-sysv4.h" - tm_file=i386/i386elf.h - tmake_file=i386/t-i386elf - xmake_file=x-svr4 - ;; - i[34567]86-*-netware) # Intel 80386's running netware - # CYGNUS LOCAL - tm_file=i386/netware.h - tmake_file=i386/t-netware - fixincludes=Makefile.in - ;; - i[34567]86-*-unixware) - xm_file="xm-siglist.h xm-alloca.h ${xm_file}" - xm_defines="USG POSIX SMALL_ARG_MAX" - tm_file=i386/sysv4.h - if [ x$stabs = xyes ] - then - tm_file="${tm_file} dbx.h" - fi - tmake_file=i386/t-crtpic - xmake_file=x-svr4 - extra_parts="crtbegin.o crtend.o" - ;; - i960-intel-nindy) - tmake_file=i960/t-vxworks960 - use_collect2=yes - ;; - m68000-ncr-sysv*) - tm_file=m68k/tower-as.h - xm_file=m68k/xm-tower.h - xmake_file=m68k/x-tower - tmake_file=m68k/t-svr3 - extra_headers=math-68881.h - ;; - m68k-ericsson-OSE |\ - m68k-ericsson-ose) - tm_file=m68k/ose68k.h - tmake_file=m68k/t-ose68 - extra_headers=math-68881.h - ;; - m680[01234]0-wrs-vxworks*) - tm_file=m68k/vxm68k.h - tmake_file=m68k/t-vxworks68 - extra_headers=math-68881.h - ;; - m680[0234]0-*-aout* |\ - m683[03]2-*-aout*) - tmake_file=m68k/t-m68kbare - tm_file="m68k/m68k-aout.h libgloss.h" - extra_headers=math-68881.h - ;; - m680[0234]0-*-coff* |\ - m683[03]2-*-coff*) - tmake_file=m68k/t-m68kbare - tm_file="m68k/m68k-coff.h dbx.h libgloss.h" - extra_headers=math-68881.h - ;; - m68360-*-coff*) - tmake_file=m68k/t-m68kbare - tm_file="m68k/m68360-coff.h dbx.h libgloss.h" - extra_headers=math-68881.h - ;; - m68000-*-os68k*) - tm_file=m68k/os68000.h - extra_headers=math-68881.h - ;; - m68k-*-os68k*) - tm_file=m68k/os68000.h - extra_headers=math-68881.h - ;; - # This is a host port only, and won't work as a target. - mips*-nec-sysv4*) # MIPS NEC SVR4 - tm_file=mips/svr4-t.h - if [ x$stabs = xyes ]; then - tm_file="${tm_file} dbx.h" - fi - xm_file="xm-siglist.h ${xm_file}" - xm_defines=USG - if [ x$gas = xyes ] - then - tmake_file=mips/t-mips-gas - extra_parts="crtbegin.o crtend.o" - else - tmake_file=mips/t-mips - extra_passes="mips-tfile mips-tdump" - fi - if [ x$gnu_ld != xyes ] - then - use_collect2=yes - fi - ;; - mips*-*-lnews*) - tm_file=mips/ecoffl.h - if [ x$stabs = xyes ]; then - tm_file="${tm_file} dbx.h" - fi - tmake_file=mips/t-ecoff - ;; - mips64vr4300-*-elf*) - tm_file="mips/elfb4300.h" - tmake_file=mips/t-vr4300 - ;; - mips64vr4300el-*-elf*) - tm_file="mips/elfl4300.h libgloss.h" - tmake_file=mips/t-vr4300 - ;; - mips64vr4100-*-elf*) - tm_file="mips/elfb4100.h mips/abi64.h" - tmake_file=mips/t-vr4100 - ;; - mips64vr4100el-*-elf*) - tm_file="mips/elfl4100.h mips/abi64.h libgloss.h" - tmake_file=mips/t-vr4100 - ;; - mips64vr5000-*-elf*) - tm_file="mips/elfb5000.h" - tmake_file=mips/t-vr5000 - # Use haifa by default. - if [ x$enable_haifa != xno ]; then - enable_haifa=yes - fi - ;; - mips64vr5000el-*-elf*) - tm_file="mips/elfl5000.h libgloss.h" - tmake_file=mips/t-vr5000 - # Use haifa by default. - if [ x$enable_haifa != xno ]; then - enable_haifa=yes - fi - ;; - sparclite-*-elf*) - tm_file="sparc/liteelf.h libgloss.h" - tmake_file=sparc/t-sparclite - extra_parts="crtbegin.o crtend.o" - ;; - thumb-*-pe) - tm_file=arm/tpe.h - out_file=arm/thumb.c - xm_file=arm/xm-thumb.h - md_file=arm/thumb.md - tmake_file=arm/t-pe-thumb - extra_objs=pe.o - ;; - z8k-*-*) - ;; - # END CYGNUS LOCAL - - # CYGNUS LOCAL raeburn/vr5400 - mips64vr5400-*-elf*) - tm_file="mips/big.h mips/elf5400.h libgloss.h" - tmake_file=mips/t-biendian - # Use haifa by default for the r5400 - if [ x$enable_haifa != xno ]; then - enable_haifa=yes - fi - ;; - mips64vr5400el-*-elf*) - tm_file="mips/little.h mips/elf5400.h libgloss.h" - tmake_file=mips/t-biendian - # Use haifa by default for the r5400 - if [ x$enable_haifa != xno ]; then - enable_haifa=yes - fi - ;; - # END CYGNUS LOCAL raeburn/vr5400 - -# This hasn't been upgraded to GCC 2. - *) - echo "Configuration $machine not supported" 1>&2 - exit 1 - ;; esac case $machine in @@ -5756,7 +2916,6 @@ for machine in $build $host $target; do # supports are matched above and just set $cpu_type. xm_file="xm-gnu.h ${xm_file}" tm_file=${cpu_type}/gnu.h - extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o" # GNU always uses ELF. elf=yes # GNU tools are the only tools. @@ -5927,15 +3086,6 @@ for machine in $build $host $target; do fi fi - # No need for collect2 if we have the GNU linker. - # Actually, there is now; GNU ld doesn't handle the EH info or - # collecting for shared libraries. - #case x$gnu_ld in - #xyes) - # use_collect2= - # ;; - #esac - # Save data on machine being used to compile GCC in build_xm_file. # Save data on host machine in vars host_xm_file and host_xmake_file. if test x$pass1done = x @@ -6269,22 +3419,6 @@ else done fi -if test x$use_collect2 = xno; then - use_collect2= -fi - -# Add a definition of USE_COLLECT2 if system wants one. -# Also tell toplev.c what to do. -# This substitutes for lots of t-* files. -if test x$use_collect2 = x -then - will_use_collect2= - maybe_use_collect2= -else - will_use_collect2="collect2" - maybe_use_collect2="-DUSE_COLLECT2" -fi - # NEED TO CONVERT # Set MD_DEPS if the real md file is in md.pre-cpp. # Set MD_CPP to the cpp to pass the md file through. Md files use ';' @@ -6311,11 +3445,7 @@ fi # If we have ld in the build tree, make a link to it. if test -f ../ld/Makefile; then -# if test x$use_collect2 = x; then -# rm -f ld; $symbolic_link ../ld/ld-new$host_exeext ld$host_exeext 2>/dev/null -# else - rm -f collect-ld; $symbolic_link ../ld/ld-new$host_exeext collect-ld$host_exeext 2>/dev/null -# fi + rm -f ld; $symbolic_link ../ld/ld-new$host_exeext ld$host_exeext 2>/dev/null fi # Figure out what assembler alignment features are present. @@ -7058,8 +4188,6 @@ s%@build_install_headers_dir@%$build_install_headers_dir%g s%@build_exeext@%$build_exeext%g s%@host_exeext@%$host_exeext%g s%@float_h_file@%$float_h_file%g -s%@will_use_collect2@%$will_use_collect2%g -s%@maybe_use_collect2@%$maybe_use_collect2%g s%@cc_set_by_configure@%$cc_set_by_configure%g s%@stage_prefix_set_by_configure@%$stage_prefix_set_by_configure%g s%@install@%$install%g diff --git a/gcc/configure.in b/gcc/configure.in index ce1367e..5d801fa 100755 --- a/gcc/configure.in +++ b/gcc/configure.in @@ -444,8 +444,6 @@ for machine in $build $host $target; do extra_gcc_objs= xm_defines= float_format= - # Set this to force installation and use of collect2. - use_collect2= # Set this to override the default target model. target_cpu_default= # Set this to control which fixincludes program to use. @@ -522,2706 +520,12 @@ changequote([,])dnl case $machine in # Support site-specific machine types. - *local*) - cpu_type=`echo $machine | sed -e 's/-.*//'` - rest=`echo $machine | sed -e "s/$cpu_type-//"` - xm_file=${cpu_type}/xm-$rest.h - tm_file=${cpu_type}/$rest.h - if test -f $srcdir/config/${cpu_type}/x-$rest; \ - then xmake_file=${cpu_type}/x-$rest; \ - else true; \ - fi - if test -f $srcdir/config/${cpu_type}/t-$rest; \ - then tmake_file=${cpu_type}/t-$rest; \ - else true; \ - fi - ;; - 1750a-*-*) - ;; - a29k-*-bsd* | a29k-*-sym1*) - tm_file="${tm_file} a29k/unix.h" - xm_defines=USG - xmake_file=a29k/x-unix - use_collect2=yes - ;; - a29k-*-udi | a29k-*-coff) - tm_file="${tm_file} dbxcoff.h a29k/udi.h" - tmake_file=a29k/t-a29kbare - ;; - a29k-wrs-vxworks*) - tm_file="${tm_file} dbxcoff.h a29k/udi.h a29k/vx29k.h" - tmake_file=a29k/t-vx29k - extra_parts="crtbegin.o crtend.o" - thread_file='vxworks' - ;; - a29k-*-*) # Default a29k environment. - use_collect2=yes - ;; - alpha*-*-linux-gnuecoff*) - tm_file="${tm_file} alpha/linux-ecoff.h alpha/linux.h" - target_cpu_default="MASK_GAS" - gas=no - xmake_file=none - gas=yes gnu_ld=yes - ;; - alpha*-*-linux-gnulibc1*) - tm_file="${tm_file} alpha/elf.h alpha/linux.h alpha/linux-elf.h" - target_cpu_default="MASK_GAS" - tmake_file="t-linux t-linux-gnulibc1 alpha/t-linux alpha/t-crtbe" - extra_parts="crtbegin.o crtend.o" - fixincludes=fixinc.wrap - xmake_file=none - gas=yes gnu_ld=yes - if test x$enable_threads = xyes; then - thread_file='posix' - fi - ;; - alpha*-*-linux-gnu*) - tm_file="${tm_file} alpha/elf.h alpha/linux.h alpha/linux-elf.h" - target_cpu_default="MASK_GAS" - tmake_file="t-linux alpha/t-linux alpha/t-crtbe" - extra_parts="crtbegin.o crtend.o" - xmake_file=none - fixincludes=Makefile.in - gas=yes gnu_ld=yes - if test x$enable_threads = xyes; then - thread_file='posix' - fi - ;; - alpha*-*-netbsd*) - tm_file="${tm_file} alpha/elf.h alpha/netbsd.h alpha/netbsd-elf.h" - target_cpu_default="MASK_GAS" - tmake_file="alpha/t-crtbe" - extra_parts="crtbegin.o crtend.o" - xmake_file=none - fixincludes=fixinc.wrap - gas=yes gnu_ld=yes - ;; - - alpha*-dec-osf*) - if test x$stabs = xyes - then - tm_file="${tm_file} dbx.h" - fi - if test x$gas != xyes - then - extra_passes="mips-tfile mips-tdump" - fi - use_collect2=yes - case $machine in - *-*-osf1*) - tm_file="${tm_file} alpha/osf.h alpha/osf12.h alpha/osf2or3.h" - ;; -changequote(,)dnl - *-*-osf[23]*) -changequote([,])dnl - tm_file="${tm_file} alpha/osf.h alpha/osf2or3.h" - ;; - *-*-osf4*) - tm_file="${tm_file} alpha/osf.h" - # Some versions of OSF4 (specifically X4.0-9 296.7) have - # a broken tar, so we use cpio instead. - install_headers_dir=install-headers-cpio - ;; - esac - case $machine in -changequote(,)dnl - *-*-osf4.0[b-z] | *-*-osf4.[1-9]*) -changequote([,])dnl - target_cpu_default=MASK_SUPPORT_ARCH - ;; - esac - ;; - alpha*-*-vxworks*) - tm_file="${tm_file} dbx.h alpha/vxworks.h" - if [ x$gas != xyes ] - then - extra_passes="mips-tfile mips-tdump" - fi - use_collect2=yes - ;; - alpha*-*-winnt*) - tm_file="${tm_file} alpha/win-nt.h" - xm_file="${xm_file} config/winnt/xm-winnt.h alpha/xm-winnt.h" - tmake_file=t-libc-ok - xmake_file=winnt/x-winnt - extra_host_objs=oldnames.o - extra_gcc_objs="spawnv.o oldnames.o" - fixincludes=fixinc.winnt - if test x$gnu_ld != xyes - then - extra_programs=ld.exe - fi - if test x$enable_threads = xyes; then - thread_file='win32' - fi - ;; - alpha*-dec-vms*) - tm_file=alpha/vms.h - xm_file="${xm_file} alpha/xm-vms.h" - tmake_file=alpha/t-vms - fixincludes=Makefile.in - ;; - arc-*-elf*) - extra_parts="crtinit.o crtfini.o" - ;; - arm-*-coff* | armel-*-coff*) - tm_file=arm/coff.h - tmake_file=arm/t-bare - ;; -changequote(,)dnl - arm-*-riscix1.[01]*) # Acorn RISC machine (early versions) -changequote([,])dnl - tm_file=arm/riscix1-1.h - use_collect2=yes - ;; - arm-*-riscix*) # Acorn RISC machine - if test x$gas = xyes - then - tm_file=arm/rix-gas.h - else - tm_file=arm/riscix.h - fi - xmake_file=arm/x-riscix - tmake_file=arm/t-riscix - use_collect2=yes - ;; - arm-semi-aout | armel-semi-aout) - tm_file=arm/semi.h - tmake_file=arm/t-semi - fixincludes=Makefile.in # There is nothing to fix - ;; - arm-semi-aof | armel-semi-aof) - tm_file=arm/semiaof.h - tmake_file=arm/t-semiaof - fixincludes=Makefile.in # There is nothing to fix - ;; - arm*-*-netbsd*) - tm_file=arm/netbsd.h - xm_file="arm/xm-netbsd.h ${xm_file}" - tmake_file="t-netbsd arm/t-netbsd" - # On NetBSD, the headers are already okay, except for math.h. - fixincludes=fixinc.wrap - ;; - arm*-*-linux-gnuaout*) # ARM GNU/Linux with a.out - cpu_type=arm - xmake_file=x-linux - tm_file=arm/linux-aout.h - tmake_file=arm/t-linux - fixincludes=Makefile.in - gnu_ld=yes - ;; - arm*-*-linux-gnu*) # ARM GNU/Linux with ELF - xm_file=arm/xm-linux.h - xmake_file=x-linux - case $machine in - armv2*-*-*) - tm_file=arm/linux-elf26.h - ;; - *) - tm_file=arm/linux-elf.h - ;; - esac - tmake_file="t-linux arm/t-linux" - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - fixincludes=Makefile.in # Nothing to fix - gnu_ld=yes - ;; - arm*-*-aout) - tm_file=arm/aout.h - tmake_file=arm/t-bare - ;; - arm*-*-ecos-elf) - tm_file=arm/ecos-elf.h - tmake_file=arm/t-elf - ;; - arm*-*-elf) - tm_file=arm/unknown-elf.h - tmake_file=arm/t-arm-elf - ;; - arm*-*-oabi) - tm_file=arm/unknown-elf-oabi.h - tmake_file=arm/t-arm-elf - ;; - c1-convex-*) # Convex C1 - target_cpu_default=1 - use_collect2=yes - fixincludes=Makefile.in - ;; - c2-convex-*) # Convex C2 - target_cpu_default=2 - use_collect2=yes - fixincludes=Makefile.in - ;; - c32-convex-*) - target_cpu_default=4 - use_collect2=yes - fixincludes=Makefile.in - ;; - c34-convex-*) - target_cpu_default=8 - use_collect2=yes - fixincludes=Makefile.in - ;; - c38-convex-*) - target_cpu_default=16 - use_collect2=yes - fixincludes=Makefile.in - ;; - c4x-*) - cpu_type=c4x - tmake_file=c4x/t-c4x - ;; - clipper-intergraph-clix*) - tm_file="${tm_file} svr3.h clipper/clix.h" - xm_file=clipper/xm-clix.h - xmake_file=clipper/x-clix - extra_headers=va-clipper.h - extra_parts="crtbegin.o crtend.o" - install_headers_dir=install-headers-cpio - ;; - dsp16xx-*) - ;; - elxsi-elxsi-*) - use_collect2=yes - ;; -# This hasn't been upgraded to GCC 2. -# fx80-alliant-*) # Alliant FX/80 -# ;; - h8300-*-*) - float_format=i32 - ;; - hppa1.1-*-pro*) - tm_file="pa/pa-pro.h ${tm_file} pa/pa-pro-end.h libgloss.h" - xm_file=pa/xm-papro.h - tmake_file=pa/t-pro - ;; - hppa1.1-*-osf*) - target_cpu_default=1 - tm_file="${tm_file} pa/pa-osf.h" - use_collect2=yes - fixincludes=Makefile.in - ;; - hppa1.1-*-rtems*) - tm_file="pa/pa-pro.h ${tm_file} pa/pa-pro-end.h libgloss.h pa/rtems.h" - xm_file=pa/xm-papro.h - tmake_file=pa/t-pro - ;; - hppa1.0-*-osf*) - tm_file="${tm_file} pa/pa-osf.h" - use_collect2=yes - fixincludes=Makefile.in - ;; - hppa1.1-*-bsd*) - target_cpu_default=1 - use_collect2=yes - fixincludes=Makefile.in - ;; - hppa1.0-*-bsd*) - use_collect2=yes - fixincludes=Makefile.in - ;; - hppa1.0-*-hpux7*) - tm_file="pa/pa-oldas.h ${tm_file} pa/pa-hpux7.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if test x$gas = xyes - then - tm_file="${tm_file} pa/gas.h" - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; -changequote(,)dnl - hppa1.0-*-hpux8.0[0-2]*) -changequote([,])dnl - tm_file="${tm_file} pa/pa-hpux.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if test x$gas = xyes - then - tm_file="${tm_file} pa/pa-gas.h" - else - tm_file="pa/pa-oldas.h ${tm_file}" - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; -changequote(,)dnl - hppa1.1-*-hpux8.0[0-2]*) -changequote([,])dnl - target_cpu_default=1 - tm_file="${tm_file} pa/pa-hpux.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if test x$gas = xyes - then - tm_file="${tm_file} pa/pa-gas.h" - else - tm_file="pa/pa-oldas.h ${tm_file}" - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.1-*-hpux8*) - target_cpu_default=1 - tm_file="${tm_file} pa/pa-hpux.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if test x$gas = xyes - then - tm_file="${tm_file} pa/pa-gas.h" - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.0-*-hpux8*) - tm_file="${tm_file} pa/pa-hpux.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if test x$gas = xyes - then - tm_file="${tm_file} pa/pa-gas.h" - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.1-*-hpux10* | hppa2*-*-hpux10*) - target_cpu_default=1 - tm_file="${tm_file} pa/pa-hpux.h pa/pa-hpux10.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - tmake_file=pa/t-pa - if test x$gas = xyes - then - tm_file="${tm_file} pa/pa-gas.h" - fi - if test x$enable_threads = x; then - enable_threads=$have_pthread_h - fi - if test x$enable_threads = xyes; then - thread_file='dce' - tmake_file="${tmake_file} pa/t-dce-thr" - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.0-*-hpux10*) - tm_file="${tm_file} pa/pa-hpux.h pa/pa-hpux10.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if test x$gas = xyes - then - tm_file="${tm_file} pa/pa-gas.h" - fi - if test x$enable_threads = x; then - enable_threads=$have_pthread_h - fi - if test x$enable_threads = xyes; then - thread_file='dce' - tmake_file="${tmake_file} pa/t-dce-thr" - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - # CYGNUS LOCAL hpux11 - hppa1.1-*-hpux11* | hppa2*-*-hpux11*) - target_cpu_default=1 - tm_file="${tm_file} pa/pa-hpux.h pa/pa-hpux11.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - tmake_file=pa/t-pa - if [[ x$gas = xyes ]] - then - tm_file="${tm_file} pa/pa-gas.h" - fi -# if [[ x$enable_threads = x ]]; then -# enable_threads=$have_pthread_h -# fi -# if [[ x$enable_threads = xyes ]]; then -# thread_file='dce' -# tmake_file="${tmake_file} pa/t-dce-thr" -# fi - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.0-*-hpux11*) - tm_file="${tm_file} pa/pa-hpux.h pa/pa-hpux11.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if [[ x$gas = xyes ]] - then - tm_file="${tm_file} pa/pa-gas.h" - fi -# if [[ x$enable_threads = x ]]; then -# enable_threads=$have_pthread_h -# fi -# if [[ x$enable_threads = xyes ]]; then -# thread_file='dce' -# tmake_file="${tmake_file} pa/t-dce-thr" -# fi - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - # END CYGNUS LOCAL - hppa1.1-*-hpux* | hppa2*-*-hpux*) - target_cpu_default=1 - tm_file="${tm_file} pa/pa-hpux.h pa/pa-hpux9.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if test x$gas = xyes - then - tm_file="${tm_file} pa/pa-gas.h" - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.0-*-hpux*) - tm_file="${tm_file} pa/pa-hpux.h pa/pa-hpux9.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if test x$gas = xyes - then - tm_file="${tm_file} pa/pa-gas.h" - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.1-*-hiux* | hppa2*-*-hiux*) - target_cpu_default=1 - tm_file="${tm_file} pa/pa-hpux.h pa/pa-hiux.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if test x$gas = xyes - then - tm_file="${tm_file} pa/pa-gas.h" - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.0-*-hiux*) - tm_file="${tm_file} pa/pa-hpux.h pa/pa-hiux.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if test x$gas = xyes - then - tm_file="${tm_file} pa/pa-gas.h" - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa*-*-lites*) - target_cpu_default=1 - use_collect2=yes - fixincludes=Makefile.in - ;; - i370-*-mvs*) - ;; -changequote(,)dnl - i[34567]86-ibm-aix*) # IBM PS/2 running AIX -changequote([,])dnl - if test x$gas = xyes - then - tm_file=i386/aix386.h - extra_parts="crtbegin.o crtend.o" - tmake_file=i386/t-crtstuff - else - tm_file=i386/aix386ng.h - use_collect2=yes - fi - xm_file="xm-alloca.h i386/xm-aix.h ${xm_file}" - xm_defines=USG - xmake_file=i386/x-aix - ;; -changequote(,)dnl - i[34567]86-ncr-sysv4*) # NCR 3000 - ix86 running system V.4 -changequote([,])dnl - xm_file="xm-siglist.h xm-alloca.h ${xm_file}" - xm_defines="USG POSIX SMALL_ARG_MAX" - xmake_file=i386/x-ncr3000 - if test x$stabs = xyes -a x$gas = xyes - then - tm_file=i386/sysv4gdb.h - else - tm_file=i386/sysv4.h - fi - extra_parts="crtbegin.o crtend.o" - tmake_file=i386/t-crtpic - ;; -changequote(,)dnl - i[34567]86-next-*) -changequote([,])dnl - tm_file=i386/next.h - xm_file=i386/xm-next.h - tmake_file=i386/t-next - xmake_file=i386/x-next - extra_objs=nextstep.o - extra_parts="crtbegin.o crtend.o" - if test x$enable_threads = xyes; then - thread_file='mach' - fi - ;; -changequote(,)dnl - i[34567]86-sequent-bsd*) # 80386 from Sequent -changequote([,])dnl - use_collect2=yes - if test x$gas = xyes - then - tm_file=i386/seq-gas.h - else - tm_file=i386/sequent.h - fi - ;; -changequote(,)dnl - i[34567]86-sequent-ptx1*) -changequote([,])dnl - xm_defines="USG SVR3" - xmake_file=i386/x-sysv3 - tm_file=i386/seq-sysv3.h - tmake_file=i386/t-crtstuff - fixincludes=fixinc.ptx - extra_parts="crtbegin.o crtend.o" - install_headers_dir=install-headers-cpio - ;; -changequote(,)dnl - i[34567]86-sequent-ptx2* | i[34567]86-sequent-sysv3*) -changequote([,])dnl - xm_defines="USG SVR3" - xmake_file=i386/x-sysv3 - tm_file=i386/seq2-sysv3.h - tmake_file=i386/t-crtstuff - extra_parts="crtbegin.o crtend.o" - fixincludes=fixinc.ptx - install_headers_dir=install-headers-cpio - ;; -changequote(,)dnl - i[34567]86-sequent-ptx4* | i[34567]86-sequent-sysv4*) -changequote([,])dnl - xm_file="xm-siglist.h xm-alloca.h ${xm_file}" - xm_defines="USG POSIX SMALL_ARG_MAX" - xmake_file=x-svr4 - tm_file=i386/ptx4-i.h - tmake_file=t-svr4 - extra_parts="crtbegin.o crtend.o" - fixincludes=fixinc.ptx - install_headers_dir=install-headers-cpio - ;; - i386-sun-sunos*) # Sun i386 roadrunner - xm_defines=USG - tm_file=i386/sun.h - use_collect2=yes - ;; -changequote(,)dnl - i[34567]86-wrs-vxworks*) -changequote([,])dnl - tm_file=i386/vxi386.h - tmake_file=i386/t-i386bare - ;; -changequote(,)dnl - i[34567]86-*-aout*) -changequote([,])dnl - tm_file=i386/i386-aout.h - tmake_file=i386/t-i386bare - ;; -changequote(,)dnl - i[34567]86-*-bsdi* | i[34567]86-*-bsd386*) -changequote([,])dnl - tm_file=i386/bsd386.h -# tmake_file=t-libc-ok - ;; -changequote(,)dnl - i[34567]86-*-bsd*) -changequote([,])dnl - tm_file=i386/386bsd.h -# tmake_file=t-libc-ok -# Next line turned off because both 386BSD and BSD/386 use GNU ld. -# use_collect2=yes - ;; -changequote(,)dnl - i[34567]86-*-freebsdelf*) -changequote([,])dnl - tm_file="i386/i386.h i386/att.h linux.h i386/freebsd-elf.h i386/perform.h" - # On FreeBSD, the headers are already ok, except for math.h. - fixincludes=fixinc.wrap - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - tmake_file=i386/t-freebsd - gas=yes - gnu_ld=yes - stabs=yes - ;; -changequote(,)dnl - i[34567]86-*-freebsd*) -changequote([,])dnl - tm_file=i386/freebsd.h - # On FreeBSD, the headers are already ok, except for math.h. - fixincludes=fixinc.wrap - tmake_file=i386/t-freebsd - ;; - # We are hoping OpenBSD is still close enough to NetBSD that we can - # share the configurations. -changequote(,)dnl - i[34567]86-*-netbsd* | i[34567]86-*-openbsd*) -changequote([,])dnl - tm_file=i386/netbsd.h - # On NetBSD, the headers are already okay, except for math.h. - fixincludes=fixinc.wrap - tmake_file=t-netbsd - ;; -changequote(,)dnl - i[34567]86-*-coff*) -changequote([,])dnl - tm_file=i386/i386-coff.h - tmake_file=i386/t-i386bare - ;; -changequote(,)dnl - i[34567]86-*-isc*) # 80386 running ISC system -changequote([,])dnl - xm_file="${xm_file} i386/xm-isc.h" - xm_defines="USG SVR3" - case $machine in -changequote(,)dnl - i[34567]86-*-isc[34]*) -changequote([,])dnl - xmake_file=i386/x-isc3 - ;; - *) - xmake_file=i386/x-isc - ;; - esac - if test x$gas = xyes -a x$stabs = xyes - then - tm_file=i386/iscdbx.h - tmake_file=i386/t-svr3dbx - extra_parts="svr3.ifile svr3z.ifile" - else - tm_file=i386/isccoff.h - tmake_file=i386/t-crtstuff - extra_parts="crtbegin.o crtend.o" - fi - install_headers_dir=install-headers-cpio - ;; -changequote(,)dnl - i[34567]86-*-linux-gnuoldld*) # Intel 80386's running GNU/Linux -changequote([,])dnl # with a.out format using - # pre BFD linkers - xmake_file=x-linux-aout - tmake_file="t-linux-aout i386/t-crtstuff" - tm_file=i386/linux-oldld.h - fixincludes=fixinc.x86-linux-gnu - gnu_ld=yes - float_format=i386 - ;; -changequote(,)dnl - i[34567]86-*-linux-gnuaout*) # Intel 80386's running GNU/Linux -changequote([,])dnl # with a.out format - xmake_file=x-linux-aout - tmake_file="t-linux-aout i386/t-crtstuff" - tm_file=i386/linux-aout.h - fixincludes=fixinc.x86-linux-gnu - gnu_ld=yes - float_format=i386 - ;; -changequote(,)dnl - i[34567]86-*-linux-gnulibc1) # Intel 80386's running GNU/Linux -changequote([,])dnl # with ELF format using the - # GNU/Linux C library 5 - xmake_file=x-linux - tm_file=i386/linux.h - tmake_file="t-linux t-linux-gnulibc1 i386/t-crtstuff" - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - fixincludes=fixinc.x86-linux-gnu - gnu_ld=yes - float_format=i386 - if test x$enable_threads = xyes; then - thread_file='single' - fi - ;; -changequote(,)dnl - i[34567]86-*-linux-gnu*) # Intel 80386's running GNU/Linux -changequote([,])dnl # with ELF format using glibc 2 - # aka GNU/Linux C library 6 - xmake_file=x-linux - tm_file=i386/linux.h - tmake_file="t-linux i386/t-crtstuff" - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - fixincludes=fixinc.x86-linux-gnu - gnu_ld=yes - float_format=i386 - if test x$enable_threads = xyes; then - thread_file='posix' - fi - ;; -changequote(,)dnl - i[34567]86-*-gnu*) -changequote([,])dnl - ;; -changequote(,)dnl - i[34567]86-go32-msdos | i[34567]86-*-go32*) -changequote([,])dnl - xm_file=i386/xm-go32.h - tm_file=i386/go32.h - xmake_file=i386/x-go32 # CYGNUS LOCAL - tmake_file=i386/t-go32 - ;; -changequote(,)dnl - i[34567]86-pc-msdosdjgpp*) -changequote([,])dnl - xm_file=i386/xm-go32.h - tm_file=i386/go32.h - tmake_file=i386/t-go32 - xmake_file=i386/x-go32 - gnu_ld=yes - gas=yes - exeext=.exe - case $host in - *pc-msdosdjgpp*) - target_alias=djgpp - ;; - esac - ;; -changequote(,)dnl - i[34567]86-moss-msdos* | i[34567]86-*-moss*) -changequote([,])dnl - tm_file=i386/moss.h - tmake_file=t-libc-ok - fixincludes=Makefile.in - gnu_ld=yes - gas=yes - ;; -changequote(,)dnl - i[34567]86-*-lynxos*) -changequote([,])dnl - if test x$gas = xyes - then - tm_file=i386/lynx.h - else - tm_file=i386/lynx-ng.h - fi - xm_file=i386/xm-lynx.h - tmake_file=i386/t-i386bare - xmake_file=x-lynx - ;; -changequote(,)dnl - i[34567]86-*-mach*) -changequote([,])dnl - tm_file=i386/mach.h -# tmake_file=t-libc-ok - use_collect2=yes - ;; -changequote(,)dnl - i[34567]86-*-osfrose*) # 386 using OSF/rose -changequote([,])dnl - if test x$elf = xyes - then - tm_file=i386/osfelf.h - use_collect2= - else - tm_file=i386/osfrose.h - use_collect2=yes - fi - xm_file="i386/xm-osf.h ${xm_file}" - xmake_file=i386/x-osfrose - tmake_file=i386/t-osf - extra_objs=halfpic.o - ;; -changequote(,)dnl - i[34567]86-go32-rtems*) -changequote([,])dnl - cpu_type=i386 - xm_file=i386/xm-go32.h - tm_file=i386/go32-rtems.h - tmake_file="i386/t-go32 t-rtems" - ;; -changequote(,)dnl - i[34567]86-*-rtemself*) -changequote([,])dnl - cpu_type=i386 - tm_file=i386/rtemself.h - tmake_file="i386/t-i386bare t-rtems" - ;; -changequote(,)dnl - i[34567]86-*-rtems*) -changequote([,])dnl - cpu_type=i386 - tm_file=i386/rtems.h - tmake_file="i386/t-i386bare t-rtems" - ;; -changequote(,)dnl - i[34567]86-*-sco3.2v5*) # 80386 running SCO Open Server 5 -changequote([,])dnl - xm_file="xm-siglist.h xm-alloca.h ${xm_file} i386/xm-sco5.h" - xm_defines="USG SVR3" - xmake_file=i386/x-sco5 - fixincludes=fixinc.sco - install_headers_dir=install-headers-cpio - tm_file=i386/sco5.h - if test x$gas = xyes - then - tm_file="i386/sco5gas.h ${tm_file}" - tmake_file=i386/t-sco5gas - else - tmake_file=i386/t-sco5 - fi - extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o" - ;; -changequote(,)dnl - i[34567]86-*-sco3.2v4*) # 80386 running SCO 3.2v4 system -changequote([,])dnl - xm_file="${xm_file} i386/xm-sco.h" - xm_defines="USG SVR3 BROKEN_LDEXP SMALL_ARG_MAX NO_SYS_SIGLIST" - xmake_file=i386/x-sco4 - fixincludes=fixinc.sco - install_headers_dir=install-headers-cpio - if test x$stabs = xyes - then - tm_file=i386/sco4dbx.h - tmake_file=i386/t-svr3dbx - extra_parts="svr3.ifile svr3z.rfile" - else - tm_file=i386/sco4.h - tmake_file=i386/t-crtstuff - extra_parts="crtbegin.o crtend.o" - fi - truncate_target=yes - ;; -changequote(,)dnl - i[34567]86-*-sco*) # 80386 running SCO system -changequote([,])dnl - xm_file=i386/xm-sco.h - xmake_file=i386/x-sco - install_headers_dir=install-headers-cpio - if test x$stabs = xyes - then - tm_file=i386/scodbx.h - tmake_file=i386/t-svr3dbx - extra_parts="svr3.ifile svr3z.rfile" - else - tm_file=i386/sco.h - extra_parts="crtbegin.o crtend.o" - tmake_file=i386/t-crtstuff - fi - truncate_target=yes - ;; -changequote(,)dnl - i[34567]86-*-solaris2*) -changequote([,])dnl - xm_file="xm-siglist.h xm-alloca.h ${xm_file}" - xm_defines="USG POSIX SMALL_ARG_MAX" - if test x$stabs = xyes - then - tm_file=i386/sol2dbg.h - else - tm_file=i386/sol2.h - fi - tmake_file=i386/t-sol2 - extra_parts="crt1.o crti.o crtn.o gcrt1.o gmon.o crtbegin.o crtend.o" - xmake_file=x-svr4 - case $machine in -changequote(,)dnl - *-*-solaris2.[0-4]) -changequote([,])dnl - fixincludes=fixinc.svr4;; - *) - fixincludes=fixinc.wrap;; - esac - if test x$enable_threads = xyes; then - thread_file='solaris' - fi - ;; -changequote(,)dnl - i[34567]86-*-sysv5*) # Intel x86 on System V Release 5 -changequote([,])dnl - xm_file="xm-alloca.h xm-siglist.h ${xm_file}" - xm_defines="USG POSIX" - tm_file=i386/sysv4.h - if test x$stabs = xyes - then - tm_file="${tm_file} dbx.h" - fi - tmake_file=i386/t-crtpic - xmake_file=x-svr4 - extra_parts="crtbegin.o crtend.o" - fixincludes=fixinc.svr4 - ;; -changequote(,)dnl - i[34567]86-*-sysv4*) # Intel 80386's running system V.4 -changequote([,])dnl - xm_file="xm-siglist.h xm-alloca.h ${xm_file}" - xm_defines="USG POSIX SMALL_ARG_MAX" - tm_file=i386/sysv4.h - if test x$stabs = xyes - then - tm_file="${tm_file} dbx.h" - fi - tmake_file=i386/t-crtpic - xmake_file=x-svr4 - extra_parts="crtbegin.o crtend.o" - ;; -changequote(,)dnl - i[34567]86-*-udk*) # Intel x86 on SCO UW/OSR5 Dev Kit -changequote([,])dnl - xm_file="xm-alloca.h xm-siglist.h ${xm_file}" - xm_defines="USG POSIX" - tm_file=i386/udk.h - tmake_file="i386/t-crtpic i386/t-udk" - xmake_file=x-svr4 - extra_parts="crtbegin.o crtend.o" - fixincludes="fixinc.svr4" - ;; -changequote(,)dnl - i[34567]86-*-osf1*) # Intel 80386's running OSF/1 1.3+ -changequote([,])dnl - cpu_type=i386 - xm_file="${xm_file} xm-svr4.h i386/xm-sysv4.h i386/xm-osf1elf.h" - xm_defines="USE_C_ALLOCA SMALL_ARG_MAX" - fixincludes=Makefile.in #Don't do it on OSF/1 - if test x$stabs = xyes - then - tm_file=i386/osf1elfgdb.h - else - tm_file=i386/osf1elf.h - fi - tmake_file=i386/t-osf1elf - xmake_file=i386/x-osf1elf - extra_parts="crti.o crtn.o crtbegin.o crtend.o" - ;; -changequote(,)dnl - i[34567]86-*-sysv*) # Intel 80386's running system V -changequote([,])dnl - xm_defines="USG SVR3" - xmake_file=i386/x-sysv3 - if test x$gas = xyes - then - if test x$stabs = xyes - then - tm_file=i386/svr3dbx.h - tmake_file=i386/t-svr3dbx - extra_parts="svr3.ifile svr3z.rfile" - else - tm_file=i386/svr3gas.h - extra_parts="crtbegin.o crtend.o" - tmake_file=i386/t-crtstuff - fi - else - tm_file=i386/sysv3.h - extra_parts="crtbegin.o crtend.o" - tmake_file=i386/t-crtstuff - fi - ;; - i386-*-vsta) # Intel 80386's running VSTa kernel - xm_file="${xm_file} i386/xm-vsta.h" - tm_file=i386/vsta.h - tmake_file=i386/t-vsta - xmake_file=i386/x-vsta - ;; -changequote(,)dnl - i[34567]86-*-win32) -changequote([,])dnl - xm_file="${xm_file} i386/xm-cygwin.h" - tmake_file=i386/t-cygwin - tm_file=i386/win32.h - xmake_file=i386/x-cygwin - extra_objs=winnt.o - fixincludes=Makefile.in - if test x$enable_threads = xyes; then - thread_file='win32' - fi - exeext=.exe - ;; -changequote(,)dnl - i[34567]86-*-pe | i[34567]86-*-cygwin*) -changequote([,])dnl - xm_file="${xm_file} i386/xm-cygwin.h" - tmake_file=i386/t-cygwin - tm_file=i386/cygwin.h - xmake_file=i386/x-cygwin - extra_objs=winnt.o - fixincludes=Makefile.in - if test x$enable_threads = xyes; then - thread_file='win32' - fi - exeext=.exe - ;; -changequote(,)dnl - i[34567]86-*-mingw32*) -changequote([,])dnl - tm_file=i386/mingw32.h - xm_file="${xm_file} i386/xm-mingw32.h" - tmake_file="i386/t-cygwin i386/t-mingw32" - extra_objs=winnt.o - xmake_file=i386/x-cygwin - fixincludes=Makefile.in - if test x$enable_threads = xyes; then - thread_file='win32' - fi - exeext=.exe - case $machine in - *mingw32msv*) - ;; - *minwg32crt* | *mingw32*) - tm_file="${tm_file} i386/crtdll.h" - ;; - esac - ;; -changequote(,)dnl - i[34567]86-*-winnt3*) -changequote([,])dnl - tm_file=i386/win-nt.h - out_file=i386/i386.c - xm_file="xm-winnt.h ${xm_file}" - xmake_file=winnt/x-winnt - tmake_file=i386/t-winnt - extra_host_objs="winnt.o oldnames.o" - extra_gcc_objs="spawnv.o oldnames.o" - fixincludes=fixinc.winnt - if test x$gnu_ld != xyes - then - extra_programs=ld.exe - fi - if test x$enable_threads = xyes; then - thread_file='win32' - fi - ;; -changequote(,)dnl - i[34567]86-dg-dgux*) -changequote([,])dnl - xm_file="xm-alloca.h xm-siglist.h ${xm_file}" - xm_defines="USG POSIX" - out_file=i386/dgux.c - tm_file=i386/dgux.h - tmake_file=i386/t-dgux - xmake_file=i386/x-dgux - fixincludes=fixinc.dgux - install_headers_dir=install-headers-cpio - ;; - i860-alliant-*) # Alliant FX/2800 - tm_file="${tm_file} svr4.h i860/sysv4.h i860/fx2800.h" - xm_file="${xm_file}" - xmake_file=i860/x-fx2800 - tmake_file=i860/t-fx2800 - extra_parts="crtbegin.o crtend.o" - ;; - i860-*-bsd*) - tm_file="${tm_file} i860/bsd.h" - if test x$gas = xyes - then - tm_file="${tm_file} i860/bsd-gas.h" - fi - use_collect2=yes - ;; - i860-*-mach*) - tm_file="${tm_file} i860/mach.h" - tmake_file=t-libc-ok - ;; - i860-*-osf*) # Intel Paragon XP/S, OSF/1AD - tm_file="${tm_file} svr3.h i860/paragon.h" - xm_defines="USG SVR3" - tmake_file=t-osf - ;; - i860-*-sysv3*) - tm_file="${tm_file} svr3.h i860/sysv3.h" - xm_defines="USG SVR3" - xmake_file=i860/x-sysv3 - extra_parts="crtbegin.o crtend.o" - ;; - i860-*-sysv4*) - tm_file="${tm_file} svr4.h i860/sysv4.h" - xm_defines="USG SVR3" - xmake_file=i860/x-sysv4 - tmake_file=t-svr4 - extra_parts="crtbegin.o crtend.o" - ;; - i960-wrs-vxworks5 | i960-wrs-vxworks5.0*) - tm_file="${tm_file} i960/vx960.h" - tmake_file=i960/t-vxworks960 - use_collect2=yes - thread_file='vxworks' - ;; - i960-wrs-vxworks5* | i960-wrs-vxworks) - tm_file="${tm_file} dbxcoff.h i960/i960-coff.h i960/vx960-coff.h" - tmake_file=i960/t-vxworks960 - use_collect2=yes - thread_file='vxworks' - ;; - i960-wrs-vxworks*) - tm_file="${tm_file} i960/vx960.h" - tmake_file=i960/t-vxworks960 - use_collect2=yes - thread_file='vxworks' - ;; - i960-*-coff*) - tm_file="${tm_file} dbxcoff.h i960/i960-coff.h libgloss.h" - tmake_file=i960/t-960bare - use_collect2=yes - ;; - i960-*-rtems) - tmake_file="i960/t-960bare t-rtems" - tm_file="${tm_file} dbxcoff.h i960/rtems.h" - use_collect2=yes - ;; - i960-*-*) # Default i960 environment. - use_collect2=yes - ;; - m32r-*-elf*) - extra_parts="crtinit.o crtfini.o" - extra_parts="crtinit.o crtfini.o m32rx/crtinit.o m32rx/crtfini.o" - ;; - m68000-convergent-sysv*) - tm_file=m68k/ctix.h - xm_file="m68k/xm-3b1.h ${xm_file}" - xm_defines=USG - use_collect2=yes - extra_headers=math-68881.h - ;; - m68000-hp-bsd*) # HP 9000/200 running BSD - tm_file=m68k/hp2bsd.h - xmake_file=m68k/x-hp2bsd - use_collect2=yes - extra_headers=math-68881.h - ;; - m68000-hp-hpux*) # HP 9000 series 300 - xm_file="xm_alloca.h ${xm_file}" - xm_defines="USG NO_SYS_SIGLIST" - if test x$gas = xyes - then - xmake_file=m68k/x-hp320g - tm_file=m68k/hp310g.h - else - xmake_file=m68k/x-hp320 - tm_file=m68k/hp310.h - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - extra_headers=math-68881.h - ;; - m68000-sun-sunos3*) - tm_file=m68k/sun2.h - use_collect2=yes - extra_headers=math-68881.h - ;; - m68000-sun-sunos4*) - tm_file=m68k/sun2o4.h - use_collect2=yes - extra_headers=math-68881.h - ;; - m68000-att-sysv*) - xm_file="m68k/xm-3b1.h ${xm_file}" - xm_defines=USG - if test x$gas = xyes - then - tm_file=m68k/3b1g.h - else - tm_file=m68k/3b1.h - fi - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-apple-aux*) # Apple Macintosh running A/UX - xm_defines="USG AUX" - tmake_file=m68k/t-aux - install_headers_dir=install-headers-cpio - extra_headers=math-68881.h - extra_parts="crt1.o mcrt1.o maccrt1.o crt2.o crtn.o" - tm_file= - if test "$gnu_ld" = yes - then - tm_file="${tm_file} m68k/auxgld.h" - else - tm_file="${tm_file} m68k/auxld.h" - fi - if test "$gas" = yes - then - tm_file="${tm_file} m68k/auxgas.h" - else - tm_file="${tm_file} m68k/auxas.h" - fi - tm_file="${tm_file} m68k/a-ux.h" - float_format=m68k - ;; - m68k-apollo-*) - tm_file=m68k/apollo68.h - xmake_file=m68k/x-apollo68 - use_collect2=yes - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-altos-sysv*) # Altos 3068 - if test x$gas = xyes - then - tm_file=m68k/altos3068.h - xm_defines=USG - else - echo "The Altos is supported only with the GNU assembler" 1>&2 - exit 1 - fi - extra_headers=math-68881.h - ;; - m68k-bull-sysv*) # Bull DPX/2 - if test x$gas = xyes - then - if test x$stabs = xyes - then - tm_file=m68k/dpx2cdbx.h - else - tm_file=m68k/dpx2g.h - fi - else - tm_file=m68k/dpx2.h - fi - xm_file="xm-alloca.h ${xm_file}" - xm_defines=USG - xmake_file=m68k/x-dpx2 - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-atari-sysv4*) # Atari variant of V.4. - tm_file=m68k/atari.h - xm_file="xm-alloca.h ${xm_file}" - xm_defines="USG FULL_PROTOTYPES" - tmake_file=t-svr4 - extra_parts="crtbegin.o crtend.o" - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-motorola-sysv*) - tm_file=m68k/mot3300.h - xm_file="xm-alloca.h m68k/xm-mot3300.h ${xm_file}" - xm_defines=NO_SYS_SIGLIST - if test x$gas = xyes - then - xmake_file=m68k/x-mot3300-gas - if test x$gnu_ld = xyes - then - tmake_file=m68k/t-mot3300-gald - else - tmake_file=m68k/t-mot3300-gas - use_collect2=yes - fi - else - xmake_file=m68k/x-mot3300 - if test x$gnu_ld = xyes - then - tmake_file=m68k/t-mot3300-gld - else - tmake_file=m68k/t-mot3300 - use_collect2=yes - fi - fi - gdb_needs_out_file_path=yes - extra_parts="crt0.o mcrt0.o" - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-ncr-sysv*) # NCR Tower 32 SVR3 - tm_file=m68k/tower-as.h - xm_defines="USG SVR3" - xmake_file=m68k/x-tower - extra_parts="crtbegin.o crtend.o" - extra_headers=math-68881.h - ;; - m68k-plexus-sysv*) - tm_file=m68k/plexus.h - xm_file="xm-alloca.h m68k/xm-plexus.h ${xm_file}" - xm_defines=USG - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-tti-*) - tm_file=m68k/pbb.h - xm_file="xm-alloca.h ${xm_file}" - xm_defines=USG - extra_headers=math-68881.h - ;; - m68k-crds-unos*) - xm_file="xm-alloca.h m68k/xm-crds.h ${xm_file}" - xm_defines="USG unos" - xmake_file=m68k/x-crds - tm_file=m68k/crds.h - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-cbm-sysv4*) # Commodore variant of V.4. - tm_file=m68k/amix.h - xm_file="xm-alloca.h ${xm_file}" - xm_defines="USG FULL_PROTOTYPES" - xmake_file=m68k/x-amix - tmake_file=t-svr4 - extra_parts="crtbegin.o crtend.o" - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-ccur-rtu) - tm_file=m68k/ccur-GAS.h - xmake_file=m68k/x-ccur - extra_headers=math-68881.h - use_collect2=yes - float_format=m68k - ;; - m68k-hp-bsd4.4*) # HP 9000/3xx running 4.4bsd - tm_file=m68k/hp3bsd44.h - xmake_file=m68k/x-hp3bsd44 - use_collect2=yes - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-hp-bsd*) # HP 9000/3xx running Berkeley Unix - tm_file=m68k/hp3bsd.h - use_collect2=yes - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-isi-bsd*) - if test x$with_fp = xno - then - tm_file=m68k/isi-nfp.h - else - tm_file=m68k/isi.h - float_format=m68k - fi - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-hp-hpux7*) # HP 9000 series 300 running HPUX version 7. - xm_file="xm_alloca.h ${xm_file}" - xm_defines="USG NO_SYS_SIGLIST" - if test x$gas = xyes - then - xmake_file=m68k/x-hp320g - tm_file=m68k/hp320g.h - else - xmake_file=m68k/x-hp320 - tm_file=m68k/hpux7.h - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-hp-hpux*) # HP 9000 series 300 - xm_file="xm_alloca.h ${xm_file}" - xm_defines="USG NO_SYS_SIGLIST" - if test x$gas = xyes - then - xmake_file=m68k/x-hp320g - tm_file=m68k/hp320g.h - else - xmake_file=m68k/x-hp320 - tm_file=m68k/hp320.h - fi - install_headers_dir=install-headers-cpio - use_collect2=yes - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-sun-mach*) - tm_file=m68k/sun3mach.h - use_collect2=yes - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-sony-newsos3*) - if test x$gas = xyes - then - tm_file=m68k/news3gas.h - else - tm_file=m68k/news3.h - fi - use_collect2=yes - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-sony-bsd* | m68k-sony-newsos*) - if test x$gas = xyes - then - tm_file=m68k/newsgas.h - else - tm_file=m68k/news.h - fi - use_collect2=yes - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-next-nextstep2*) - tm_file=m68k/next21.h - xm_file="m68k/xm-next.h ${xm_file}" - tmake_file=m68k/t-next - xmake_file=m68k/x-next - extra_objs=nextstep.o - extra_headers=math-68881.h - use_collect2=yes - float_format=m68k - ;; - m68k-next-nextstep3*) - tm_file=m68k/next.h - xm_file="m68k/xm-next.h ${xm_file}" - tmake_file=m68k/t-next - xmake_file=m68k/x-next - extra_objs=nextstep.o - extra_parts="crtbegin.o crtend.o" - extra_headers=math-68881.h - float_format=m68k - if test x$enable_threads = xyes; then - thread_file='mach' - fi - ;; - m68k-sun-sunos3*) - if test x$with_fp = xno - then - tm_file=m68k/sun3n3.h - else - tm_file=m68k/sun3o3.h - float_format=m68k - fi - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-sun-sunos*) # For SunOS 4 (the default). - if test x$with_fp = xno - then - tm_file=m68k/sun3n.h - else - tm_file=m68k/sun3.h - float_format=m68k - fi - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-wrs-vxworks*) - tm_file=m68k/vxm68k.h - tmake_file=m68k/t-vxworks68 - extra_headers=math-68881.h - thread_file='vxworks' - float_format=m68k - ;; - m68k-*-aout*) - tmake_file=m68k/t-m68kbare - tm_file="m68k/m68k-aout.h libgloss.h" - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-*-coff*) - tmake_file=m68k/t-m68kbare - tm_file="m68k/m68k-coff.h dbx.h libgloss.h" - extra_headers=math-68881.h - float_format=m68k - ;; - m68020-*-elf* | m68k-*-elf*) - tm_file="m68k/m68020-elf.h libgloss.h" - xm_file=m68k/xm-m68kv.h - tmake_file=m68k/t-m68kelf - header_files=math-68881.h - ;; - m68k-*-lynxos*) - if test x$gas = xyes - then - tm_file=m68k/lynx.h - else - tm_file=m68k/lynx-ng.h - fi - xm_file=m68k/xm-lynx.h - xmake_file=x-lynx - tmake_file=m68k/t-lynx - extra_headers=math-68881.h - float_format=m68k - ;; - m68k*-*-netbsd*) - tm_file=m68k/netbsd.h - # On NetBSD, the headers are already okay, except for math.h. - fixincludes=fixinc.wrap - tmake_file=t-netbsd - float_format=m68k - ;; - m68k-*-sysv3*) # Motorola m68k's running system V.3 - xm_file="xm-alloca.h ${xm_file}" - xm_defines=USG - xmake_file=m68k/x-m68kv - extra_parts="crtbegin.o crtend.o" - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-*-sysv4*) # Motorola m68k's running system V.4 - tm_file=m68k/m68kv4.h - xm_file="xm-alloca.h ${xm_file}" - xm_defines=USG - tmake_file=t-svr4 - extra_parts="crtbegin.o crtend.o" - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-*-linux-gnuaout*) # Motorola m68k's running GNU/Linux - # with a.out format - xmake_file=x-linux - tm_file=m68k/linux-aout.h - tmake_file="t-linux-aout m68k/t-linux-aout" - fixincludes=Makefile.in # The headers are ok already. - extra_headers=math-68881.h - float_format=m68k - gnu_ld=yes - ;; - m68k-*-linux-gnulibc1) # Motorola m68k's running GNU/Linux - # with ELF format using the - # GNU/Linux C library 5 - xmake_file=x-linux - tm_file=m68k/linux.h - tmake_file="t-linux t-linux-gnulibc1 m68k/t-linux" - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - fixincludes=Makefile.in # The headers are ok already. - extra_headers=math-68881.h - float_format=m68k - gnu_ld=yes - ;; - m68k-*-linux-gnu*) # Motorola m68k's running GNU/Linux - # with ELF format using glibc 2 - # aka the GNU/Linux C library 6. - xmake_file=x-linux - tm_file=m68k/linux.h - tmake_file="t-linux m68k/t-linux" - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - fixincludes=Makefile.in # The headers are ok already. - extra_headers=math-68881.h - float_format=m68k - gnu_ld=yes - if test x$enable_threads = xyes; then - thread_file='posix' - fi - ;; - m68k-*-psos*) - tmake_file=m68k/t-m68kbare - tm_file=m68k/m68k-psos.h - extra_headers=math-68881.h - float_format=m68k - ;; - m68k-*-rtems*) - tmake_file="m68k/t-m68kbare t-rtems" - tm_file=m68k/rtems.h - extra_headers=math-68881.h - float_format=m68k - ;; - - m88k-dg-dgux*) - case $machine in - m88k-dg-dguxbcs*) - tm_file=m88k/dguxbcs.h - tmake_file=m88k/t-dguxbcs - ;; - *) - tm_file=m88k/dgux.h - tmake_file=m88k/t-dgux - ;; - esac - extra_parts="crtbegin.o bcscrtbegin.o crtend.o m88kdgux.ld" - xmake_file=m88k/x-dgux - if test x$gas = xyes - then - tmake_file=m88k/t-dgux-gas - fi - fixincludes=fixinc.dgux - ;; - m88k-dolphin-sysv3*) - tm_file=m88k/dolph.h - extra_parts="crtbegin.o crtend.o" - xm_file="m88k/xm-sysv3.h ${xm_file}" - xmake_file=m88k/x-dolph - if test x$gas = xyes - then - tmake_file=m88k/t-m88k-gas - fi - ;; - m88k-tektronix-sysv3) - tm_file=m88k/tekXD88.h - extra_parts="crtbegin.o crtend.o" - xm_file="m88k/xm-sysv3.h ${xm_file}" - xmake_file=m88k/x-tekXD88 - if test x$gas = xyes - then - tmake_file=m88k/t-m88k-gas - fi - ;; - m88k-*-aout*) - tm_file=m88k/m88k-aout.h - ;; - m88k-*-coff*) - tm_file=m88k/m88k-coff.h - tmake_file=m88k/t-bug - ;; - m88k-*-luna*) - tm_file=m88k/luna.h - extra_parts="crtbegin.o crtend.o" - if test x$gas = xyes - then - tmake_file=m88k/t-luna-gas - else - tmake_file=m88k/t-luna - fi - ;; - m88k-*-sysv3*) - tm_file=m88k/sysv3.h - extra_parts="crtbegin.o crtend.o" - xm_file="m88k/xm-sysv3.h ${xm_file}" - xmake_file=m88k/x-sysv3 - if test x$gas = xyes - then - tmake_file=m88k/t-m88k-gas - fi - ;; - m88k-*-sysv4*) - tm_file=m88k/sysv4.h - extra_parts="crtbegin.o crtend.o" - xmake_file=m88k/x-sysv4 - tmake_file=m88k/t-sysv4 - ;; - mips-lsi-elf*) # CYGNUS LOCAL angela - tm_file="mips/elf.h" - tmake_file=mips/t-lsi - ;; - mips-sgi-irix6*) # SGI System V.4., IRIX 6 - tm_file=mips/iris6.h - xm_file=mips/xm-iris6.h - fixincludes=fixinc.irix - xmake_file=mips/x-iris6 - tmake_file=mips/t-iris6 -# if test x$enable_threads = xyes; then -# thread_file='irix' -# fi - ;; - mips-wrs-vxworks) - tm_file="mips/elf.h libgloss.h mips/vxworks.h" - tmake_file=mips/t-ecoff - gas=yes - gnu_ld=yes - extra_parts="crtbegin.o crtend.o" -# thread_file='vxworks' - ;; - mips-sgi-irix5cross64) # Irix5 host, Irix 6 target, cross64 - tm_file="mips/iris6.h mips/cross64.h" - xm_defines=USG - xm_file="mips/xm-iris5.h" - fixincludes=Makefile.in - xmake_file=mips/x-iris - tmake_file=mips/t-cross64 - # See comment in mips/iris[56].h files. - use_collect2=yes -# if test x$enable_threads = xyes; then -# thread_file='irix' -# fi - ;; - mips-sni-sysv4) - if test x$gas = xyes - then - if test x$stabs = xyes - then - tm_file=mips/iris5gdb.h - else - tm_file="mips/sni-svr4.h mips/sni-gas.h" - fi - else - tm_file=mips/sni-svr4.h - fi - xm_defines=USG - xmake_file=mips/x-sni-svr4 - tmake_file=mips/t-mips-gas - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; - mips-sgi-irix5*) # SGI System V.4., IRIX 5 - if test x$gas = xyes - then - tm_file="mips/iris5.h mips/iris5gas.h" - if test x$stabs = xyes - then - tm_file="${tm_file} dbx.h" - fi - else - tm_file=mips/iris5.h - fi - xm_defines=USG - xm_file="mips/xm-iris5.h" - fixincludes=fixinc.irix - xmake_file=mips/x-iris - # mips-tfile doesn't work yet - tmake_file=mips/t-mips-gas - # See comment in mips/iris5.h file. - use_collect2=yes -# if test x$enable_threads = xyes; then -# thread_file='irix' -# fi - ;; - mips-sgi-irix4loser*) # Mostly like a MIPS. - tm_file="mips/iris4loser.h mips/iris3.h ${tm_file} mips/iris4.h" - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - xm_defines=USG - xmake_file=mips/x-iris - if test x$gas = xyes - then - tmake_file=mips/t-mips-gas - else - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi -# if test x$enable_threads = xyes; then -# thread_file='irix' -# fi - ;; - mips-sgi-irix4*) # Mostly like a MIPS. - tm_file="mips/iris3.h ${tm_file} mips/iris4.h" - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - xm_defines=USG - xmake_file=mips/x-iris - if test x$gas = xyes - then - tmake_file=mips/t-mips-gas - else - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi -# if test x$enable_threads = xyes; then -# thread_file='irix' -# fi - ;; - mips-sgi-*) # Mostly like a MIPS. - tm_file="mips/iris3.h ${tm_file}" - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - xm_defines=USG - xmake_file=mips/x-iris3 - if test x$gas = xyes - then - tmake_file=mips/t-mips-gas - else - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; - mips-dec-osfrose*) # Decstation running OSF/1 reference port with OSF/rose. - tm_file="mips/osfrose.h ${tm_file}" - xmake_file=mips/x-osfrose - tmake_file=mips/t-osfrose - extra_objs=halfpic.o - use_collect2=yes - ;; - mips-dec-osf*) # Decstation running OSF/1 as shipped by DIGITAL - tm_file=mips/dec-osf1.h - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - xmake_file=mips/x-dec-osf1 - if test x$gas = xyes - then - tmake_file=mips/t-mips-gas - else - tmake_file=mips/t-ultrix - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; - mips-dec-bsd*) # Decstation running 4.4 BSD - tm_file=mips/dec-bsd.h - fixincludes= - if test x$gas = xyes - then - tmake_file=mips/t-mips-gas - else - tmake_file=mips/t-ultrix - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; - mipsel-*-netbsd* | mips-dec-netbsd*) # Decstation running NetBSD - tm_file=mips/netbsd.h - # On NetBSD, the headers are already okay, except for math.h. - fixincludes=fixinc.wrap - tmake_file=t-netbsd - ;; - mips*-*-linux*) # Linux MIPS, either endian. - xmake_file=x-linux - xm_file="xm-siglist.h ${xm_file}" - case $machine in - mipsel-*) tm_file="mips/elfl.h mips/linux.h" ;; - *) tm_file="mips/elf.h mips/linux.h" ;; - esac - extra_parts="crtbegin.o crtend.o" - gnu_ld=yes - gas=yes - fixincludes=Makefile.in - ;; - mips-sony-bsd* | mips-sony-newsos*) # Sony NEWS 3600 or risc/news. - tm_file="mips/news4.h ${tm_file}" - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - if test x$gas = xyes - then - tmake_file=mips/t-mips-gas - else - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - xmake_file=mips/x-sony - ;; - mips-sony-sysv*) # Sony NEWS 3800 with NEWSOS5.0. - # That is based on svr4. - # t-svr4 is not right because this system doesn't use ELF. - tm_file="mips/news5.h ${tm_file}" - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - xm_file="xm-siglist.h ${xm_file}" - xm_defines=USG - if test x$gas = xyes - then - tmake_file=mips/t-mips-gas - else - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; - mips-tandem-sysv4*) # Tandem S2 running NonStop UX - tm_file="mips/svr4-5.h mips/svr4-t.h" - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - xm_file="xm-siglist.h ${xm_file}" - xm_defines=USG - xmake_file=mips/x-sysv - if test x$gas = xyes - then - tmake_file=mips/t-mips-gas - extra_parts="crtbegin.o crtend.o" - else - tmake_file=mips/t-mips - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; - mips-*-ultrix* | mips-dec-mach3) # Decstation. - tm_file="mips/ultrix.h ${tm_file}" - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - xmake_file=mips/x-ultrix - if test x$gas = xyes - then - tmake_file=mips/t-mips-gas - else - tmake_file=mips/t-ultrix - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; -changequote(,)dnl - mips-*-riscos[56789]bsd*) -changequote([,])dnl - tm_file=mips/bsd-5.h # MIPS BSD 4.3, RISC-OS 5.0 - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - if test x$gas = xyes - then - tmake_file=mips/t-bsd-gas - else - tmake_file=mips/t-bsd - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; -changequote(,)dnl - mips-*-bsd* | mips-*-riscosbsd* | mips-*-riscos[1234]bsd*) -changequote([,])dnl - tm_file="mips/bsd-4.h ${tm_file}" # MIPS BSD 4.3, RISC-OS 4.0 - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - if test x$gas = xyes - then - tmake_file=mips/t-bsd-gas - else - tmake_file=mips/t-bsd - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; -changequote(,)dnl - mips-*-riscos[56789]sysv4*) -changequote([,])dnl - tm_file=mips/svr4-5.h # MIPS System V.4., RISC-OS 5.0 - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - xm_file="xm-siglist.h ${xm_file}" - xmake_file=mips/x-sysv - if test x$gas = xyes - then - tmake_file=mips/t-svr4-gas - else - tmake_file=mips/t-svr4 - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; -changequote(,)dnl - mips-*-sysv4* | mips-*-riscos[1234]sysv4* | mips-*-riscossysv4*) -changequote([,])dnl - tm_file="mips/svr4-4.h ${tm_file}" - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - xm_defines=USG - xmake_file=mips/x-sysv - if test x$gas = xyes - then - tmake_file=mips/t-svr4-gas - else - tmake_file=mips/t-svr4 - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; -changequote(,)dnl - mips-*-riscos[56789]sysv*) -changequote([,])dnl - tm_file=mips/svr3-5.h # MIPS System V.3, RISC-OS 5.0 - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - xm_defines=USG - xmake_file=mips/x-sysv - if test x$gas = xyes - then - tmake_file=mips/t-svr3-gas - else - tmake_file=mips/t-svr3 - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; - mips-*-sysv* | mips-*-riscos*sysv*) - tm_file="mips/svr3-4.h ${tm_file}" - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - xm_defines=USG - xmake_file=mips/x-sysv - if test x$gas = xyes - then - tmake_file=mips/t-svr3-gas - else - tmake_file=mips/t-svr3 - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; -changequote(,)dnl - mips-*-riscos[56789]*) # Default MIPS RISC-OS 5.0. -changequote([,])dnl - tm_file=mips/mips-5.h - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - if test x$gas = xyes - then - tmake_file=mips/t-mips-gas - else - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; - mips-*-gnu*) - ;; - mipsel-*-ecoff*) - tm_file=mips/ecoffl.h - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - tmake_file=mips/t-ecoff - ;; - mips-*-ecoff*) - tm_file="gofast.h mips/ecoff.h" - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - tmake_file=mips/t-ecoff - ;; - mipsel-*-elf*) - tm_file="mips/elfl.h libgloss.h" - tmake_file=mips/t-elf - ;; - mips-*-elf*) - tm_file="mips/elf.h" - tmake_file=mips/t-elf - ;; - mips64el-*-elf*) - tm_file="mips/elfl64.h" - tmake_file=mips/t-elf - ;; - mips64orionel-*-elf*) - tm_file="mips/elforion.h mips/elfl64.h libgloss.h" - tmake_file=mips/t-elf - ;; - mips64-*-elf*) - tm_file="mips/elf64.h" - tmake_file=mips/t-elf - ;; - mips64orion-*-elf*) - tm_file="mips/elforion.h mips/elf64.h libgloss.h" - tmake_file=mips/t-elf - ;; - mips64orion-*-rtems*) - tm_file="mips/elforion.h mips/elf64.h mips/rtems64.h" - tmake_file="mips/t-ecoff t-rtems" - ;; - mipstx39el-*-elf*) - tm_file="mips/r3900.h mips/elfl.h mips/abi64.h" - tmake_file=mips/t-r3900 - ;; - mipstx39-*-elf*) - tm_file="mips/r3900.h mips/elf.h mips/abi64.h" - tmake_file=mips/t-r3900 - ;; - mips-*-*) # Default MIPS RISC-OS 4.0. - if test x$stabs = xyes; then - tm_file="${tm_file} dbx.h" - fi - if test x$gas = xyes - then - tmake_file=mips/t-mips-gas - else - extra_passes="mips-tfile mips-tdump" - fi - if test x$gnu_ld != xyes - then - use_collect2=yes - fi - ;; - mn10200-*-*) - cpu_type=mn10200 - tm_file="mn10200/mn10200.h" - if test x$stabs = xyes - then - tm_file="${tm_file} dbx.h" - fi - use_collect2=no - ;; - mn10300-*-*) - cpu_type=mn10300 - tm_file="mn10300/mn10300.h" - if test x$stabs = xyes - then - tm_file="${tm_file} dbx.h" - fi - use_collect2=no - ;; - ns32k-encore-bsd*) - tm_file=ns32k/encore.h - use_collect2=yes - ;; - ns32k-sequent-bsd*) - tm_file=ns32k/sequent.h - use_collect2=yes - ;; - ns32k-tek6100-bsd*) - tm_file=ns32k/tek6100.h - use_collect2=yes - ;; - ns32k-tek6200-bsd*) - tm_file=ns32k/tek6200.h - use_collect2=yes - ;; -# This has not been updated to GCC 2. -# ns32k-ns-genix*) -# xm_defines=USG -# xmake_file=ns32k/x-genix -# tm_file=ns32k/genix.h -# use_collect2=yes -# ;; - ns32k-merlin-*) - tm_file=ns32k/merlin.h - use_collect2=yes - ;; - ns32k-pc532-mach*) - tm_file=ns32k/pc532-mach.h - use_collect2=yes - ;; - ns32k-pc532-minix*) - tm_file=ns32k/pc532-min.h - xm_file="ns32k/xm-pc532-min.h ${xm-file}" - xm_defines=USG - use_collect2=yes - ;; - ns32k-*-netbsd*) - tm_file=ns32k/netbsd.h - xm_file="ns32k/xm-netbsd.h ${xm_file}" - # On NetBSD, the headers are already okay, except for math.h. - fixincludes=fixinc.wrap - tmake_file=t-netbsd - ;; - pdp11-*-bsd) - tm_file="${tm_file} pdp11/2bsd.h" - ;; - pdp11-*-*) - ;; - pyramid-*-*) - cpu_type=pyr - xmake_file=pyr/x-pyr - use_collect2=yes - ;; - romp-*-aos*) - use_collect2=yes - ;; - romp-*-mach*) - xmake_file=romp/x-mach - use_collect2=yes - ;; - powerpc-*-beos*) - cpu_type=rs6000 - tm_file=rs6000/beos.h - xm_file=rs6000/xm-beos.h - tmake_file=rs6000/t-beos - xmake_file=rs6000/x-beos - ;; - powerpc-*-sysv* | powerpc-*-elf*) - tm_file=rs6000/sysv4.h - xm_file="xm-siglist.h rs6000/xm-sysv4.h" - xm_defines="USG POSIX" - extra_headers=ppc-asm.h - if test x$gas = xyes - then - tmake_file="rs6000/t-ppcos rs6000/t-ppccomm" - else - tmake_file="rs6000/t-ppc rs6000/t-ppccomm" - fi - xmake_file=rs6000/x-sysv4 - ;; - powerpc-*-eabiaix*) - tm_file=rs6000/eabiaix.h - tmake_file="rs6000/t-ppcgas rs6000/t-ppccomm" - fixincludes=Makefile.in - extra_headers=ppc-asm.h - ;; - powerpc-*-eabisim*) - tm_file=rs6000/eabisim.h - tmake_file="rs6000/t-ppcgas rs6000/t-ppccomm" - fixincludes=Makefile.in - extra_headers=ppc-asm.h - ;; - powerpc-*-eabi*) - tm_file=rs6000/eabi.h - if test x$gas = xyes - then - tmake_file="rs6000/t-ppcgas rs6000/t-ppccomm" - else - tmake_file="rs6000/t-ppc rs6000/t-ppccomm" - fi - fixincludes=Makefile.in - extra_headers=ppc-asm.h - ;; - powerpc-*-rtems*) - tm_file=rs6000/rtems.h - if test x$gas = xyes - then - tmake_file="rs6000/t-ppcgas t-rtems rs6000/t-ppccomm" - else - tmake_file="rs6000/t-ppc t-rtems rs6000/t-ppccomm" - fi - fixincludes=Makefile.in - extra_headers=ppc-asm.h - ;; - powerpc-*-linux-gnulibc1) - tm_file=rs6000/linux.h - xm_file=rs6000/xm-sysv4.h - out_file=rs6000/rs6000.c - if test x$gas = xyes - then - tmake_file="rs6000/t-ppcos t-linux t-linux-gnulibc1 rs6000/t-ppccomm" - else - tmake_file="rs6000/t-ppc t-linux t-linux-gnulibc1 rs6000/t-ppccomm" - fi - xmake_file=x-linux - fixincludes=Makefile.in - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - extra_headers=ppc-asm.h - if test x$enable_threads = xyes; then - thread_file='posix' - fi - ;; - powerpc-*-linux-gnu*) - tm_file=rs6000/linux.h - xm_file="xm-siglist.h rs6000/xm-sysv4.h" - xm_defines="USG ${xm_defines}" - out_file=rs6000/rs6000.c - if test x$gas = xyes - then - tmake_file="rs6000/t-ppcos t-linux rs6000/t-ppccomm" - else - tmake_file="rs6000/t-ppc t-linux rs6000/t-ppccomm" - fi - xmake_file=x-linux - fixincludes=Makefile.in - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - extra_headers=ppc-asm.h - if test x$enable_threads = xyes; then - thread_file='posix' - fi - ;; - powerpc-wrs-vxworks*) - cpu_type=rs6000 - xm_file="xm-siglist.h rs6000/xm-sysv4.h" - xm_defines="USG POSIX" - tm_file=rs6000/vxppc.h - tmake_file="rs6000/t-ppcgas rs6000/t-ppccomm" - extra_headers=ppc-asm.h - thread_file='vxworks' - ;; - powerpcle-*-sysv* | powerpcle-*-elf*) - tm_file=rs6000/sysv4le.h - xm_file="xm-siglist.h rs6000/xm-sysv4.h" - xm_defines="USG POSIX" - if test x$gas = xyes - then - tmake_file="rs6000/t-ppcos rs6000/t-ppccomm" - else - tmake_file="rs6000/t-ppc rs6000/t-ppccomm" - fi - xmake_file=rs6000/x-sysv4 - extra_headers=ppc-asm.h - ;; - powerpcle-*-eabisim*) - tm_file=rs6000/eabilesim.h - tmake_file="rs6000/t-ppcgas rs6000/t-ppccomm" - fixincludes=Makefile.in - extra_headers=ppc-asm.h - ;; - powerpcle-*-eabi*) - tm_file=rs6000/eabile.h - if test x$gas = xyes - then - tmake_file="rs6000/t-ppcgas rs6000/t-ppccomm" - else - tmake_file="rs6000/t-ppc rs6000/t-ppccomm" - fi - fixincludes=Makefile.in - extra_headers=ppc-asm.h - ;; - powerpcle-*-winnt* ) - tm_file=rs6000/win-nt.h - tmake_file=rs6000/t-winnt -# extra_objs=pe.o - fixincludes=Makefile.in - if test x$enable_threads = xyes; then - thread_file='win32' - fi - extra_headers=ppc-asm.h - ;; - powerpcle-*-pe | powerpcle-*-cygwin*) - tm_file=rs6000/cygwin.h - xm_file="rs6000/xm-cygwin.h ${xm_file}" - tmake_file=rs6000/t-winnt - xmake_file=rs6000/x-cygwin -# extra_objs=pe.o - fixincludes=Makefile.in - if test x$enable_threads = xyes; then - thread_file='win32' - fi - exeext=.exe - extra_headers=ppc-asm.h - ;; - powerpcle-*-solaris2*) - tm_file=rs6000/sol2.h - xm_file="xm-siglist.h rs6000/xm-sysv4.h" - xm_defines="USG POSIX" - if test x$gas = xyes - then - tmake_file="rs6000/t-ppcos rs6000/t-ppccomm" - else - tmake_file="rs6000/t-ppc rs6000/t-ppccomm" - fi - xmake_file=rs6000/x-sysv4 - case $machine in -changequote(,)dnl - *-*-solaris2.[0-4]) -changequote([,])dnl - fixincludes=fixinc.svr4;; - *) - fixincludes=fixinc.wrap;; - esac - extra_headers=ppc-asm.h - ;; -changequote(,)dnl - rs6000-ibm-aix3.[01]*) -changequote([,])dnl - tm_file=rs6000/aix31.h - xmake_file=rs6000/x-aix31 - use_collect2=yes - ;; -changequote(,)dnl - rs6000-ibm-aix3.2.[456789]* | powerpc-ibm-aix3.2.[456789]*) -changequote([,])dnl - tm_file=rs6000/aix3newas.h - if test x$host != x$target - then - tmake_file=rs6000/t-xnewas - else - tmake_file=rs6000/t-newas - fi - use_collect2=yes - ;; -changequote(,)dnl - rs6000-ibm-aix4.[12]* | powerpc-ibm-aix4.[12]*) -changequote([,])dnl - tm_file=rs6000/aix41.h - if test x$host != x$target - then - tmake_file=rs6000/t-xnewas - else - tmake_file=rs6000/t-newas - fi - xmake_file=rs6000/x-aix41 - use_collect2=yes - ;; -changequote(,)dnl - rs6000-ibm-aix4.[3456789].* | powerpc-ibm-aix4.[3456789].*) -changequote([,])dnl - tm_file=rs6000/aix43.h - if test x$host != x$target - then - tmake_file=rs6000/t-xaix43 - else - tmake_file=rs6000/t-aix43 - fi - xmake_file=rs6000/x-aix43 - use_collect2=yes - ;; -changequote(,)dnl - rs6000-ibm-aix[56789].* | powerpc-ibm-aix[56789].*) -changequote([,])dnl - tm_file=rs6000/aix43.h - if test x$host != x$target - then - tmake_file=rs6000/t-xaix43 - else - tmake_file=rs6000/t-aix43 - fi - xmake_file=rs6000/x-aix43 - use_collect2=yes - ;; - rs6000-ibm-aix*) - use_collect2=yes - ;; - rs6000-bull-bosx) - use_collect2=yes - ;; - rs6000-*-mach*) - tm_file=rs6000/mach.h - xm_file="${xm_file} rs6000/xm-mach.h" - xmake_file=rs6000/x-mach - use_collect2=yes - ;; - rs6000-*-lynxos*) - tm_file=rs6000/lynx.h - xm_file=rs6000/xm-lynx.h - tmake_file=rs6000/t-rs6000 - xmake_file=rs6000/x-lynx - use_collect2=yes - ;; - sh-*-elf*) - tm_file=sh/elf.h - float_format=sh - ;; - sh-*-rtemself*) - tmake_file="sh/t-sh t-rtems" - tm_file=sh/rtemself.h - float_format=sh - ;; - sh-*-rtems*) - tmake_file="sh/t-sh t-rtems" - tm_file=sh/rtems.h - float_format=sh - ;; - sh-*-*) - float_format=sh - ;; - sparc-tti-*) - tm_file=sparc/pbd.h - xm_file="xm-alloca.h ${xm_file}" - xm_defines=USG - ;; - sparc-wrs-vxworks* | sparclite-wrs-vxworks*) - tm_file=sparc/vxsparc.h - tmake_file=sparc/t-vxsparc - use_collect2=yes - thread_file='vxworks' - ;; - sparc-*-aout*) - tmake_file=sparc/t-sparcbare - tm_file="sparc/aout.h libgloss.h" - ;; - sparc-*-netbsd*) - tm_file=sparc/netbsd.h - # On NetBSD, the headers are already okay, except for math.h. - fixincludes=fixinc.wrap - tmake_file=t-netbsd - ;; - sparc-*-bsd*) - tm_file=sparc/bsd.h - ;; - sparc-*-elf*) - tm_file=sparc/elf.h - tmake_file=sparc/t-elf - extra_parts="crti.o crtn.o crtbegin.o crtend.o" - #float_format=i128 - float_format=i64 - ;; - sparc-*-linux-gnuaout*) # Sparc's running GNU/Linux, a.out - xm_file="${xm_file} sparc/xm-linux.h" - tm_file=sparc/linux-aout.h - xmake_file=x-linux - fixincludes=Makefile.in #On Linux, the headers are ok already. - gnu_ld=yes - ;; - sparc-*-linux-gnulibc1*) # Sparc's running GNU/Linux, libc5 - xm_file="${xm_file} sparc/xm-linux.h" - xmake_file=x-linux - tm_file=sparc/linux.h - tmake_file="t-linux t-linux-gnulibc1" - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - fixincludes=Makefile.in #On Linux, the headers are ok already. - gnu_ld=yes - ;; - sparc-*-linux-gnu*) # Sparc's running GNU/Linux, libc6 - xm_file="${xm_file} sparc/xm-linux.h" - xmake_file=x-linux - tm_file=sparc/linux.h - tmake_file="t-linux" - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - fixincludes=Makefile.in #On Linux, the headers are ok already. - gnu_ld=yes - if test x$enable_threads = xyes; then - thread_file='posix' - fi - ;; - sparc-*-lynxos*) - if test x$gas = xyes - then - tm_file=sparc/lynx.h - else - tm_file=sparc/lynx-ng.h - fi - xm_file=sparc/xm-lynx.h - tmake_file=sparc/t-sunos41 - xmake_file=x-lynx - ;; - sparc-*-rtems*) - tmake_file="sparc/t-sparcbare t-rtems" - tm_file=sparc/rtems.h - ;; - sparcv9-*-solaris2*) - tm_file=sparc/sol2-sld-64.h - xm_file="sparc/xm-sysv4-64.h sparc/xm-sol2.h" - xm_defines="USG POSIX" - tmake_file="sparc/t-sol2 sparc/t-sol2-64" - xmake_file=sparc/x-sysv4 - extra_parts="crt1.o crti.o crtn.o gcrt1.o crtbegin.o crtend.o" - fixincludes=fixinc.wrap - float_format=none - if test x${enable_threads} = x ; then - enable_threads=$have_pthread_h - if test x${enable_threads} = x ; then - enable_threads=$have_thread_h - fi - fi - if test x${enable_threads} = xyes ; then - if test x${have_pthread_h} = xyes ; then - thread_file='posix' - else - thread_file='solaris' - fi - fi - ;; - sparc-*-solaris2*) - if test x$gnu_ld = xyes - then - tm_file=sparc/sol2.h - else - tm_file=sparc/sol2-sld.h - fi - xm_file="xm-siglist.h sparc/xm-sysv4.h sparc/xm-sol2.h" - xm_defines="USG POSIX" - tmake_file=sparc/t-sol2 - xmake_file=sparc/x-sysv4 - extra_parts="crt1.o crti.o crtn.o gcrt1.o gmon.o crtbegin.o crtend.o" - case $machine in -changequote(,)dnl - *-*-solaris2.[0-4]) -changequote([,])dnl - fixincludes=fixinc.svr4 - float_format=i128 - ;; - *) - fixincludes=fixinc.wrap - float_format=none - ;; - esac - if test x${enable_threads} = x; then - enable_threads=$have_pthread_h - if test x${enable_threads} = x; then - enable_threads=$have_thread_h - fi - fi - if test x${enable_threads} = xyes; then - if test x${have_pthread_h} = xyes; then - thread_file='posix' - else - thread_file='solaris' - fi - fi - ;; - sparc-*-sunos4.0*) - tm_file=sparc/sunos4.h - tmake_file=sparc/t-sunos40 - use_collect2=yes - ;; - sparc-*-sunos4*) - tm_file=sparc/sunos4.h - tmake_file=sparc/t-sunos41 - use_collect2=yes - if test x$gas = xyes; then - tm_file="${tm_file} sparc/sun4gas.h" - fi - ;; - sparc-*-sunos3*) - tm_file=sparc/sun4o3.h - use_collect2=yes - ;; - sparc-*-sysv4*) - tm_file=sparc/sysv4.h - xm_file="xm-siglist.h sparc/xm-sysv4.h" - xm_defines="USG POSIX" - tmake_file=t-svr4 - xmake_file=sparc/x-sysv4 - extra_parts="crtbegin.o crtend.o" - ;; - sparc-*-vxsim*) - xm_file="xm-siglist.h sparc/xm-sysv4.h sparc/xm-sol2.h" - xm_defines="USG POSIX" - tm_file=sparc/vxsim.h - tmake_file=sparc/t-vxsparc - xmake_file=sparc/x-sysv4 - ;; - sparclet-*-aout*) - tm_file="sparc/splet.h libgloss.h" - tmake_file=sparc/t-splet - ;; - sparclite-*-coff*) - tm_file="sparc/litecoff.h libgloss.h" - tmake_file=sparc/t-sparclite - ;; - sparclite-*-aout*) - tm_file="sparc/lite.h aoutos.h" - tmake_file=sparc/t-sparclite - use_collect2=yes - ;; - sparclite-*-elf*) - tm_file="sparc/liteelf.h" - tmake_file=sparc/t-sparclite - extra_parts="crtbegin.o crtend.o" - ;; - sparc86x-*-aout*) - tm_file="sparc/sp86x-aout.h aoutos.h libgloss.h" - tmake_file=sparc/t-sp86x - use_collect2=yes - ;; - sparc86x-*-elf*) - tm_file="sparc/sp86x-elf.h libgloss.h" - tmake_file=sparc/t-sp86x - extra_parts="crtbegin.o crtend.o" - ;; - sparc64-*-aout*) - tmake_file=sparc/t-sp64 - tm_file=sparc/sp64-aout.h - ;; - sparc64-*-elf*) - tmake_file=sparc/t-sp64 - tm_file=sparc/sp64-elf.h - extra_parts="crtbegin.o crtend.o" - ;; - sparc64-*-linux*) # 64-bit Sparc's running GNU/Linux - tmake_file="t-linux sparc/t-linux64" - xm_file="sparc/xm-sp64.h sparc/xm-linux.h" - tm_file=sparc/linux64.h - xmake_file=x-linux - fixincludes=Makefile.in # The headers are ok already. - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - gnu_ld=yes - ;; -# This hasn't been upgraded to GCC 2. -# tahoe-harris-*) # Harris tahoe, using COFF. -# tm_file=tahoe/harris.h -# ;; -# tahoe-*-bsd*) # tahoe running BSD -# ;; - thumb-*-coff* | thumbel-*-coff*) - tm_file=arm/tcoff.h - out_file=arm/thumb.c - xm_file=arm/xm-thumb.h - md_file=arm/thumb.md - tmake_file=arm/t-thumb + arm*-*-elf) + tm_file=arm/unknown-elf.h + tmake_file=arm/t-arm-elf ;; - # CYGNUS LOCAL clm/arm-elf - thumb-*-elf* | thumbel-*-elf*) + + thumb-*-elf) tm_file=arm/telf.h out_file=arm/thumb.c xm_file=arm/xm-thumb.h @@ -3229,273 +533,7 @@ changequote([,])dnl tmake_file=arm/t-thumb-elf fixincludes=Makefile.in # There is nothing to fix ;; - thumb*-*-oabi*) - tm_file=arm/telf-oabi.h - out_file=arm/thumb.c - xm_file=arm/xm-thumb.h - md_file=arm/thumb.md - tmake_file=arm/t-thumb-elf - fixincludes=Makefile.in # There is nothing to fix - ;; - # END CYGNUS LOCAL -# This hasn't been upgraded to GCC 2. -# tron-*-*) -# cpu_type=gmicro -# use_collect2=yes -# ;; - v850-*-*) - cpu_type=v850 - tm_file="v850/v850.h" - xm_file="v850/xm-v850.h" - tmake_file=v850/t-v850 - if test x$stabs = xyes - then - tm_file="${tm_file} dbx.h" - fi - use_collect2=no - ;; - # CYGNUS LOCAL v850e/nick - v850e-*-*) - cpu_type=v850 - tm_file="v850/v850e.h" - xm_file="v850/xm-v850.h" - tmake_file=v850/t-v850 - if [[ x$stabs = xyes ]] - then - tm_file="${tm_file} dbx.h" - fi - use_collect2=no - ;; - v850ea-*-*) - cpu_type=v850 - tm_file="v850/v850ea.h" - xm_file="v850/xm-v850.h" - tmake_file=v850/t-v850 - if [[ x$stabs = xyes ]] - then - tm_file="${tm_file} dbx.h" - fi - use_collect2=no - ;; - # end CYGNUS LOCAL - vax-*-bsd*) # vaxen running BSD - use_collect2=yes - float_format=vax - ;; - vax-*-sysv*) # vaxen running system V - tm_file="${tm_file} vax/vaxv.h" - xm_defines=USG - float_format=vax - ;; - vax-*-netbsd*) - tm_file="${tm_file} netbsd.h vax/netbsd.h" - # On NetBSD, the headers are already okay, except for math.h. - fixincludes=fixinc.wrap - tmake_file=t-netbsd - float_format=vax - ;; - vax-*-ultrix*) # vaxen running ultrix - tm_file="${tm_file} vax/ultrix.h" - use_collect2=yes - float_format=vax - ;; - vax-*-vms*) # vaxen running VMS - xm_file=vax/xm-vms.h - tm_file=vax/vms.h - float_format=vax - ;; - vax-*-*) # vax default entry - float_format=vax - ;; - we32k-att-sysv*) - xm_file="${xm_file} xm-svr3" - use_collect2=yes - ;; - # CYGNUS LOCAL ports - arm-*-pe*) - tm_file=arm/pe.h - tmake_file=arm/t-pe - extra_objs=pe.o - ;; - d10v-*-*) - float_format=d10v - ;; - d30v-*-*) - float_format=i64 - ;; - fr30-*-elf) - tm_file="fr30/fr30.h" - tmake_file=fr30/t-fr30 - extra_parts="crti.o crtn.o crtbegin.o crtend.o" - ;; - i[[34567]]86-*-elf*) - xm_file="${xm_file} xm-svr4.h i386/xm-sysv4.h" - tm_file=i386/i386elf.h - tmake_file=i386/t-i386elf - xmake_file=x-svr4 - ;; - i[[34567]]86-*-netware) # Intel 80386's running netware - # CYGNUS LOCAL - tm_file=i386/netware.h - tmake_file=i386/t-netware - fixincludes=Makefile.in - ;; - i[[34567]]86-*-unixware) - xm_file="xm-siglist.h xm-alloca.h ${xm_file}" - xm_defines="USG POSIX SMALL_ARG_MAX" - tm_file=i386/sysv4.h - if [[ x$stabs = xyes ]] - then - tm_file="${tm_file} dbx.h" - fi - tmake_file=i386/t-crtpic - xmake_file=x-svr4 - extra_parts="crtbegin.o crtend.o" - ;; - i960-intel-nindy) - tmake_file=i960/t-vxworks960 - use_collect2=yes - ;; - m68000-ncr-sysv*) - tm_file=m68k/tower-as.h - xm_file=m68k/xm-tower.h - xmake_file=m68k/x-tower - tmake_file=m68k/t-svr3 - extra_headers=math-68881.h - ;; - m68k-ericsson-OSE |\ - m68k-ericsson-ose) - tm_file=m68k/ose68k.h - tmake_file=m68k/t-ose68 - extra_headers=math-68881.h - ;; - m680[[01234]]0-wrs-vxworks*) - tm_file=m68k/vxm68k.h - tmake_file=m68k/t-vxworks68 - extra_headers=math-68881.h - ;; - m680[[0234]]0-*-aout* |\ - m683[[03]]2-*-aout*) - tmake_file=m68k/t-m68kbare - tm_file="m68k/m68k-aout.h libgloss.h" - extra_headers=math-68881.h - ;; - m680[[0234]]0-*-coff* |\ - m683[[03]]2-*-coff*) - tmake_file=m68k/t-m68kbare - tm_file="m68k/m68k-coff.h dbx.h libgloss.h" - extra_headers=math-68881.h - ;; - m68360-*-coff*) - tmake_file=m68k/t-m68kbare - tm_file="m68k/m68360-coff.h dbx.h libgloss.h" - extra_headers=math-68881.h - ;; - m68000-*-os68k*) - tm_file=m68k/os68000.h - extra_headers=math-68881.h - ;; - m68k-*-os68k*) - tm_file=m68k/os68000.h - extra_headers=math-68881.h - ;; - # This is a host port only, and won't work as a target. - mips*-nec-sysv4*) # MIPS NEC SVR4 - tm_file=mips/svr4-t.h - if [[ x$stabs = xyes ]]; then - tm_file="${tm_file} dbx.h" - fi - xm_file="xm-siglist.h ${xm_file}" - xm_defines=USG - if [[ x$gas = xyes ]] - then - tmake_file=mips/t-mips-gas - extra_parts="crtbegin.o crtend.o" - else - tmake_file=mips/t-mips - extra_passes="mips-tfile mips-tdump" - fi - if [[ x$gnu_ld != xyes ]] - then - use_collect2=yes - fi - ;; - mips*-*-lnews*) - tm_file=mips/ecoffl.h - if [[ x$stabs = xyes ]]; then - tm_file="${tm_file} dbx.h" - fi - tmake_file=mips/t-ecoff - ;; - mips64vr4300-*-elf*) - tm_file="mips/elfb4300.h" - tmake_file=mips/t-vr4300 - ;; - mips64vr4300el-*-elf*) - tm_file="mips/elfl4300.h libgloss.h" - tmake_file=mips/t-vr4300 - ;; - mips64vr4100-*-elf*) - tm_file="mips/elfb4100.h mips/abi64.h" - tmake_file=mips/t-vr4100 - ;; - mips64vr4100el-*-elf*) - tm_file="mips/elfl4100.h mips/abi64.h libgloss.h" - tmake_file=mips/t-vr4100 - ;; - mips64vr5000-*-elf*) - tm_file="mips/elfb5000.h" - tmake_file=mips/t-vr5000 - # Use haifa by default. - if [[ x$enable_haifa != xno ]]; then - enable_haifa=yes - fi - ;; - mips64vr5000el-*-elf*) - tm_file="mips/elfl5000.h libgloss.h" - tmake_file=mips/t-vr5000 - # Use haifa by default. - if [[ x$enable_haifa != xno ]]; then - enable_haifa=yes - fi - ;; - sparclite-*-elf*) - tm_file="sparc/liteelf.h libgloss.h" - tmake_file=sparc/t-sparclite - extra_parts="crtbegin.o crtend.o" - ;; - thumb-*-pe) - tm_file=arm/tpe.h - out_file=arm/thumb.c - xm_file=arm/xm-thumb.h - md_file=arm/thumb.md - tmake_file=arm/t-pe-thumb - extra_objs=pe.o - ;; - z8k-*-*) - ;; - # END CYGNUS LOCAL - - # CYGNUS LOCAL raeburn/vr5400 - mips64vr5400-*-elf*) - tm_file="mips/big.h mips/elf5400.h libgloss.h" - tmake_file=mips/t-biendian - # Use haifa by default for the r5400 - if [[ x$enable_haifa != xno ]]; then - enable_haifa=yes - fi - ;; - mips64vr5400el-*-elf*) - tm_file="mips/little.h mips/elf5400.h libgloss.h" - tmake_file=mips/t-biendian - # Use haifa by default for the r5400 - if [[ x$enable_haifa != xno ]]; then - enable_haifa=yes - fi - ;; - # END CYGNUS LOCAL raeburn/vr5400 -# This hasn't been upgraded to GCC 2. *) echo "Configuration $machine not supported" 1>&2 exit 1 @@ -3682,15 +720,6 @@ changequote([,])dnl fi fi - # No need for collect2 if we have the GNU linker. - # Actually, there is now; GNU ld doesn't handle the EH info or - # collecting for shared libraries. - #case x$gnu_ld in - #xyes) - # use_collect2= - # ;; - #esac - # Save data on machine being used to compile GCC in build_xm_file. # Save data on host machine in vars host_xm_file and host_xmake_file. if test x$pass1done = x @@ -4026,22 +1055,6 @@ else done fi -if test x$use_collect2 = xno; then - use_collect2= -fi - -# Add a definition of USE_COLLECT2 if system wants one. -# Also tell toplev.c what to do. -# This substitutes for lots of t-* files. -if test x$use_collect2 = x -then - will_use_collect2= - maybe_use_collect2= -else - will_use_collect2="collect2" - maybe_use_collect2="-DUSE_COLLECT2" -fi - # NEED TO CONVERT # Set MD_DEPS if the real md file is in md.pre-cpp. # Set MD_CPP to the cpp to pass the md file through. Md files use ';' @@ -4068,11 +1081,7 @@ fi # If we have ld in the build tree, make a link to it. if test -f ../ld/Makefile; then -# if test x$use_collect2 = x; then -# rm -f ld; $symbolic_link ../ld/ld-new$host_exeext ld$host_exeext 2>/dev/null -# else - rm -f collect-ld; $symbolic_link ../ld/ld-new$host_exeext collect-ld$host_exeext 2>/dev/null -# fi +# rm -f ld; $symbolic_link ../ld/ld-new$host_exeext ld$host_exeext 2>/dev/null fi # Figure out what assembler alignment features are present. @@ -4536,8 +1545,6 @@ AC_SUBST(build_install_headers_dir) AC_SUBST(build_exeext) AC_SUBST(host_exeext) AC_SUBST(float_h_file) -AC_SUBST(will_use_collect2) -AC_SUBST(maybe_use_collect2) AC_SUBST(cc_set_by_configure) AC_SUBST(stage_prefix_set_by_configure) AC_SUBST(install) diff --git a/gcc/cp/.cvsignore b/gcc/cp/.cvsignore deleted file mode 100755 index c1033b2..0000000 --- a/gcc/cp/.cvsignore +++ /dev/null @@ -1,10 +0,0 @@ -Makefile -parse.c -parse.h -parse.output -stamp-parse -y.tab.c -*.bb -*.bbg -*.da -*.gcov diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog deleted file mode 100755 index 342442f..0000000 --- a/gcc/cp/ChangeLog +++ /dev/null @@ -1,14199 +0,0 @@ -1999-09-07 Jason Merrill - - * search.c (binfo_for_vtable): Use CLASSTYPE_VFIELD_PARENT. - (dfs_bfv_queue_p, dfs_bfv_helper, struct bfv_info): Remove. - -1999-03-03 Jason Merrill - - * class.c, decl2.c, method.c, pt.c: Add 'static' to make SunOS 4 - cc happy. - -1999-02-25 Jason Merrill - - * tree.c: Check ANSI_PROTOTYPES instead of __STDC__. - -1999-02-04 Kriang Lerdsuwanakij - - * pt.c (unify): Call coerce_template_parms with the COMPLAIN flag - turned off. - -1999-02-04 Jason Merrill - - * lex.c (retrofit_lang_decl): Split out... - (build_lang_decl): From here. - * decl.c (pushdecl): Call it for functions generated by the middle - end that don't have DECL_LANG_SPECIFIC. - * cp-tree.h: Declare it. - - * decl2.c: Remove flag_init_priority. Always enable initp stuff. - (start_objects, finish_objects): Only use special - init_priority code if the user specified a priority. - (do_ctors, do_dtors): Use DEFAULT_INIT_PRIORITY for the non-initp - objects. - -1999-02-01 Mark Mitchell - - * pt.c (tsubst, case TYPENAME_TYPE): Check TYPE_BEING_DEFINED - before calling complete_type_or_else. - -1999-01-28 Jason Merrill - - * cp-tree.h (struct tree_binding): Replace scope field with a union. - (BINDING_SCOPE): Adjust. - * decl.c (BINDING_LEVEL): Adjust. - -1999-01-26 Jason Merrill - - * pt.c (instantiate_class_template): Set up the DECL_INITIAL of - member constants. - - * init.c (expand_member_init): Pull out TYPE_MAIN_VARIANT in - a ctor initializer. - - * tree.c (equal_functions): Fix name in prototype. - - * decl.c (push_local_binding): Add FLAGS argument. - (pushdecl, push_overloaded_decl): Pass it. - * decl2.c (do_local_using_decl): Likewise. - * cp-tree.h: Adjust prototype. - * decl.c (poplevel): Fix logic. - - * decl.c (push_local_binding): Also wrap used decls in a TREE_LIST. - (poplevel): Handle that. Fix logic for removing TREE_LISTs. - (cat_namespace_levels): Don't loop forever. - -1999-01-25 Richard Henderson - - * typeck.c (build_reinterpret_cast): Fix typo in duplicated test. - -1999-01-25 Jason Merrill - - * class.c (resolve_address_of_overloaded_function): Mark the - chosen function used. - - * call.c (build_call): Make sure that a function coming in has - been marked used already. - * decl.c (expand_static_init): Call mark_used instead of - assemble_external. - * except.c (call_eh_info, do_pop_exception, expand_end_eh_spec, - alloc_eh_object, expand_throw): Likewise. - * init.c (build_builtin_delete_call): Likewise. - * rtti.c (call_void_fn, get_tinfo_fn, build_dynamic_cast_1, - expand_si_desc, expand_class_desc, expand_ptr_desc, expand_attr_desc, - expand_generic_desc): Likewise. - -1999-01-25 Martin von Löwis - - * tree.c (equal_functions): New function. - (ovl_member): Call it. - -1999-01-24 Jason Merrill - - * cvt.c (cp_convert_to_pointer): Fix conversion of 0 to pmf. - -1999-01-25 Martin von Loewis - - * decl.c (decls_match): Return 1 if old and new are identical. - (push_overloaded_decl): Set OVL_USED when PUSH_USING. - -1999-01-24 Jason Merrill - - * decl.c (start_function): Make member functions one_only on windows. - * decl2.c (import_export_decl): Likewise. - - * decl.c (grokdeclarator): Don't complain about implicit int in - a system header. Change same-name field check to not complain in - a system header instead of within extern "C". - -1999-01-21 Mark Mitchell - - * cp-tree.h (PUSH_GLOBAL): New macro. - (PUSH_LOCAL): Likewise. - (PUSH_USING): Likewise. - (namespace_bindings_p): Declare. - (push_overloaded_decl): Likewise. - * decl.c (push_overloaded_decl): Don't make it static. Check for - illegal declarations after using declarations here. - (namespace_bindings_p): Likewise. - (duplicate_decls): Don't consider declarations from different - namespaces to be the same. - (pushdecl): Use symbolic PUSH_ constants in calls to - push_overloaded_decl. - (push_overloaded_decl_1): Likewise. - * decl2.c (validate_nonmember_using_decl): Tweak `std' handling. - (do_nonmember_using_decl): Check for illegal using declarations - after ordinary declarations here. - (do_local_using_decl): Call pushdecl to insert declarations. - -1999-01-21 Jason Merrill - - * decl.c (grokdeclarator): Fix lang_c -> lang_name_c typo. - -1999-01-21 Mark Mitchell - - * tree.c (build_cplus_array_type_1): Don't call build_array_type - for types involving template parameters. - - * cp-tree.h (PARM_DECL_EXPR): Delete. - (convert_default_arg): Change prototype. - (check_default_argument): Declare. - (search_tree): Likewise. - * call.c (convert_default_arg): Take the function to which the - default argument belongs as a parameter, and do any necessary - instantiation here, instead of ... - (build_over_call): Here. - * decl.c (local_variable_p): New function. - (check_default_argument): Likewise, split out and tidied from ... - (grokparms): Here. - * error.c (dump_expr): Don't set PARM_DECL_EXPR. - * pt.c (tsubst_call_declarator_parms): New function. - (for_each_template_parm): Handle ARRAY_REFs. Do the obvious thing - with CALL_EXPRs, rather than trying to be clever. - (tsubst): Use tsubst_call_declarator_parms. - * tree.c (search_tree): Don't make it static. - * typeck.c (convert_arguments): Use new interface to - convert_default_arg. - -1999-01-20 Mark Mitchell - - * error.c (dump_function_decl): Don't print the argument types for - a function when the verbosity level is negative. - - * call.c (build_over_call): Check format attributes at call-time. - - * pt.c (tsubst_copy): Fix comment. - (unify): Don't allow unification with variable-sized arrays. - - * semantics.c (finish_stmt_expr): When processing a template make - the BIND_EXPR long-lived. - -1999-01-19 Jason Merrill - - * decl2.c (finish_vtable_vardecl): Make vtables comdat here. - (import_export_vtable): Not here. - -1999-01-18 Jason Merrill - - * typeck.c (build_component_ref): Wrap an OVERLOAD around a unique - non-static member function. - -1999-01-18 Nathan Sidwell - - * class.c (instantiate_type): Only diagnose illegal address of member - function if complaining. - - * decl.c (lookup_name_real): Remove duplicate code. - -1999-01-18 Jason Merrill - - * tree.c (copy_template_template_parm): Use permanent_obstack. - -1999-01-18 Kriang Lerdsuwanakij - - * pt.c (unify): Remove restrictions on deduction of argument - of template template parameters. - -1999-01-18 Nathan Sidwell - - * rtti.c (build_dynamic_cast_1): Resolve OFFSET_REF exprs. - - * class.c (resolve_address_of_overloaded_function): Show list of - all candidates, when none of them match. - -1999-01-18 Chip Salzenberg - - * typeck.c (comp_ptr_ttypes_reinterpret): Per ANSI, tighten up - definition of 'casting away const' in reinterpret_cast<>. - -1999-01-18 Graham - - * cvt.c: Add include for decl.h, remove extern for - static_aggregates which is now provided by decl.h. - - * Makefile.in (cvt.o): Add dependency for decl.h and missing - dependencies for convert.h and flags.h. - -1999-01-18 Nathan Sidwell - - * decl2.c (do_dtors): Set current location to that of the - decl, for sensible diagnostics and debugging. - (check_classfn): Issue `incomplete type' error, if - class is not defined. - -1999-01-16 Jason Merrill - - * cp-tree.h: Add prototype for bound_pmf_p. - -1999-01-16 Jason Merrill - Manfred Hollstein - - * decl.c (grokdeclarator): Don't make 'main(){}' an error with only - -Wreturn-type. - -1999-01-16 Nathan Sidwell - - * cp-tree.h (struct lang_type): Added has_mutable flag. - (CLASSTYPE_HAS_MUTABLE): New macro to access it. - (TYPE_HAS_MUTABLE_P): New macro to read it. - (cp_has_mutable_p): Prototype for new function. - * class.c (finish_struct_1): Set has_mutable from members. - * decl.c (cp_finish_decl): Clear decl's TREE_READONLY flag, if - it contains a mutable. - * typeck.c (cp_has_mutable_p): New function. - -1999-01-15 Mark Mitchell - - * pt.c (process_template_parm): Ignore top-level qualifiers on - non-type parameters. - - * decl.c (start_function): Use current_function_parms in the call - to require_complete_type_for_parms, not the probably empty - DECL_ARGUMENTS. - -1999-01-14 Jason Merrill - - * semantics.c (finish_asm_stmt): Don't warn about redundant volatile. - - * decl2.c (import_export_class): MULTIPLE_SYMBOL_SPACES only means - that we don't suppress the other copies. - * lex.c (handle_cp_pragma): Likewise. - -1999-01-13 Mark Mitchell - - * decl.c (grokdeclarator): Undo 1998-12-14 change. - * tree.c (build_cplus_array_type_1): Likewise. - * pt.c (instantiate_class_template): Remove misleading comment. - (tsubst_aggr_type): Substitute if there are template parameters, - regardless of whether or not they use template arguments. - (unify): Likewise, but for unification. - -1999-01-12 Richard Henderson - - * cp-tree.h (flag_permissive): Declare extern. - -1999-01-06 Mark Mitchell - - * cp-tree.h (IDENTIFIER_TYPENAME_P): Use OPERATOR_TYPENAME_FORMAT - here. - (lang_type): Add is_partial_instantiation. Decrease width of - dummy. - (PARTIAL_INSTANTIATION_P): New macro. - (OPERATOR_TYPENAME_P): Remove. - * decl.c (unary_op_p): Use IDENTIFIER_TYPENAME_P, not - OPERATOR_TYPENAME_P. - (grok_op_properties): Likewise. - * friend.c (do_friend): Handle friends that are member functions - correctly. - * lex.c (init_parse): Use OPERATOR_TYPENAME_FORMAT. - * pt.c (instantiate_class_template): Rework for clarity. Avoid - leaving TYPE_BEING_DEFINED set in obscure cases. Don't do - any more partial instantiation than is absolutely necessary for - implicit typename. Set PARTIAL_INSTANTIATION_P. - (tsubst_decl): Use IDENTIFIER_TYPENAME_P. - * semantics.c (begin_class_definition): Handle partial - specializations of a type that was previously partially - instantiated. - -Wed Jan 6 03:18:53 1999 Mark Elbrecht - - * Make-lang.in (g++.o): Depend on prefix.h. - -1999-01-04 Jason Merrill - - * tree.c (bound_pmf_p): New fn. - * typeck.c (build_c_cast): Use it. - - * decl.c (grok_op_properties): Use same_type_p. - -Tue Dec 22 15:09:25 1998 Kaveh R. Ghazi - - * Makefile.in (cvt.o): Depend on toplev.h. - - * cp-tree.h (check_template_shadow, pod_type_p): Add prototypes. - - * cvt.c: Include toplev.h. - - * except.c (get_eh_caught, get_eh_handlers): Hide prototypes and - definitions. - - * init.c (expand_vec_init): Initialize variable `itype'. - - * lex.c (yyerror): Cast the argument passed to a ctype function to - an unsigned char. - - * method.c (build_mangled_C9x_name): Wrap prototype and definition - in "HOST_BITS_PER_WIDE_INT >= 64". - - * typeck.c (build_binary_op): Mark parameter `convert_p' with - ATTRIBUTE_UNUSED. - -1998-12-22 Mark Mitchell - - * cp-tree.h (TYPE_RAISES_EXCEPTIONS): Improve documentation. - * tree.c (build_exception_variant): Don't crash on empty throw - specs. - -1998-12-18 DJ Delorie - - * cvt.c (convert_to_reference): Check for both error_mark_node - and NULL_NODE after call to convert_for_initialization. - -1998-12-17 Jason Merrill - - * error.c (interesting_scope_p): New fn. - (dump_simple_decl): Use it. - (dump_expr, case CONSTRUCTOR): Force a & for a PMF. - (dump_expr, case OFFSET_REF): Print ->* if appropriate. - -1998-12-16 Mark Mitchell - - * class.c (resolve_address_of_overloaded_function): Do conversion - to correct type here, rather than ... - (instantiate_type): Here. - - * cp-tree.h (DECL_TEMPLATE_PARM_P): New macro. - (DECL_TEMPLATE_TEMPLATE_PARM_P): Use it. - (decl_template_parm_p): Remove. - * decl.c (pushdecl): Don't set DECL_CONTEXT for a template - paramter. - * lex.c (do_identifier): Use DECL_TEMPLATE_PARM_P. - * pt.c (push_inline_template_parms_recursive): Set it. - (decl_template_parm_p): Remove. - (check_template_shadow): Use DECL_TEMPLATE_PARM_P. - (process_template_parm): Set it. - -Wed Dec 16 16:33:58 1998 Dave Brolley - - * lang-specs.h (default_compilers): Pass -MD, -MMD and -MG to cc1plus - if configured with cpplib. - -1998-12-15 Mark Mitchell - - * decl.c (poplevel): Make sure ns_binding is initialized. - - * decl.c (finish_function): Undo inadvertant change in previous - patch. - -1998-12-14 Mark Mitchell - - * class.c (pushclass): Tweak handling of class-level bindings. - (resolve_address_of_overloaded_function): Update pointer-to-member - handling. - (instantiate_type): Likewise. - * cvt.c (cp_convert_to_pointer): Likewise. - * decl.c (pop_binding): Take the DECL to pop, not just the name. - Deal with `struct stat' hack. - (binding_level): Add to documentation. - (push_binding): Clear BINDING_TYPE. - (add_binding): New function. - (push_local_binding): Use it. - (push_class_binding): Likewise. - (poplevel): Adjust calls to pop_binding. - (poplevel_class): Likewise. - (pushdecl): Adjust handling of TYPE_DECLs; add bindings for hidden - declarations to current binding level. - (push_class_level_binding): Likewise. - (push_overloaded_decl): Adjust handling of OVERLOADs in local - bindings. - (lookup_namespace_name): Don't crash when confronted with a - TEMPLATE_DECL. - (lookup_name_real): Do `struct stat' hack in local binding - contexts. - (build_ptrmemfunc_type): Adjust documentation. - (grokdeclarator): Don't avoid building real array types when - processing templates unless really necessary. - (finish_method): Adjust calls to pop_binding. - * decl2.c (reparse_absdcl_as_expr): Recursively call ourselves, - not reparse_decl_as_expr. - (build_expr_from_tree): Deal with a template-id as the function to - call in a METHOD_CALL_EXPR. - * pt.c (convert_nontype_argument): Tweak pointer-to-member handling. - (maybe_adjust_types_For_deduction): Don't do peculiar things with - METHOD_TYPEs here. - (resolve_overloaded_unification): Handle COMPONENT_REFs. Build - pointer-to-member types where necessary. - * tree.c (build_cplus_array_type_1): Don't avoid building real - array types when processing templates unless really necessary. - (build_exception_variant): Compare the exception lists correctly. - -1998-12-13 Mark Mitchell - - * cp-tree.def (CPLUS_BINDING): Update documentation. - * cp-tree.h (LOCAL_BINDING_P): New macro. - (lang_identifier): Rename local_value to bindings. - (tree_binding): Make `scope' of type `void*', not `tree'. - (BINDING_SCOPE): Update documentation. - (IDENTIFIER_LOCAL_VALUE): Remove. - (IDENTIFIER_CLASS_VALUE): Document. - (IDENTIFIER_BINDING): New macro. - (IDENTIFIER_VALUE): Likewise. - (TIME_IDENTIFIER_TIME): Likewise. - (TIME_IDENTIFIER_FILEINFO): Likewise. - (IMPLICIT_TYPENAME_P): Likewise. - (set_identifier_local_value): Remove. - (push_local_binding): New function. - (push_class_binding): Likewise. - * class.c (pushclass): Update comments; use push_class_binding. - * decl.c (set_identifier_local_value_with_scope): Remove. - (set_identifier_local_value): Likewise. - (push_binding): New function. - (pop_binding): Likewise. - (binding_level): Update documentation. Remove shadowed. - (BINDING_LEVEL): New macro. - (free_binding_nodes): New variable. - (poplevel): Adjust for new name-lookup scheme. Don't mess up - BLOCK_VARs when doing for-scope extension. Remove effectively - dead code. - (pushlevel_class): Tweak formatting. - (poplevel_class): Adjust for new name-lookup scheme. - (print_binding_level): Likewise. - (store_bindings): Likewise. - (pushdecl): Likewise. - (pushdecl_class_level): Likewise. - (push_class_level_binding): Likewise. - (push_overloaded_decl): Update comments. Adjust for new - name-lookup scheme. - (lookup_name_real): Likewise. - (lookup_name_current_level): Likewise. - (cp_finish_decl): Likewise. - (require_complete_types_for_parms): Likewise. Remove misleading - #if 0'd code. - (grok_parms): Likewise. Don't call - require_complete_types_for_parms here. - (grok_ctor_properties): Don't treat templates as copy - constructors. - (grop_op_properties): Or as assignment operators. - (start_function): Document. Adjust for new name-lookup scheme. - (finish_function): Likewise. - * decl2.c (do_local_using_decl): Use push_local_binding. - * lex.c (begin_definition_of_inclass_inline): New function, split - out from ... - (do_pending_inlines): Here, and ... - (process_next_inline): Here. - (get_time_identifier): Use TIME_IDENTIFIER_* macros. - (init_filename_times): Likewise. - (extract_interface_info): Likewise. - (ste_typedecl_interface_info): Likewise. - (check_newline): Likewise. - (dump_time_statistics): Likewise. - (handle_cp_pragma): Likewise. - (do_identifier): Adjust for new name-lookup scheme. - * parse.y (function_try_block): Return ctor_initializer_opt value. - (fndef): Use it. - (fn.defpen): Pass appropriate values to start_function. - (pending_inline): Use functor_try_block value, and pass - appropriate values to finish_function. - * pt.c (is_member_template): Update documentation; remove handling - of FUNCTION_DECLs. As per name, this function should deal only in - TEMPLATE_DECLs. - (decl_template_parm_p): Change name of olddecl parameter to decl. - (check_template_shadow): Adjust for new name-lookup scheme. - (lookup_template_class): Likewise. - (tsubst_decl): Tweak so as not to confuse member templates with - copy constructors and assignment operators. - (unify): Handle UNION_TYPEs. - * ptree.c (print_lang_identifier): Adjust for new name-lookup scheme. - (lang_print_xnode): Adjust for new name-lookup scheme. - * typeck.c (mark_addressable): Likewise. - (c_expand_return): Likewise. - -1998-12-08 Jason Merrill - - * decl.c (grokdeclarator): Allow field with same name as class - in extern "C". - - * decl.c (lookup_name_real): Don't limit field lookup to types. - * class.c (check_member_decl_is_same_in_complete_scope): No error - if icv and x are the same. - * lex.c (do_identifier): Tweak error message. - -1998-12-10 Mark Mitchell - - * decl.c (start_enum): Use push_obstacks, not - end_temporary_allocation. - (finish_enum): Call pop_obstacks. - -1998-12-10 Mark Mitchell - - * class.c (instantiate_type): Return error_mark_node rather than - junk. - -1998-12-09 Mark Mitchell - - * cp-tree.h (most_specialized_instantiation): New function. - (print_candidates): Likewise. - * class.c (validate_lhs): Remove. - (resolve_address_of_overloaded_function): New function, split out - and then substantially reworked, from ... - (instantiate_type): Use it. Simplify. - * cvt.c (convert_to_reference): Complain when caller has indicated - that's the right thing to do. Don't crash if instantiate_type - fails. - * pt.c: Substitute `parameters' for `paramters' throughout. - (print_candidates): Don't make it static. - (most_specialized_instantiation): Split out from ... - (most_specialized): Here. - -Wed Dec 9 15:33:01 1998 Dave Brolley - - * lex.c (lang_init_options): Initialize cpplib. - * decl2.c (parse_options,cpp_initialized): Removed. - (lang_decode_option): Move initialization of cpplib to - lang_init_options. - -1998-12-09 Mark Mitchell - - * decl.c (grokdeclarator): Update the name of the TEMPLATE_DECL, as - well as the TYPE_DECL, when a typedef name is assigned to a - previously anonymous type. - -1998-12-08 Andrew MacLeod - - * cp/except.c (call_eh_info): use __start_cp_handler instead of - __cp_eh_info for getting the eh info pointer. Add table_index to - field list. - (push_eh_cleanup): Don't increment 'handlers' data field. - (process_start_catch_block): Don't set the 'caught' field. - - * cp/exception.cc (CP_EH_INFO): New macro for getting the - exception info pointer within library routines. - (__cp_eh_info): Use CP_EH_INFO. - (__start_cp_handler): Get exception info pointer, set caught field, - and increment the handlers field. Avoids this being done by handlers. - (__uncatch_exception, __check_eh_spec): Use CP_EH_INFO macro. - (uncaught_exception): Use CP_EH_INFO macro. - -Tue Dec 8 10:48:21 1998 Jeffrey A Law (law@cygnus.com) - - * Make-lang.in (cxxmain.o): Depend on $(DEMANGLE_H), not demangle.h - -Mon Dec 7 17:56:06 1998 Mike Stump - - * lex.c (check_newline): Add support for \ as `natural' - characters in file names in #line to be consistent with #include - handling. We support escape prcessing in the # 1 "..." version of - the command. See also support in cp/lex.c. - -1998-12-07 Zack Weinberg - - * cp/decl2.c: s/data/opts/ when initializing cpp_reader - structure. - -1998-12-07 Jason Merrill - - * decl.c (build_typename_type): Set DECL_ARTIFICIAL. - - * error.c (dump_simple_decl): Also print namespace context. - (dump_function_decl): Likewise. - - * decl2.c (ambiguous_decl): Don't print old value if it's - error_mark_node. - - * decl.c (lookup_name_real): Fix handling of local types shadowed - by a non-type decl. Remove obsolete code. - * cp-tree.h (DECL_FUNCTION_SCOPE_P): New macro. - - * lang-options.h: Add -fpermissive. - * decl2.c: Likewise. - * cp-tree.h: Add flag_permissive. - * decl.c (init_decl_processing): If neither -fpermissive or -pedantic - were specified, set flag_pedantic_errors. - * call.c (build_over_call): Turn dropped qualifier messages - back into pedwarns. - * cvt.c (convert_to_reference): Likewise. - * typeck.c (convert_for_assignment): Likewise. - -1998-12-05 Jason Merrill - - * decl2.c (coerce_new_type): Use same_type_p. - (coerce_delete_type): Likewise. - - * call.c (check_dtor_name): Return 1, not error_mark_node. - -1998-12-04 Jason Merrill - - * lex.c (handle_cp_pragma): Disable #pragma interface/implementation - if MULTIPLE_SYMBOL_SPACES. - - * pt.c (check_template_shadow): New fn. - * decl2.c (grokfield): Use it. - * decl.c (pushdecl): Likewise. - (pushdecl_class_level): Likewise. - (start_method): Likewise. - (xref_tag): Don't try to use 't' if we're defining. - - * call.c (check_dtor_name): Just return an error_mark_node. - * pt.c (lookup_template_class): Complain about using non-template here. - * parse.y (apparent_template_type): Not here. - - * pt.c (check_explicit_specialization): Complain about specialization - with C linkage. - - * lang-options.h: Add -f{no-,}implicit-inline-templates. - - * pt.c (convert_nontype_argument): Don't assume that any integer - argument is intended to be a constant-expression. - -1998-12-03 Mark Mitchell - - * class.c (handle_using_decl): Fix comment. Don't lookup - constructors in base classes. - (validate_lhs): Fix typo in comment. - * search.c (lookup_field_1): Don't return a USING_DECL. - - * cp-tree.h (DECL_ACCESS): Improve documentation. - - * decl.c (expand_static_init): Don't set the initialization-done - flag until the initialization is done. - -1998-12-02 Mark Mitchell - - * decl2.c (validate_nonmember_using_decl): Complain about using - declarations for class members. - -1998-11-29 Jason Merrill - - * typeck2.c (process_init_constructor): Use same_type_p. - - * decl.c (check_tag_decl): Don't warn about null decl inside a - class. - - * pt.c (unify, case OFFSET_TYPE): Pass down 'strict' rather than - UNIFY_ALLOW_NONE. - (convert_nontype_argument): Use TYPE_PTRMEMFUNC_FN_TYPE. - (resolve_overloaded_unification): Strip baselinks. - -Fri Nov 27 13:07:23 1998 Kaveh R. Ghazi - - * g++spec.c: Don't prototype xmalloc. - -1998-11-25 Jason Merrill - - * except.c (expand_throw): Use TYPE_PTR_P to check for pointers. - - * decl.c (check_tag_decl): Do complain about null friend decl at - file scope. - -1998-11-25 Andreas Schwab - - * lex.c (make_lang_type): Clear the whole struct lang_type, not - only the first multiple of sizeof (int). - -1998-11-24 Jason Merrill - - * decl.c (start_decl): An explicit specialization of a static data - member is only a definition if it has an initializer. - - * except.c (expand_throw): Use cp_finish_decl for the throw temp. - * cvt.c (build_up_reference): Pass DIRECT_BIND down into - cp_finish_decl. - * init.c (expand_default_init): Check for DIRECT_BIND instead of - DECL_ARTIFICIAL. - - * call.c (build_over_call): Use build_decl. - - * except.c (expand_throw): Just use convert, not - build_reinterpret_cast. - - * lex.c (handle_generic_pragma): Use token_buffer. - - * decl.c (check_tag_decl): Don't complain about null friend decl. - -1998-11-24 Dave Pitts - - * Make-lang.in (DEMANGLER_PROG): Move the output argumnts to the - first position. - * lex.c (check_newline): Use ISALPHA. - (readescape): Use ISGRAPH. - (yyerror): Use ISGRAPH. - -1998-11-24 Nathan Sidwell - - * search.c (get_abstract_virtuals): Do not use initial - CLASSTYPE_ABSTRACT_VIRTUALS. - * typeck2.c (abstract_virtuals_error): Show location of abstract - declaration. - * call.c (build_new_method_call): Use - CLASSTYPE_ABSTRACT_VIRTUAL, rather than recalculate. - * class.c (finish_struct_bits): Don't bother working out whether - get_abstract_virtuals will do anything, just do it. - -1998-11-24 Graham - - * typeck.c (build_component_ref): Remove unused statement. - -1998-11-24 Jason Merrill - - * class.c (add_method): Catch invalid overloads. - - * class.c (add_method): Build up OVERLOADs properly for conversion ops. - * search.c (lookup_conversions): Handle getting real OVERLOADs. - (add_conversions): Likewise. Revert last change. - * call.c (add_conv_candidate): Pass totype to add_candidate instead - of fn. Don't add a new candidate if the last one was for the same - type. - (print_z_candidates): Handle getting a type as a function. - (joust): If we got two conversion candidates to the same type, - just pick one. - (build_object_call): Lose 'templates'. - (build_user_type_conversion_1): Handle getting real OVERLOADs. - -1998-11-23 Jason Merrill - - * typeck2.c (process_init_constructor): If there are elements - that don't have initializers and they need to have constructors - run, supply them with initializers. - - * class.c (finish_struct_1): A class with a 0-width bitfield is - still empty. - -1998-11-23 Mark Mitchell - - * pt.c (instantiate_class_template): Don't try to figure out what - specialization to use for a partial instantiation. Correct - typos in a couple of comments. Avoid calling uses_template_parms - multiple times. - -1998-11-23 Benjamin Kosnik - - * method.c (process_overload_item): Add call to - build_mangled_C9x_name for intTI_type_nodes. - (build_mangled_C9x_name): Add prototype, define. - * decl.c (init_decl_processing): Add names for - TImode_type_node. - -1998-11-23 Jason Merrill - - * parse.y (named_class_head): Update CLASSTYPE_DECLARED_CLASS. - - * class.c (finish_struct_1): Set things up for 0-width bitfields - like we do for others. - - * decl.c (check_tag_decl): New fn. - (shadow_tag): Split out from here. - * decl2.c (grok_x_components): Call it. - -1998-11-22 Jason Merrill - - * decl.c: Lose warn_about_return_type. - (grokdeclarator): Always complain about implicit int, except for - `main () { ... }'. - - * decl.c (tag_name): New fn. - (xref_tag): Complain about using typedef-name after class-key. - - * init.c (expand_vec_init): Also keep going if from_array. - - * tree.c (is_overloaded_fn): Also handle the output of - build_offset_ref. - - * decl.c (grokdeclarator): Use constructor_name when comparing - field name against enclosing class. - * class.c (finish_struct_anon): Likewise. - -1998-11-22 Mark Mitchell - - * decl.c (poplevel): Remove code to handle KEEP == 2. - (finish_function): Don't confuse BLOCK-order when - processing a destructor. - -1998-11-21 Jason Merrill - - * decl.c (require_complete_types_for_parms): Call layout_decl - after we've completed the type. - -1998-11-21 Martin von Löwis - - * decl2.c (validate_nonmember_using_decl): Allow using templates - from the global namespace. - -1998-11-21 Jason Merrill - - Handle specifying template args to member function templates. - * tree.c (build_overload): Always create an OVERLOAD for a template. - * search.c (add_conversions): Handle finding an OVERLOAD. - * decl2.c (check_classfn): Likewise. - * lex.c (identifier_type): See through a baselink. - * parse.y (do_id): Don't call do_identifier if we got a baselink. - * class.c (instantiate_type, case TREE_LIST): Recurse. - - * decl.c (grokdeclarator): Allow a boolean constant for array - bounds, odd as that sounds. - - * pt.c (unify): Be more strict about non-type parms, except for - array bounds. - (UNIFY_ALLOW_INTEGER): New macro. - -1998-11-19 Manfred Hollstein - - * Make-lang.in (mandir): Replace all uses of $(mandir) by $(man1dir). - -1998-11-19 Jason Merrill - - * semantics.c (begin_class_definition): Call - maybe_process_partial_specialization before push_template_decl. - Don't call push_template_decl for a specialization. - * search.c (lookup_field): Do return a member template class. - * decl2.c (handle_class_head): Handle member template classes. - - * decl.c (grokdeclarator): A parm type need not be complete. - - * pt.c (convert_nontype_argument): Fix thinko. - -1998-11-18 Mark Mitchell - - * cp-tree.h (PTRMEM_CST_CLASS): Fix typo. - (global_delete_fndecl): New variable. - * decl.c (global_delete_fndecl): Define it. - (init_decl_processing): Set it. - * init.c (build_builtin_delete_call): Use it. - * tree.c (mapcar): Recursively call mapcar for the type of EXPR - nodes. - -1998-11-18 Jason Merrill - - * decl.c (cplus_expand_expr_stmt): Always complain about unresolved - type. - - * tree.c (lvalue_p_1): An INDIRECT_REF to a function is an lvalue. - * call.c (build_object_call): Also support references to functions. - * typeck.c (convert_for_initialization): Don't decay a function - if the target is a reference to function. - - * search.c (add_conversions): Get all the overloads from a class. - - * decl.c (grok_ctor_properties): Complain about any constructor - that will take a single arg of the class type by value. - - * typeck2.c (build_functional_cast): Can't create objects of - abstract classes this way. - * cvt.c (ocp_convert): Likewise. - - * decl.c (grokfndecl): Member functions of local classes are not - public. - -1998-11-18 Mark Mitchell - - * Make-lang.in (cc1plus): Add dependency on hash.o. - -1998-11-18 Jason Merrill - - * search.c (get_abstract_virtuals): Complain about virtuals with - no final overrider. - * typeck2.c (abstract_virtuals_error): Remove handling for virtuals - with no final overrider. - * class.c (override_one_vtable): Don't set DECL_ABSTRACT_VIRTUAL_P - on virtuals with no final overrider. - - * lex.c (reinit_parse_for_block): Add a space after the initial ':'. - - * class.c (finish_struct_1): Don't remove zero-width bit-fields until - after layout_type. - - * friend.c (do_friend): Don't set_mangled_name_for_decl. - - * class.c (finish_struct_anon): Complain about non-fields. - * decl2.c (build_anon_union_vars): Likewise. - - * decl.c (grokdeclarator): Normal data members can't have the same - name as the class, either. - * class.c (finish_struct_anon): Neither can members of an - anonymous union. - -1998-11-17 Mark Mitchell - - * cp-tree.h (TYPE_ALIAS_SET): Document language-dependent uses. - (TYPE_BINFO): Likewise. - (IS_AGGR_TYPE): Tweak. - (SET_IS_AGGR_TYPE): New macro. - (CLASS_TYPE_P): Tweak. - (lang_type): Group mark bitfields together. Remove linenum. - (CLASSTYPE_SOURCE_LINE): Remove macro. - (CLASSTYPE_MARKED_N): New macro. - (SET_CLASSTYPE_MARKED_N): Likewise. - (CLEAR_CLASSTYPE_MARKED_N): Likewise. - (CLASS_TYPE_MARKED_*): Use them. - (SET_CLASSTYPE_MARKED_*): Likewise. - (CLEAR_CLASSTYPE_MARKED_*): Likewise. - (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO): Likewise. - (TYPE_TEMPLATE_INFO): Handle TEMPLATE_TEMPLATE_PARMs as well. - (TYPENAME_TYPE_FULLNAME): Use TYPE_BINFO rather than CLASSTYPE_SIZE. - * class.c (class_cache_obstack): New variable. - (class_cache_firstobj): Likewise. - (finish_struct): Don't set CLASSTYPE_SOURCE_LINE. - (pushclass): Free the cache, when appropriate. - (popclass): Tidy. - (maybe_push_cache_obstack): Use class_cache_obstack. - * decl.c (include hash.h). - (typename_hash): New function. - (typename_compare): Likewise. - (build_typename_type): Check the hash table to avoid creating - duplicates. - (build_ptrmemfunc_type): Use SET_IS_AGGR_TYPE. - (grokdeclarator): Use CLASS_TYPE_P. - (xref_basetypes): Likewise. - (start_function): Likewise. Don't put current_class_ref on the - permanent obstack. - * error.c (dump_type_real): Use TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO - and TYPE_TI_ARGS. - * lex.c (note_got_semicolon): Use CLASS_TYPE_P. - (make_lang_type): Don't create TYPE_LANG_SPECIFIC and associated - fields for types other than class types. Do clear TYPE_ALIAS_SET - for types other than class types, though. - * method.c (build_overload_identifier): Use CLASS_TYPE_P and - TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO. - * pt.c (process_template_parm): Don't set - CLASSTYPE_GOT_SEMICOLON. - (lookup_template_class) Use TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO. - Coerce arguments on the momentary obstack. - (for_each_template_parm): Use TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO. - (instantiate_class_template): Calculate template arguments on the - momentary obstack. Tidy. - (tsubst_template_arg_vector): Use make_temp_vec. - (tsubst_aggr_type): Put template arguments on the momentary - obstack. - (tsubst_decl): Likewise. - (tsubst): Copy the array bounds index to the permanent obstack - before building index types. Use new macros. - (unify): Use new macros. - (do_type_instantiation): Likewise. - * search.c (lookup_fnfields_1): Use new macros. - (dfs_pushdecls): Build envelopes on the cache obstack. - (dfs_compress_decls): Use new macros. - (push_class_decls): Build on the cache obstack. - * semantics.c (finish_typeof): Don't set CLASSTYPE_GOT_SEMICOLON. - * sign.c (build_signature_pointer_or_reference_type): Use - SET_IS_AGGR_TYPE. - * tree.c (make_binfo): Check CLASS_TYPE_P. - (copy_template_template_parm): Adjust. - (make_temp_vec): Use push_expresion_obstack. - * typeck.c (complete_type): Use new macros. - (comptypes): Likewise. - -1998-11-17 Jason Merrill - - * pt.c (tsubst): Add diagnostics for invalid array, reference - and pointer to member types. - -1998-11-16 Jason Merrill - - * typeck2.c (my_friendly_abort): Don't fatal twice in a row. - - * typeck.c (c_expand_start_case): Use build_expr_type_conversion. - Simplify. - - * parse.y (structsp): Fix cut-and-paste error. - - * init.c (build_new): Complain about non-integral size. - - * parse.y (unary_expr): Complain about defining types in sizeof. - - * typeck.c (expr_sizeof): Complain about sizeof an overloaded fn. - - * rtti.c (build_x_typeid): Complain about typeid without - including . - (get_typeid): Likewise. Complain about typeid of incomplete type. - (get_tinfo_fn_dynamic): Likewise. - (get_typeid_1): Not static anymore. - * except.c (build_eh_type_type): Use get_typeid_1. - - * rtti.c (build_dynamic_cast_1): Give errors for dynamic_cast to - ambiguous or private bases. Fix warning for reference cast. - -1998-11-16 Mark Mitchell - - * cp-tree.h (DECL_TEMPLATE_INSTANTIATED): New macro. - * decl.c (duplicate_decls): Remove special-case code to deal with - template friends, and just do the obvious thing. - * pt.c (register_specialization): Tweak for clarity, and also to - clear DECL_INITIAL for an instantiation before it is merged with a - specialization. - (check_explicit_specialization): Fix indentation. - (tsubst_friend_function): Handle both definitions in friend - declaration and outside friend declarations. - (tsubst_decl): Don't clear DECL_INITIAL for an instantiation. - (regenerate_decl_from_template): Tweak accordingly. - (instantiate_decl): Likewise. - -1998-11-16 Jason Merrill - - * decl.c (cplus_expand_expr_stmt): Promote warning about naked - member function reference to error. - * cvt.c (ocp_convert): Complain about converting an overloaded - function to void. - - * init.c (build_offset_ref): Just return a lone static member - function. - - * decl.c (cp_finish_decl): Only complain about real CONSTRUCTORs, - not internal ones. - - * typeck.c (build_binary_op_nodefault): Improve error handling. - - * decl.c (grokfndecl): Complain about making 'main' a template. - - * typeck.c (string_conv_p): Don't convert from wchar_t[] to char*. - - * call.c (build_method_call): Handle a BIT_NOT_EXPR around a - TYPE_DECL in a template. - -1998-11-15 Jason Merrill - - * typeck2.c (my_friendly_abort): Add URL in the other case, too. - - * decl.c (struct cp_function): Add named_label_uses. - (push_cp_function_context): Save it. - (pop_cp_function_context): Restore it. - (define_label): Also complain about jumping into the scope of - non-POD objects that don't have constructors. - * tree.c (pod_type_p): New fn. - - * pt.c (instantiate_class_template): Clear TYPE_BEING_DEFINED sooner. - * rtti.c (synthesize_tinfo_fn): Call import_export_decl here. - (get_tinfo_fn): Not here. - * repo.c (repo_get_id): Abort if we get called for an incomplete - type. - -1998-11-13 Mark Mitchell - - * except.c (expand_throw): Make sure first argument to - __cp_push_exception is of type `void*' to avoid spurious error - messages. - -1998-11-11 Jason Merrill - - * pt.c (try_one_overload): Take orig_targs again. Only check for - mismatches against them; we don't care what a previous call found. - (resolve_overloaded_unification): Adjust. - - * search.c (lookup_field): Don't return anything for a non-type - field from a dependent type. - * decl.c (grokdeclarator): Resolve SCOPE_REFs of the current class - in an array declarator. - (start_decl): Push into the class before looking for the field. - -1998-11-08 Mark Mitchell - - * method.c (build_overload_value): Handle REFERENCE_TYPE. - -1998-11-08 Martin von Löwis - - * decl.c (grokdeclarator): Allow namespace-scoped members if they - are friends. - -1998-11-08 Jason Merrill - - * pt.c (tsubst_decl): Don't mess with the global value of an - un-mangled DECL_ASSEMBLER_NAME. - -1998-11-03 Christopher Faylor - - * decl.c (init_decl_processing): Remove CYGWIN conditional - since CYGWIN is now able to deal with trapping signals. - -Sat Nov 7 15:48:02 1998 Kaveh R. Ghazi - - * cp-tree.h: Don't include gansidecl.h. - * exception.cc: Include gansidecl.h (since we don't include config.h) - * g++spec.c: Don't include gansidecl.h. - -1998-11-06 Mark Mitchell - - * cp-tree.h (lang_decl_flags): Add defined_in_class. Decrease - size of dummy. - (DECL_DEFINED_IN_CLASS_P): New macro. - (TEMPLATE_PARMS_FOR_INLINE): Document. - (check_static_variable_definition): New function. - * decl.c (cp_finish_decl): Set DECL_DEFINED_IN_CLASS_P, if - appropriate. - (check_static_variable_definition): Split out from ... - (grokdeclarator): Here. - * pt.c (check_default_tmpl_args): New function, split out from ... - (push_template_decl_real): Here. - (instantiate_template): Fix comment. - -1998-11-04 Mark Mitchell - - * cp-tree.h (CP_TYPE_CONST_P): Make {0,1}-valued. - (CP_TYPE_VOLATILE_P): Likewise. - (CP_TYPE_RESTRICT_P): Likewise. - -1998-11-03 Mark Mitchell - - * pt.c (tsubst): Use build_index_type, not build_index_2_type. - -1998-11-02 Jason Merrill - - * class.c (instantiate_type): Be more helpful. - - * decl2.c (import_export_decl): Call import_export_class. - - * cp-tree.h (EMPTY_CONSTRUCTOR_P): Check !TREE_HAS_CONSTRUCTOR. - * decl2.c (build_expr_from_tree): Propagate TREE_HAS_CONSTRUCTOR. - * pt.c (tsubst_copy): Likewise. - -1998-11-02 Mark Mitchell - - * init.c (expand_vec_init): Fix off-by-one error. - -1998-11-02 Alexandre Oliva - - * parse.y (apparent_template_type): new type - (named_complex_class_head_sans_basetype): use it - * Makefile.in (CONFLICTS): one new conflict - * parse.c: Regenerated - -1998-11-01 Mark Mitchell - - * cp-tree.h (COMPARE_STRICT): New macro. - (COMPARE_BASE): Likewise. - (COMPARE_RELAXED): Likewise. - (COMPARE_REDECLARATION): Likewise. - (same_type_p): Likewise. - (same_or_base_type_p): Likewise. - * call.c (standard_conversion): Use them, in place of comptypes - with numeric arguments. - (reference_binding): Likewise. - (convert_like): Likewise. - (build_over_call): Likewise. - (is_subseq): Likewise. - (is_properly_derived_from): Likewise. - (compare_ics): Likewise. - (joust): Likewise. - * class.c (delete_duplicate_fields_1): Likewise. - (resolves_to_fixed_type_p): Likewise. - (instantiate_type): Likewise. Remove #if 0'd code. - * decl.c (decls_match): Likewise. Use COMPARE_REDECLARATION here. - (pushdecl): Likewise. - (lookup_name_real): Likewise. - (grokdeclarator): Likewise. Check for illegal array declarations. - (grokparms): Likewise. - (grok_op_properties): Likewise. - * decl2.c (check_classfn): Likewise. - * friend.c (is_friend): Likewise. - (make_friend_class): Likewise. - * init.c (expand_aggr_init): Likewise. - (expand_vec_init): Likewise. - * pt.c (is_member_template_class): Remove declaration. - (is_specialization_of): Use COMPARE_* and new macros. - (comp_template_parms): Likewise. - (convert_nontype_argument): Likewise. - (coerce_template_template_parms): Likewise. - (template_args_equal): Likewise. - (lookup_template_class): Likewise. - (type_unification_real): Likewise. - (unify): Likewise. - (get_bindings_real): Likewise. - * search.c (covariant_return_p): Likewise. - (get_matching_virtual): Likewise. - * sig.c (match_method_types): Likewise. - * tree.c (vec_binfo_member): Likewise. - (cp_tree_equal): Likewise. - * typeck.c (common_type): Likewise. - (comp_array_types): Likewise. Get issues involving unknown array - bounds right. - (comptypes): Update comments. Use new flags. - (comp_target_types): Use new macros. - (compparms): Likewise. - (comp_target_parms): Likewise. - (string_conv_p): Likewise. - (build_component_ref): Likewise. - (build_indirect_ref): Likewise. - (build_conditional_expr): Likewise. - (build_static_cast): Likewise. - (build_reinterpret_cast): Likewise. - (build_const_cast): Likewise. - (build_modify_expr): Likewise. - (convert_for_assignment): Likewise. - (comp_ptr_ttypes_real): Likewise. - (ptr_reasonably_similar): Likewise. - (comp_ptr_ttypes_const): Likewise. - -1998-10-31 Jason Merrill - - * rtti.c (build_dynamic_cast_1): Fix cut-and-paste error. - -1998-10-30 Mark Mitchell - - * decl2.c (delete_sanity): Pass integer_zero_node, not - integer_two_node, to build_vec_delete. - * init.c (build_array_eh_cleanup): Remove. - (expand_vec_init_try_block): New function. - (expand_vec_init_catch_clause): Likewise. - (build_vec_delete_1): Don't deal with case that auto_delete_vec - might be integer_two_node anymore. - (expand_vec_init): Rework for initialization-correctness and - exception-correctness. - * typeck2.c (process_init_constructor): Make mutual exclusivity - of cases more obvious. - -1998-10-29 Jason Merrill - - * decl.c (lookup_name_real): OK, only warn if not lexing. - Simplify suggested fix. - - * cp-tree.h (IDENTIFIER_MARKED): New macro. - * search.c (lookup_conversions): Use breadth_first_search. - (add_conversions): Avoid adding two conversions to the same type. - (breadth_first_search): Work with base binfos, rather - than binfos and base indices. - (get_virtual_destructor): Adjust. - (tree_has_any_destructor_p): Adjust. - (get_matching_virtual): Adjust. - - * pt.c (push_template_decl_real): Generalize check for incorrect - number of template parms. - (is_member_template_class): #if 0. - -1998-10-29 Richard Henderson - - * Makefile.in (cc1plus): Put CXX_OBJS, and thence @extra_cxx_objs@, - last. - -1998-10-28 Zack Weinberg - - * lex.c: Call check_newline from lang_init always. After - calling cpp_start_read, set yy_cur and yy_lim to read from the - cpplib token buffer. - -1998-10-28 Jason Merrill - - * class.c (instantiate_type): Don't consider templates for a normal - match. - - * class.c (finish_struct_1): Don't complain about non-copy - assignment ops in union members. - - * class.c (build_vtable): Don't pass at_eof to import_export_vtable. - (prepare_fresh_vtable): Likewise. - (finish_struct_1): Don't call import_export_class. - * decl2.c (finish_vtable_vardecl): Do import/export stuff. - (finish_prevtable_vardecl): Lose. - (finish_file): Don't call it. - * pt.c (instantiate_class_template): Likewise. - * cp-tree.h: Remove it. - - * init.c (build_delete): Reset TYPE_HAS_DESTRUCTOR here. - * decl.c (finish_function): Not here. - (start_function): Do set DECL_INITIAL. - - * pt.c (push_template_decl_real): Complain about default template - args for enclosing classes. - - * call.c (add_function_candidate): Treat conversion functions - as coming from the argument's class. - * cp-tree.h (DECL_CONV_FN_P): New fn. - (DECL_DESTRUCTOR_P): Also check DECL_LANGUAGE. - * class.c (add_method): Use DECL_CONV_FN_P. - * decl2.c (check_classfn): Likewise. - * error.c (dump_function_name): Likewise. - (dump_function_decl): Likewise. - * pt.c (fn_type_unification): Likewise. - * search.c (add_conversions): Likewise. - -1998-10-27 Jason Merrill - - * lex.c (do_identifier): Also generate LOOKUP_EXPR for RESULT_DECL. - * method.c (hack_identifier): Also check for using RESULT_DECL - from outer context. - -1998-10-27 Mark Mitchell - - * decl.c (grokdeclarator): Use type_quals, rather than constp, - consistently. - -1998-10-27 Jason Merrill - - * call.c (standard_conversion): instantiate_type here. - (reference_binding): And here. - (implicit_conversion): Not here. - (build_op_delete_call): No need to cons up an OVERLOAD. - * cvt.c (cp_convert_to_pointer): instantiate_type here. - (convert_to_reference): And here. - * decl.c (grok_reference_init): Not here. - (grokparms): Or here. - * typeck2.c (digest_init): Or here. - * typeck.c (decay_conversion): Take the address of overloaded - functions, too. - (require_instantiated_type): Lose. - (convert_arguments): Don't handle unknown types here. - (build_c_cast): Likewise. - (build_binary_op): Gut. - (build_conditional_expr): Don't require_instantiated_type. - (build_modify_expr): Likewise. - (build_static_cast): Don't instantiate_type. - (build_reinterpret_cast): Likewise. - (build_const_cast): Likewise. - (convert_for_initialization): Likewise. - (build_ptrmemfunc): Use type_unknown_p. - (convert_for_assignment): Also do default_conversion on overloaded - functions. Hand them off to ocp_convert. - -1998-10-26 Mark Mitchell - - * error.c (dump_decl): Deal with TEMPLATE_DECLs that are - VAR_DECLs. Handle vtables whose DECL_CONTEXT is not a type. - - * class.c (finish_struct_1): Use build_cplus_array_type to build - array types. - * decl.c (init_decl_processing): Likewise. - * except.c (expand_end_eh_spec): Likewise. - * search.c (expand_upcast_fixups): Simplify very slightly. - -1998-10-26 Jason Merrill - - * decl.c (grokdeclarator): Complain about a variable using - constructor syntax coming back null from start_decl. - - * friend.c (make_friend_class): Complain about trying to make - a non-class type a friend. - - * decl.c (grokfndecl): Set DECL_INITIAL for a defn here. - (start_function): Not here. - -1998-10-26 Brendan Kehoe - - * decl.c (grokdeclarator): Disallow `explicit' in a friend declaration. - -1998-10-26 Jason Merrill - - * typeck2.c (process_init_constructor): Only skip anonymous fields - if they are bitfields. - - * cp-tree.def (TYPEOF_TYPE): New code. - * error.c (dump_type_real): Handle it. - * pt.c (tsubst): Likewise. - * tree.c (search_tree): Likewise. - * semantics.c (finish_typeof): New fn. - * parse.y (typespec): Use it. - * cp-tree.h: Declare it. - -1998-10-26 Manfred Hollstein - - * cp-tree.h (FORMAT_VBASE_NAME): Make definition unconditional. - -1998-10-26 Jason Merrill - - * typeck.c (convert_arguments): Don't handle pmf references - specially. - - * init.c (build_member_call): Don't try to convert to the base type - if it's ambiguous or pedantic. - - * typeck2.c (check_for_new_type): Only depend on pedantic for - C-style casts. - -1998-10-25 Mark Mitchell - - * decl.c (grokdeclarator): Set DECL_NONCONVERTING_P for all - non-converting constructors. - -1998-10-24 Martin von Löwis - - * gxxint.texi: Correct documentation for n, N, Q, and B. - -1998-10-23 Martin von Löwis - - * parse.y (condition): Convert VAR_DECL from reference to indirect - reference. - -1998-10-23 Andrew MacLeod - - * exception.cc (__cp_pop_exception): Free the original exception - value, not the potentially coerced one. - -1998-10-23 Mark Mitchell - - * Makefile.in (hash.h): Run gperf when necessary. - - * cp-tree.h (CP_TYPE_READONLY): Remove. - (CP_TYPE_VOLATILE): Likewise. - (CP_TYPE_QUALS): New macro. - (CP_TYPE_CONST_P): Likewise. - (CP_TYPE_VOLATILE_P): Likewise. - (CP_TYPE_RESTRICT_P): Likewise. - (CP_TYPE_CONST_NON_VOLATILE_P): Likewise. - (cp_build_type_variant): Rename to ... - (cp_build_qualified_type): New function. - (c_apply_type_quals_to_decl): Declare. - (SIGNATURE_POINTER_NAME_FORMAT): Modify to allow `restrict'. - (SIGNATURE_REFERENCE_NAME_FORMAT): Likewise. - (cp_type_qual_from_rid): New function. - (compparms): Remove unused parameter. All callers changed. - (cp_type_quals): New function. - (at_least_as_qualified_p): Likewise. - (more_qualified_p): Likewise. - - * call.c (standard_conversion): Replace calls to - cp_build_type_variant with cp_build_qualified_type. Use - CP_TYPE_QUALS to get qualifiers and at_least_as_qualified_p to - compare them. Use CP_TYPE_* macros to check qualifiers. - (reference_binding): Likewise. - (implicit_conversion): Likewise. - (add_builtin_candidates): Likewise. - (build_over_call): Likewise. - * class.c (overrides): Compare all qualifiers, not just `const', - on method declarations. - * cvt.c (convert_to_reference): More CP_TYPE_QUALS conversion, etc. - (convert_pointer_to_real): Likewise. - (type_promotes_to): Likewise. - * decl.c (check_for_uninitialized_const_var): New function. - (init_decl_processing): More CP_TYPE_QUALS conversion, etc. - (cp_finish_decl): Use check_for_uninitialized_const_var. - (grokdeclarator): More CP_TYPE_QUALS conversion, etc. Update to - handle `restrict'. - (grok_ctor_properties): Likewise. - (grok_op_properties): Likewise. - (start_function): Likewise. - (rever_static_member_fn): Likewise. - * decl2.c (grok_method_quals): Likewise. - (grokfield): Likewise. - * error.c (dump_readonly_or_volatile): Rename to ... - (dump_qualifiers): New function. Handle `restrict'. - (dump_type_real): Use it. - (dump_aggr_type): Likewise. - (dump_type_prefix): Likewise. - (dump_type_suffix): Likewise. - (dump_function_decl): Likewise. - (cv_as_string): Likewise. - * gxx.gperf: Add __restrict and __restrict__. - * gxxint.texi: Document `u' as used for `__restrict', and a few - other previously undocumented codes. - * hash.h: Regenerated. - * init.c (expand_aggr_init): More CP_TYPE_QUALS conversion, etc. - (build_member_call): Likewise. - (build_new_1): Likewise. - * lex.c (init_parse): Add entry for RID_RESTRICT. - (cons_up_default_function): More CP_TYPE_QUALS conversion, etc. - (cp_type_qual_from_rid): Define. - * lex.h (enum rid): Add RID_RESTRICT. - * method.c (process_modifiers): Deal with `restrict'. - * parse.y (primary): More CP_TYPE_QUALS conversion, etc. - * parse.c: Regenerated. - * pt.c (convert_nontype_argument): More CP_TYPE_QUALS conversion, etc. - (tsubst_aggr_type): Likewise. - (tsubst): Likewise. - (check_cv_quals_for_unify): Likewise. - (unify): Likewise. - * rtti.c (init_rtti_processing): Likewise. - (build_headof): Likewise. - (get_tinfo_var): Likewise. - (buidl_dynamic_cast_1): Likewise. Fix `volatile' handling. - (expand_class_desc): Likewise. - (expand_attr_desc): Likewise. - (synthesize_tinfo_fn): Likewise. - * search.c (covariant_return_p): Likewise. Fix `volatile' handling. - (get_matching_virtual): Likewise. - (expand_upcast_fixups): Likewise. - * sig.c (build_signature_pointer_or_reference_name): Take - type_quals, not constp and volatilep. - (build_signature_pointer_or_reference_type): Likewise. - (match_method_types): More CP_TYPE_QUALS conversion, etc. - (build_signature_pointer_constructor): Likewise. - (build_signature_method_call): Likewise. - * tree.c (build_cplus_array_type): Likewise. - (cp_build_type_variant): Rename to ... - (cp_build_qualified_type): New function. Deal with `__restrict'. - (canonical_type_variant): More CP_TYPE_QUALS conversion, etc. - (build_exception_variant): Likewise. - (mapcar): Likewise. - * typeck.c (qualif_type): Likewise. - (common_type): Likewise. - (comptypes): Likewise. - (comp_cv_target_types): Likewise. - (at_least_as_qualified_p): Define. - (more_qualified_p): Likewise. - (comp_cv_qualification): More CP_TYPE_QUALS conversion, etc. - (compparms): Likewise. - (inline_conversion): Likewise. - (string_conv_p): Likewise. - (build_component_ref): Likewise. - (build_indirect_ref): Likewise. - (build_array_ref): Likewise. - (build_unary_op): Likewise. - (build_conditional_expr): Likewise. - (build_static_cast): Likewise. - (build_c_cast): Likewise. - (build_modify_expr): Likewise. - (convert_For_assignment): Likewise. - (comp_ptr_ttypes_real): Likewise. - (cp_type_quals): New function. - -1998-10-23 Jason Merrill - - * cp-tree.h (CP_TYPE_READONLY): New macro to handle arrays. - (CP_TYPE_VOLATILE): Likewise. - * decl.c (grokdeclarator): Use them. - * tree.c (canonical_type_variant): Likewise. - -1998-10-22 Martin von Löwis - - * parse.y (named_class_head): Push into class while parsing the - base class list. - * decl2.c (push_scope, pop_scope): New functions. - * cp-tree.h: Declare them. - * init.c (build_new_1): Delay cleanup until end of full expression. - -1998-10-21 Jason Merrill - - * typeck.c (build_component_ref): Use of a type here is an error. - -1998-10-19 Jason Merrill - - Revamp references to member functions. - * method.c (hack_identifier): Call build_component_ref for a - reference to a member function. - * typeck.c (build_component_ref): Only return a single function - if it's static. Otherwise, return a COMPONENT_REF. - (build_x_function_call): Handle a COMPONENT_REF. - (build_unary_op): Handle all unknown-type things. - * decl2.c (arg_assoc): Handle COMPONENT_REF. - * class.c (instantiate_type): Complain if the function we get is a - nonstatic member function. Remove code for finding "compatible" - functions. - * pt.c (tsubst_copy): Handle NOP_EXPR. - * tree.c (build_dummy_object): New fn. - (maybe_dummy_object): New fn. - (is_dummy_object): New fn. - * cp-tree.h: Declare them. - * cvt.c (cp_convert_to_pointer): Use maybe_dummy_object. - * error.c (dump_expr, case OFFSET_REF): Use is_dummy_object. - * init.c (build_member_call): Use maybe_dummy_object and - is_dummy_object. - (build_offset_ref): Use maybe_dummy_object. - (resolve_offset_ref): Use is_dummy_object. - * typeck.c (build_x_function_call): Call build_dummy_object. - (unary_complex_lvalue): Call is_dummy_object. - - * typeck.c (build_component_addr): Make sure field is a field. - - * call.c (build_new_op): Delete obsolete code. - - * pt.c (tsubst, TEMPLATE*PARM*): Abort if we don't have any args. - -1998-10-18 Martin von Löwis - - * decl2.c (validate_nonmember_using_decl): Fix using-directives of - std if std is ignored. - -1998-10-18 Jason Merrill - - * decl.c (grokvardecl): Fix thinko. - - * decl.c (grokdeclarator): Embedded attrs bind to the right, - not the left. - - * parse.y (fn.def2): Fix 'attrs' format. - -1998-10-18 Alastair J. Houghton - - * Makefile.in (CONFLICTS): Update. - * parse.y (expr_or_declarator_intern): New rule. - (expr_or_declarator, direct_notype_declarator, primary, - functional_cast): Use it. - (notype_declarator_intern): New rule. - (notype_declarator, complex_notype_declarator): Use it. - -1998-10-17 Jason Merrill - - * decl.c (grokfndecl): Set DECL_CONTEXT to namespace if appropriate. - (grokvardecl): Likewise. - -Sat Oct 17 23:27:20 1998 Kaveh R. Ghazi - - * class.c (make_method_vec): Cast 1st argument of `bzero' to (PTR). - (add_method): Likewise for arguments 1 & 2 of `bcopy'. - - * decl.c (signal_catch): Mark with ATTRIBUTE_NORETURN. - - * pt.c (process_partial_specialization): Cast 1st argument of - `bzero' to (PTR). - - * tree.c (build_base_fields): Cast `base_align' to (int) when - comparing against one. - -1998-10-16 Mark Mitchell - - * decl.c (lookup_name_real): Handle template parameters for member - templates where said parameters have the same name as the - surrounding class. - - * decl.c (expand_static_init): Build cleanups before entering the - anonymous function used to do them to avoid access-checking - confusion. - - * decl.c (grokfndecl): Add back call to cplus_decl_attributes - accidentally removed by previous change, and make DECL_RTL here. - * class.c (add_method): Don't make DECL_RTL here. - - * pt.c (for_each_template_parm): Don't examine uninstantiated - default arguments. - -1998-10-16 Dave Brolley - - * lex.c (real_yylex): Fix unaligned access of wchar_t. - -1998-10-16 Mark Mitchell - - * class.c (add_method): Fix documentation to reflect previous - changes. Check for duplicate method declarations here. - * decl.c (decls_match): Handle FUNCTION_DECL vs TEMPLATE_DECL - correctly; such things never match. - (grokfndecl): Don't look for duplicate methods here. - * decl2.c (check_classfn): Don't assume names are mangled. - Don't add bogus member function declarations to a class before the - class type is complete. - (grokfield): Reformat error message. - * method.c (set_mangled_name_for_decl): Don't mangle names while - procesing_template_decl. - -1998-10-16 Jason Merrill - - * typeck.c (build_indirect_ref): Complain about a pointer to data - member, too. - * typeck2.c (build_m_component_ref): Don't indirect a pointer to - data member. - * init.c (resolve_offset_ref): Don't undo the above. - - * cp-tree.h (DECL_C_BIT_FIELD, SET_DECL_C_BIT_FIELD): New macros. - (struct lang_decl_flags): Add `bitfield'. - * class.c (finish_struct_1): Use DECL_C_BIT_FIELD instead of - DECL_BIT_FIELD. - * decl2.c (grokbitfield, grok_alignof): Likewise. - * init.c (build_offset_ref): Likewise. - * typeck.c (build_component_addr, expr_sizeof): Likewise. - * cvt.c (build_up_reference): Don't crash if taking the address - returns error_mark_node. - - * decl.c (grokfndecl): Also check ctype when checking for ::main(). - -1998-10-15 Jason Merrill - - * decl.c (grokfndecl): ::main and __builtin_* get C linkage. - Do mangling here. - (grokdeclarator): Instead of here. - * friend.c (do_friend): Lose special handling of ::main and - __builtin_*. - * cp-tree.h (DECL_MAIN_P): Check for C linkage. - - * spew.c (yylex): Clear looking_for_typename if we got - 'enum { ... };'. - -1998-10-15 Mark Mitchell - - * class.c (maybe_warn_about_overly_private_class): Improve error - messages for class with only private constructors. - - * cp-tree.def (TYPENAME_TYPE): Add to documentation. - * cp-tree.h (TYPENAME_TYPE_FULLNAME): Document. - (build_typename_type): New function. - * decl.c (build_typename_type): Broken out from ... - (make_typename_type): Use it. - * search.c (lookup_field): Likewise. - -1998-10-14 Benjamin Kosnik - - * pt.c (convert_nontype_argument): Check against type_referred_to. - * decl.c (grokvardecl): Check for declarator name before building - DECL_ASSEMBLER_NAME. - -1998-10-14 Mark Mitchell - - * pt.c (lookup_template_class): Add comment. - (instantiate_class_template): Don't mark the _TYPE node for - member class templates as an instantiation. - -1998-10-14 Jason Merrill - - * decl.c (grokfndecl): Fix my thinko. - -1998-10-13 Jason Merrill - - * tinfo2.cc (fast_compare): Remove. - (before): Just use strcmp. - * tinfo.cc (operator==): Just use strcmp. - -1998-10-13 Klaus-Georg Adams - - * decl.c (grokfndecl): Don't check for linkage in `extern "C"' - declarations. - -1998-10-13 Mark Mitchell - - * cp-tree.h (specializations_of_same_template_p): Remove. - * search.c (get_template_base): Don't use it. - (get_template_base_recursive): Likewise. - * pt.c (specializations_of_same_template_p): Remove. - (unify): Don't use it. - (lookup_template_class): Find the correct parent when setting - CLASSTYPE_TI_TEMPLATE. - -1998-10-12 Jason Merrill - - * tinfo.cc (operator==): Always compare names. - -1998-10-12 Herman ten Brugge - - * decl.c (start_function): Fix cut-and-paste error. - -1998-10-12 Jason Merrill - - * inc/typeinfo: Add #pragma interface. - (operator!=): Just call operator==. - * tinfo.cc: Add #pragma implementation. - (operator==): Move from inc/typeinfo and tinfo2.cc. - Check __COMMON_UNRELIABLE instead of _WIN32. - - * typeck2.c (my_friendly_abort): Add URL. - -1998-10-12 Alastair J. Houghton - - * decl.c (start_method): Added extra parameter for attributes. - * cp-tree.h (start_method): Update prototype. - * parse.y (fn.def2): Update start_method parameter list. - -1998-10-11 Mark Mitchell - - * cp-tree.h (specializations_of_same_template_p): Declare. - * pt.c (specializations_of_same_template_p): New function. - (unify): Use it. - * search.c (get_template_base): Use it. - (get_template_base_recursive): Likewise. - -1998-10-10 Manfred Hollstein - - * decl2.c (start_objects): Add new variable `joiner' and - initialize it properly. - -1998-10-09 Mark Mitchell - - * search.c (expand_upcast_fixups): Tweak to match 1998-10-07 - change to vtable types. - - * cvt.c (ocp_convert): Avoid infinite recursion caused by - 1998-10-03 change. - -1998-10-08 Jason Merrill - - * pt.c (resolve_overloaded_unification): New fn. - (try_one_overload): Likewise. - (unify): Don't fail on unknown type. - (type_unification_real): Likewise. Use resolve_overloaded_unification - to handle an overloaded argument. - (template_args_equal): Split out... - (comp_template_args): From here. - (determine_specialization): Also allow a template with more - parms than were explicitly specified. - * cp-tree.h: Add template_args_equal. - * call.c (resolve_args): Remove TEMPLATE_ID_EXPR code. - -Thu Oct 8 15:58:30 1998 Anthony Green - - * semantics.c (finish_asm_stmt): Revert my 1998-09-28 - change. - -Thu Oct 8 06:00:19 1998 Jeffrey A Law (law@cygnus.com) - - * typeck.c (unsigned_type): Only return TItype nodes when - HOST_BITS_PER_WIDE_INT is >= 64 bits. - (signed_type): Similarly. - * decl.c (intTI_type_node, unsigned_intTI_type_node): Only declare - when HOST_BITS_PER_WIDE_INT is >= 64 bits. - (init_decl_processing): Only create TItype nodes when - HOST_BITS_PER_WIDE_INT is >= 64 bits. - * cp-tree.h (intTI_type_node, unsigned_intTI_type_node): Only declare - when HOST_BITS_PER_WIDE_INT is >= 64 bits. - -Wed Oct 7 12:32:44 1998 Kaveh R. Ghazi - - * Makefile.in (hash.h): Add -L KR-C -F ', 0, 0' flags to gperf. - (gxx.gperf): Update comments describing invocation flags. - (hash.h): Regenerate using gperf 2.7.1 (19981006 egcs). - -1998-10-07 Mark Mitchell - - * class.c (finish_struct_1): Add commentary on prevous change. - - * cp-tree.h (vtbl_ptr_type_node): New variable. - * class.c (build_vtbl_ref): Don't indirect through the vptr; it's - already of the right type. - (finish_struct_1): Make the vptr be of type vtbl_ptr_type_node. - Simplify code to grow vtable. - * decl.c (vtbl_ptr_type_node): Define. - (init_decl_processing): Initialize it. - -1998-10-06 Mark Mitchell - - * cp-tree.def (PTRMEM_CST): New tree node. - * cp-tree.h (ptrmem_cst): New type. - (lang_type): Remove local_typedecls. - (dummy): Increase to 12 bits from 11. - (CLASSTYPE_LOCAL_TYPEDECLS): Remove. - (PTRMEM_CST_CLASS): New macro. - (PTRMEM_CST_MEMBER): Likewise. - (current_access_specifier): New variable. - (current_class_type): Remove duplicate declaration. - (finish_struct): Change prototype. - (unreverse_member_declarations): New function. - (pushdecl_class_level): Change prototype. - (grok_enum_decls): Remove. - (fixup_anonymous_union): New function. - (grok_x_components): Change prototype. - (tsubst_chain): Remove. - (finish_member_template_decl): Likewise. - (check_explicit_specialization): Fix indentation. - (finish_class_definition): Change prototype. - (finish_member_class_template): Likewise. - (finish_member_declaration): New function. - (check_multiple_declarators): Likewise. - * class.c (class_stack_node_t): New type. - (current_class_base): Remove. - (current_class_stack): Change type. - (current_access_specifier): New variable. - (grow_method): Remove. - (check_member_decl_is_same_in_complete_scope): Break out from - finish_struct. - (make_method_vec): New function. - (free_method_vec): Likewise. - (add_implicitly_declared_members): Break out from finish_struct_1. - (free_method_vecs): New variable. - (add_method): Rework for direct use from parser. - (handle_using_decl): Watch for NULL_TREE while iterating through - CLASSTYPE_METHOD_VEC. - (finish_struct_methods): Don't build CLASSTYPE_METHOD_VEC here; - just do some error-checking. - (warn_hidden): Change iteration through CLASSTYPE_METHOD_VEC. - (finish_struct_1): Simplify. Use add_implicitly_declared_members. - (finish_struct): Change prototype. Simplify; fields and methods - are already set up at this point. - (init_class_processing): Set up current_class_stack. - (pushclass): Save current_access_specifier. - (popclass): Restore it. - (currently_open_class): Simplify. - (build_self_reference): Remove use of CLASSTYPE_LOCAL_TYPEDECLS. - * decl.c (saved_scope): Add access_specifier. - (maybe_push_to_top_level): Save it. - (pop_from_top_level): Restore it. - (maybe_process_template_type_declaration): Use - finish_member_declaration. - (pushtag): Likewise. - (pushdecl_class_level): Don't return a value. - (fixup_anonymous_union): Break out from grok_x_components. - (shadow_tag): Use it. - (xref_tag): Complain about using an elaborated type specifier to - reference a template type parameter or typedef name. - (xref_basetypes): Don't set CLASSTYPE_LOCAL_TYPEDECLS. - (current_local_enum): Remove. - (build_enumerator): Call finish_member_declaration. - (grok_enum_decls): Remove. - * decl2.c (grok_x_components): Simplify. - (check_classfn): Change iteration through CLASSTYPE_METHOD_VEC. - (grokfield): Don't set CLASSTYPE_LOCAL_TYPEDECLS. - (merge_functions): Add to comment. - (arg_assoc_type): Prototype. - (arg_assoc): Pass as many arguments as there are parameters. - * error.c (dump_expr): Handle PTRMEM_CST. Improve handling of - OFFSET_REF. - * expr.c (cpls_expand_expr): Remove dead code. Handle - PTRMEM_CST. - * friend.c (do_friend): Lookup friends when in nested classes. - Change comments. - * init.c (build_offset_ref): Do lookup even for classes that are - only partially defined. - (decl_constant_value): Remove dead code. - * method.c (build_overload_value): Remove hack where by TYPE was - not a TYPE. Handle PTRMEM_CST. - (build_template_parm_names): Don't pass a PARM_DECL where a TYPE - should go. - * parse.y (components, notype_components, component_decl, - component_decl_1, component_declarator, component_declarator0): - Now all are itype rather than ttype. Rework to add members to - classes on the fly. - (typesqpecqual_reserved): Use check_multiple_declarators. - (structsp): Update class to finish_class_definition. - (do_xref_defn): Unsplit into named_class_head. - (access_specifier): Set current_access_specifier. - * pt.c (set_current_access_from_decl): New function. - (finish_member_template_decl): Don't take the parameters. - (comp_template_args): Make more robust. - (lookup_template_class): Don't use current_local_enum. - (for_each_template_parm): Handle PTRMEM_CST. - (instantiate_class_template): Use set_current_access_from_decl, - finish_member_declaration and unreverse_member_declarations. Set - lineno/input_filename before generating implicit member functions. - (type_unification_real): Don't assume back-unification happens - only for the last argument. - (regenerate_decl_from_template): Call pushclass a bit earlier. - (tsubst_chain): Remove. - (tsubst_enum): Use set_current_access_from_decl. - (set_mangled_name_for_template_decl): Fix indentation. - * search.c (lookup_fnfields_1): Change iteration through - CLASSTYPE_METHOD_VEC. - (dfs_pushdecls): Likewise. - (dfs_compress_decls): Likewise. - (add_conversions): Likewise. - * semantics.c (finish_class_definition): Don't take components. - Change call to finish_struct. - (finish_member_declaration): New function. - (finish_member_class_template): Don't take template parameters. - Change call to grok_x_components. Call finish_member_template_decl. - (check_multiple_declarators): New function. - * sig.c (append_signature_fields): Work from the TYPE_METHODS, not - a passed in fieldlist. - * tree.c (search_tree): Handle PTRMEM_CST. - (mapcar): Likewise. - * typeck.c (unary_complex_lvalue): Build PTRMEM_CSTs, not - INTEGER_CSTs, for pointer-to-data members. - - * call.c (resolve_args): Resolve template specializations, if - possible. - -Tue Oct 6 07:57:26 1998 Kaveh R. Ghazi - - * Makefile.in (spew.o): Depend on toplev.h. - - * call.c (compare_ics): Initialize variables `deref_from_type2', - `deref_to_type1' and `deref_to_type2'. - - * except.c (get_eh_type): Hide prototype and definition. - (process_start_catch_block_old): Remove unused static prototype. - - * pt.c (tsubst_decl): Initialize variable `argvec'. - - * spew.c: Include toplev.h. - -1998-10-05 Jason Merrill - - * pt.c (instantiate_decl): Do save and restore file position. - -1998-10-05 Martin von Löwis - - * method.c (build_decl_overload_real): Clear - numeric_output_need_bar after __. - -1998-10-05 Nathan Sidwell - - * call.c (build_new_method_call): Issue 'incomplete type' error, - if class is not defined. - -1998-10-05 Kaveh R. Ghazi - - * call.c (build_object_call): Move declaration of variable - `fn' into the scope where it is used. Don't access variable - `fn' when it is uninitialized, instead use `fns'. - -1998-10-04 Theodore Papadopoulo - - * errfn.c (cp_thing): Print buf as a string not as a printf format - to avoid problems with the operator%. Consequently, `%%' sequences - in format are copied as `%' in buf. - -1998-10-04 Jason Merrill - - * pt.c (pop_tinst_level): Call extract_interface_info. - (instantiate_decl): Don't save and restore file position. - - * decl.c (cp_finish_decl): Make statics in extern inlines and - templates common, if possible and the target doesn't support weak - symbols. - - * decl.c (grokdeclarator): Remove redundant calls to - build_type_variant and some duplicated code. - * sig.c (build_signature_reference_type): Only take the type parm. - (build_signature_pointer_type): Likewise. - * tree.c (build_cplus_method_type): Adjust. - * cp-tree.h: Update. - -1998-10-04 Mark Mitchell - - * call.c (build_over_call): Make pedwarns about dropped qualifiers - into full-fledged errors. - * cvt.c (convert_to_reference): Likewise. - * typeck.c (convert_for_assignment): Likewise. - - * search.c (expand_upcast_vtables): In addition to unsetting - TREE_READONLY, remove top-level const type qualifier. - -1998-10-03 Mark Mitchell - - * class.c (current_class_ptr, current_class_ref): Clarify - documentation. - * cvt.c (ocp_convert): Don't expect fold to remove all trivial - NOP type conversions. - * decl.c (decls_match): Use comptypes directly; ignore - qualifiers on the DECL. - (duplicate_decls): Remove qualifier checks on DECL. - (grokdeclarator): Make the type built up include top-level - qualifiers. - * decl2.c (do_dtors): Fix spelling error. - * error.c (dump_simple_decl): Don't look at qualifiers on the decl - when printing type information. - * init.c (build_new_1): Add documentation. Deal with the fact - that type of allocated memory now contains qualifiers. - * lex.c (is_global): Improve error-recovery. - * sig.c (build_member_function_pointer): Don't cast away const - on fields of sigtable_entry_type. - * tree.c (lvalue_type): Don't look at top-level qualifiers on - expressions. - * typeck.c (decay_conversion): Likewise. - (build_component_ref): Make sure the type of the COMPONENT_REF - contains top-level qualifiers, as appropriate. Improve - error-handling. - (build_indirect_ref): Simplify. Don't strip top-level qualifiers. - (build_array_ref): Likewise. - (build_unary_op): Improve error-recovery. - (unary_complex_lvalue): Make taking the address a bound member - function an error, not a sorry. - (build_conditional_expr): Look at the type qualifiers, not the - qualifiers on the expression itself. - -1998-10-03 Jason Merrill - - * decl2.c (merge_functions): Remove duplicates. - - * decl2.c: Add -f{no-,}implicit-inline-templates. - (import_export_decl): Check it. - - * decl.c (lookup_name_real): Template parms also take precedence - over implicit typename. Only warn if yylex. - - * typeck.c (build_conditional_expr): Only fold if ifexp is an - INTEGER_CST. - - * decl2.c (finish_vtable_vardecl): Check DECL_INTERFACE_KNOWN - instead of linkage. - -1998-10-01 Jason Merrill - - * cp-tree.h (FORMAT_VBASE_NAME): New macro. - * class.c (build_vbase_pointer): Use it. - * rtti.c (expand_class_desc): Likewise. - * tree.c (build_vbase_pointer_fields): Likewise. - -Thu Oct 1 10:43:45 1998 Nick Clifton - - * decl.c (start_decl): Add invocation of - SET_DEFAULT_DECL_ATTRIBUTES, if defined. - (start_function): Add invocation of - SET_DEFAULT_DECL_ATTRIBUTES, if defined. - - * lex.c: Replace occurances of HANDLE_SYSV_PRAGMA with - HANDLE_GENERIC_PRAGMAS. - -1998-09-28 Anthony Green - - * semantics.c (finish_asm_stmt): Always permit volatile asms. - -1998-09-28 Mark Mitchell - - * decl.c (grokdeclarator): Tighten checks for invalid - destructors. Improve error-messages and error-recovery. - * decl2.c (check_classfn): Don't assume that mangled destructor - names contain type information. - -1998-09-25 Jason Merrill - - * search.c (get_base_distance): Remove assert. - - * decl2.c (build_anon_union_vars): Don't process a field with no - name. - (finish_anon_union): Also complain about local anon unions with no - members. - -1998-09-25 Martin von Löwis - - * decl.c (lookup_namespace_name): If the name is a namespace, - return it immediately. - -Fri Sep 25 11:45:38 1998 Kaveh R. Ghazi - - * cp-tree.h (define_case_label): Remove unused parameter. - (check_java_method): Likewise. - (grokclassfn): Likewise. - (expand_aggr_init): Likewise. - (build_x_delete): Likewise. - (maybe_end_member_template_processing): Likewise. - (unshare_base_binfos): Add prototype. - (string_conv_p): Likewise. - (my_friendly_abort): Mark with ATTRIBUTE_NORETURN. - - * cvt.c (build_up_reference): Remove unused parameter - `checkconst', all callers changed. - (build_type_conversion): Mark parameter `code' with - ATTRIBUTE_UNUSED. - (build_expr_type_conversion): Initialize variable `conv'. - - * decl.c (push_namespace): Initialize variable `d'. - (define_case_label): Remove unused parameter `decl', all callers - changed. - - * decl2.c (lang_decode_option): If !USE_CPPLIB, mark parameter - `argc' with ATTRIBUTE_UNUSED. - (grokclassfn): Remove unused parameter `cname', all callers - changed. - (check_java_method): Likewise for parameter `ctype'. - (copy_assignment_arg_p): Mark parameter `virtualp' with - ATTRIBUTE_UNUSED. - (finish_prevtable_vardecl): Likewise for parameter `prev'. - - * expr.c (extract_init): Likewise for parameters `decl' and `init'. - - * init.c (expand_aggr_init_1): Remove unused parameter - `alias_this', all callers changed. - (expand_aggr_init): Likewise. - (expand_default_init): Likewise. - (build_new_1): Initialize variable `susp'. - (build_x_delete): Remove unused parameter `type', all callers - changed. - - * lex.c (set_typedecl_interface_info): Mark parameter `prev' with - ATTRIBUTE_UNUSED. - (readescape): Use (unsigned) value in shift. - (real_yylex): Likewise. Likewise. Also cast `sizeof' to int when - comparing to a signed quantity. - - * pt.c (maybe_end_member_template_processing): Remove unused - parameter `decl', all callers changed. - (check_explicit_specialization): Add braces around empty body in - an else-statement. - (current_template_args): Initialize variable `args'. - (lookup_template_class): Likewise for variable `prev_local_enum'. - (tsubst_decl): Likewise for variable `r'. - (set_mangled_name_for_template_decl): Initialize variable - `context'. - - * spew.c (scan_tokens): Change type of parameter `n' to unsigned. - Likewise for variable `i'. - (yylex): Initialize variable `trrr'. - - * typeck.c (compparms): Mark variable `strict' with - ATTRIBUTE_UNUSED. - - * xref.c (simplify_type): Cast argument of ctype function to - `unsigned char'. - -1998-09-24 Mark Mitchell - - * cp-tree.h (language_lvalue_valid): Remove. - * decl.c (grokdeclarator): Don't disallow references to functions. - * tree.c (lvalue_p_1): New function, combining duplicated - code from ... - (lvalue_p): Use it. - (real_lvalue_p): Likewise. - * typeck.c (language_lvalue_valid): Remove. - (build_modify_expr): Treat FUNCTION_TYPEs as readonly, even though - they don't have TREE_READONLY set. - * typeck2.c (readonly_error): Add case for FUNCTION_DECLs. - -1998-09-24 Benjamin Kosnik - - * spew.c (yylex): Give diagnostic. - * hash.h (is_reserved_word): Add export. - * gxx.gperf: Ditto. - * lex.h (rid): Add RID_EXPORT. - * lex.c (init_parse): Ditto. - -Tue Sep 22 21:01:19 1998 Gerald Pfeifer - - * friend.c (do_friend): Make warning a full sentence. - -1998-09-22 Mark Mitchell - - * parse.y (component_decl_list): Improve error-recovery. - -1998-09-22 Benjamin Kosnik - - * decl.c (make_typename_type): Move error to point where name - variable can be used by dump_type. - -1998-09-22 Mark Mitchell - - * decl.c (grokfndecl): Improve error-recovery. - * decl2.c (grokfield): Likewise. - * pt.c (finish_member_template_decl): Likewise. - -1998-09-20 Martin von Löwis - - * method.c (hack_identifier): Finding multiple members is always - an error. - -1998-09-21 Per Bothner - - * Make-lang.in (c++-filt): Link libiberty.a after cxxmain.o. - -Mon Sep 21 01:53:05 1998 Felix Lee - - * lex.c (init_lex): Use getenv ("LANG"), not GET_ENVIRONMENT (). - -1998-09-20 Mark Mitchell - - * class.c (maybe_warn_about_overly_private_class): Reformat. - -1998-09-17 Andrew MacLeod - - * exception.cc (__cplus_type_matcher): realign some code. - -1998-09-16 Mark Mitchell - - * Make-lang.in (tinfo.o): Use CXXFLAGS when compiling. - (tinfo2.o): Likewise. - (exception.o): Likewise. - (new.o): Likewise. - (opnew.o): Likewise. - (opnewnt.o): Likewise. - (opvnew.o): Likewise. - (opvnewnt.o): Likewise. - (opdel.o): Likewise. - (opdelnt.o): Likewise. - (opvdel.o): Likewise. - (opvdelnt.o): Likewise. - -1998-09-16 Richard Henderson - - * decl.c (init_decl_processing): Kill __builtin_fp and __builtin_sp. - -1998-09-15 Alexandre Oliva - - * call.c (build_field_call): handle static data members too - - * typeck.c (comptypes): when comparing pointer types, check - whether referred types match even in strictest modes - -1998-09-15 Mark Mitchell - - * cp-tree.h: Revert previous change. - (finish_struct_methods): Remove declaration. - * class.c: Revert previous change. - (maybe_warn_about_overly_private_class): New function. - (finish_struct_methods): Declare here, and make static. Remove - unnecessary parameters. Tidy slightly. Use - maybe_warn_about_overly_private_class. - (finish_struct_1): Adjust. Remove check for private constructors, - now done elsewhere. - (finish_struct): Adjust. - -1998-09-15 Andrew MacLeod - - * except.c (expand_start_catch_block): No need to check for new - exception model. - (process_start_catch_block_old): Deleted. - (process_start_catch_block): Add call to start_decl_1(). - (expand_end_catch_block): Add call to end_catch_handler(). - * exception.cc (__cplus_type_matcher): Only check the exception - language if there is an exception table. - -1998-09-15 Andrew MacLeod - - * search.c (expand_indirect_vtbls_init): Mark temporary stack slots - as used to prevent conflicts with virtual function tables. - -1998-09-14 Mark Mitchell - - * cp-tree.h (lang_type): Add has_non_private_static_mem_fn. - (CLASSTYPE_HAS_NON_PRIVATE_STATIC_MEM_FN): New macro, to access it. - * class.c (maybe_class_too_private_p): New function. - (finish_struct_methods): Use it. - (finish_struct_1): Likewise. - (finish_struct): Set CLASSTYPE_HAS_NON_PRIVATE_STATIC_MEM_FN if - appropriate. - - * pt.c (check_specialization_scope): Fix spelling error. - (check_explicit_specialization): Remove code to handle explicit - specializations in class scope; they are now correctly diagnosed - as errors. - -1998-09-10 Mark Mitchell - - * decl.c (pushdecl): Don't copy types if the - DECL_ABSTRACT_ORIGIN of the new decl matches the TYPE_NAME of the - type. - -1998-09-09 Kriang Lerdsuwanakij - - * class.c (get_enclosing_class): New function. - (is_base_of_enclosing_class): Likewise. - * cp-tree.h (get_enclosing_class): Declare. - (is_base_of_enclosing_class): Likewise. - * pt.c (coerce_template_parms): Use them. - -1998-09-09 Jason Merrill - - * g++spec.c (lang_specific_driver): Check whether MATH_LIBRARY is - null to decide whether to use it. - - * error.c (dump_type_real): Handle NAMESPACE_DECL. - * parse.y (base_class.1): Avoid crash on error. - -1998-09-08 Martin von Löwis - - * decl.c (make_typename_type): If context is a namespace, the code - is in error. - -1998-09-08 Mumit Khan - - * parse.y (nomods_initdcl0): Set up the parser stack correctly. - -1998-09-08 Mark Mitchell - - * cp-tree.h (anonymous_namespace_name): Declare. - * decl.c: Define it. - (push_namespace): Use anonymous_namespace_name, rather than local - static anon_name. - * error.c (dump_decl): If a namespace is named - anonymous_namespace_name, call it {anonymous}. - - * decl.c (grokparms): Distinguish between references and pointers - in error message. - -1998-09-08 Richard Henderson - Mark Mitchell - - * pt.c (process_partial_specialization): Consistantly allocate - and zero tpd.parms based on ntparms. Use tpd2.parms, not - tpd.parms, where appropriate. - -Sun Sep 6 00:00:51 1998 Jeffrey A Law (law@cygnus.com) - - * Makefile.in (INCLUDES): Update after recent toplevel gcc - reorganizations. - -1998-09-05 Mark Mitchell - - * cp-tree.h (TI_PENDING_SPECIALIZATION_FLAG): Remove. - * class.c (finish_struct): Remove hackery to deal with explicit - specializations in class scope. - * decl.c (grokfndecl): Improve error-recovery. - * decl2.c (grokfield): Likewise. - * pt.c (check_specialization_scope): New function. - (begin_specialization): Call it. - (process_partial_specialization): New function, split out from - push_template_decl. Check partial specializations more - stringently. - (push_template_decl): Call it. - (check_explicit_specialization): Don't attempt to handle explicit - specializations in class scope. - (template_parm_data): Document. Add current_arg and - arg_uses_template_parms. - (mark_template_parm): Set it. - (tsubst_arg_types): Remove unused variable. - * semantics.c (begin_class_definition): Tweak. - -1998-09-04 Mark Mitchell - - * inc/typeinfo (type_info::type_info(const char*)): Make - `explicit'. - - * cp-tree.h (hash_tree_cons_simple): New macro. - * pt.c (tsubst_arg_types): New function. Use hash_tree_cons. - (coerce_template_parms): Use make_temp_vec, instead of - make_tree_vec. Document this behavior. - (lookup_template_class): Likewise. - (tsubst, cases METHOD_TYPE, FUNCTION_TYPE): Use tsubst_arg_types. - Remove dead code (and add ssertion to check its deadness). Fix - bug w.r.t. exception specifications. - -1998-09-03 Jason Merrill - - * decl2.c (import_export_vtable): Always make artificials comdat. - (import_export_decl): Likewise. - * pt.c (mark_decl_instantiated): Likewise. - -1998-09-03 Mark Mitchell - - * cp-tree.h (finish_globally_qualified_member_call_expr): - Rename to ... - (finish_qualified_call_expr). - * semantics.c: Likewise. - * parse.y (primary): Use it. - * method.c (hack_identifier): Remove redundant code. - - * init.c (resolve_offset_ref): Call convert_from_reference to - handle members of reference type. Improve error recovery. - -1998-09-03 Benjamin Kosnik - - * cp-tree.h: Declare warn_nontemplate_friend. - * decl2.c (lang_decode_option): Set. - * lang-options.h: Add -Wnon-template-friend. - * friend.c (do_friend): Use to toggle non-template function warning. - -1998-09-03 Mark Mitchell - - * decl.c (finish_enum): Don't resolve CONST_DECLs to their - corresponding INTEGER_CSTs when processing_template_decl. - * pt.c (tsubst_enum): Tweak accordingly. - -1998-09-03 Benjamin Kosnik - - * decl.c (pushdecl_class_level): Add warning here. - (pushdecl): Tweak. - -1998-09-02 Jason Merrill - - * cvt.c (convert_pointer_to_real): Tidy. - * search.c (get_base_distance_recursive): Simplify. - (get_base_distance): Likewise. - - * pt.c (unify): Only special-case INTEGER_TYPE if it uses template - parms. - -Wed Sep 02 09:25:29 1998 Nick Clifton - - * lex.c (check_newline): Call HANDLE_PRAGMA before - HANDLE_SYSV_PRAGMA if both are defined. Generate warning messages - if unknown pragmas are encountered. - (handle_sysv_pragma): Interpret return code from - handle_pragma_token (). Return success/failure indication rather - than next unprocessed character. - (pragma_getc): New function: retrieves characters from the - input stream. Defined when HANDLE_PRAGMA is defined. - (pragma_ungetc): New function: replaces characters back into the - input stream. Defined when HANDLE_PRAGMA is defined. - -1998-09-01 Jason Merrill - - * decl2.c (output_vtable_inherit): Use %cDIGIT in the operands. - * class.c (build_vtable_entry_ref): Likewise. - -1998-09-01 Mark Mitchell - - * cp-tree.h (DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION): New macro. - * decl2.c (import_export_decl): Likewise. - * pt.c (instantiate_decl): Use it. - -1998-09-01 Jason Merrill - - * decl.c (lookup_name_real): Also do implicit typename thing for - artificial TYPE_DECLs. - * search.c (lookup_field): Likewise. - (lookup_fnfields, lookup_field): Adjust for implicit typename kludge. - * semantics.c (begin_constructor_declarator): Use enter_scope_of. - (enter_scope_of): Extract type from implicit typename. - (begin_class_definition): Likewise. - * lex.c (identifier_type): Handle implicit typename when checking - for SELFNAME. - - * cp-tree.h: Declare flag_strict_prototype. - * lex.c (do_scoped_id, do_identifier): Don't implicitly_declare if - -fstrict-prototype. - * decl.c (init_decl_processing): If -f{no,-}strict-prototype wasn't - specified, set it to the value of pedantic. - -1998-09-01 Mark Mitchell - - * decl2.c (arg_assoc): Handle template-id expressions as arguments. - -1998-08-31 Mark Mitchell - - * decl.c (finish_enum): Handle member enums of classes declared in - template functions. - - * decl2.c (grok_x_components): Strip attributres before calling - groktypename. - -1998-08-31 Jason Merrill - - * cp-tree.h, decl2.c: Remove support for -fall-virtual, - -fenum-int-equivalence and -fno-nonnull-objects. - * class.c (check_for_override): Remove support for -fall-virtual. - (finish_struct_1): Likewise. - * call.c (build_new_op): Remove support for -fenum-int-equivalence. - * typeck.c (build_binary_op_nodefault): Likewise. - * cvt.c (ocp_convert): Likewise. - * call.c (build_vfield_ref): Remove support for -fno-nonnull-objects. - * class.c (build_vbase_path): Likewise. - -Sun Aug 30 22:16:31 1998 H.J. Lu (hjl@gnu.org) - - * Makefile.in (INTERFACE): New, set to 1. - -1998-08-30 Mark Mitchell - - * error.c (dump_decl): Use CP_DECL_CONTEXT, not DECL_CONTEXT, when - comparing with global_namespace. - (dump_aggr_type): Likewise. - - * decl.c (grokfndecl): Issue error on declaration of friend - templates with explicit template arguments. - - * pt.c (convert_template_argument): New function, split out - from... - (coerce_template_parms): Here. - (tsubst): Attempt better error-recovery. - -1998-08-28 Benjamin Kosnik - - * pt.c (decl_template_parm_p): Add checks for - TEMPLATE_TEMPLATE_PARM. - -1998-08-28 Mark Mitchell - - * lex.c (do_identifier): Fix thinko in previous change. - -1998-08-28 Jason Merrill - - * search.c (dfs_search, binfo_for_vtable, dfs_bfv_helper): New fns. - * decl2.c (output_vtable_inherit): Call binfo_for_vtable. - -1998-08-28 Richard Henderson - - Add support for discarding unused virtual functions. - * lang-options.h: Add -fvtable-gc. - * cp-tree.h: Add flag_vtable_gc. - * decl2.c (output_vtable_inherit): New fn. - (finish_vtable_vardecl): Call it. - * class.c (build_vtable_entry_ref): New fn. - (build_vtbl_ref): Call it. - -1998-08-28 Mark Mitchell - - * cp-tree.h (build_enumerator): Take the enumeration type as a - paramter. - * decl.c (finish_enum): Don't set the TREE_TYPE for the - enumeration constant values if we're processing_template_decls. - Don't set the type for the CONST_DECLs either; that's done in - build_enumerator. - (build_enumerator): Take the enumeration type as a - parameter. - * lex.c (do_identifier): Don't resolve enumeration constants while - processing template declarations, even if they happen to be - TEMPLATE_PARM_INDEXs. - - * parse.y (current_enum_type): New variable. - (primary): Don't allow statement-expression in local classes just - as we don't in global classes. - (structsp): Use current_enum_type. - (enum_list): Likewise. - * pt.c (tsubst_enum): Don't check for NOP_EXPRs introduced by - finish_enum; they no longer occur. - - * cp-tree.h (finish_base_specifier): New function. - * parse.y (base_class): Use it. - * semantics.c (finish_base_specifier): Define it. - - * parse.y (structsp): Warn on use of typename outside of template - declarations. - -1998-08-27 Jason Merrill - - * lex.c (handle_cp_pragma): Remove #pragma vtable. - * lang-options.h: Remove +e options. - * decl2.c (lang_decode_option): Likewise. - (import_export_vtable): Don't check write_virtuals. - (finish_vtable_vardecl, finish_file): Likewise. - * search.c (dfs_debug_mark): Likewise. - * semantics.c (begin_class_definition): Likewise. - * class.c (build_vtable, finish_vtbls, finish_struct_1): Likewise. - - * call.c (build_over_call): Check flag_elide_constructors. - * decl2.c: flag_elide_constructors defaults to 1. - * typeck.c (convert_arguments): Remove return_loc parm. - (build_function_call_real): Adjust. - - * search.c: Tear out all mi_matrix and memoize code. - (lookup_field, lookup_fnfields): Use scratch_tree_cons. - * lang-options.h: Remove documentation for -fhandle-exceptions, - -fmemoize-lookups and -fsave-memoized. - * cp-tree.h: Lose mi_matrix and memoize support. - * decl2.c: Ignore -fmemoize-lookups and -fsave-memoized. - * class.c: Lose struct class_level. - (pushclass, popclass): Lose memoize support. - * init.c (build_offset_ref): Likewise. - - Never change BINFO_INHERITANCE_CHAIN. - * init.c (emit_base_init): Change modification of - BINFO_INHERITANCE_CHAIN to an assert. - * search.c (get_base_distance_recursive): Likewise. - (get_base_distance): Likewise. - (lookup_member): Likewise. - (convert_pointer_to_single_level): Likewise. - (lookup_field): Likewise. Lose setting TREE_VIA_* on TREE_LISTs. - (lookup_fnfields): Likewise. - * tree.c (propagate_binfo_offsets): Don't call unshare_base_binfos. - (unshare_base_binfos): Don't call propagate_binfo_offsets. - (layout_basetypes): Call propagate_binfo_offsets instead of - unshare_base_binfos. - * decl.c (xref_basetypes): Call unshare_base_binfos. - * pt.c (instantiate_class_template): Likewise. - * tree.c (reverse_path): Remove 'copy' parm; always make a - temporary copy. - * class.c (build_vbase_path): Just call it. - * search.c (compute_access): Likewise. Don't re-reverse. - -1998-08-27 Mark Mitchell - - * class.c (build_vbase_path): Use reverse_path. - (finish_base_struct): Move warnings for inaccessible bases to - layout_basetypes. - (modify_one_vtable): Remove check of TREE_USED (binfo). - (fixup_vtable_deltas1): Likewise. - * cp-tree.h (BINFO_INHERITANCE_CHAIN): Document here. - (xref_tag): Remove binfos parameter. - (make_binfo): Remove chain parameter. - (reverse_path): Add copy parameter. - * decl.c (init_decl_processing): Change calls to xref_tag. - (xref_tag): Remove binfos parameter. - (xref_basetypes): Change calls to make_binfo. - * decl2.c (grok_x_components): Change calls to xref_tag. - (handle_class_head): Likewise. - * friend.c (do_friend): Likewise. - * lex.c (make_lang_type): Change calls to make_binfo. - * parse.y (structsp): Change calls to xref_tag. - (named_complex_class_head_sans_basetype): Likewise. - (named_class_head): Likewise. - * rtti.c (init_rtti_processing): Likewise. - * search.c (compute_access): Change calls to reverse_path. - (dfs_get_vbase_types): Change calls to make_binfo. - (get_vbase_types): Remove dead code. - * tree.c (unshare_base_binfos): Change calls to make_binfo. - (layout_basetypes): Warn here about inaccessible bases. - (make_binfo): Remove chain parameter. - (reverse_path): Add copy parameter. - -1998-08-27 Jason Merrill - - * class.c: #if 0 complete_type_p. - * init.c (build_java_class_ref, build_new_1): Remove unused locals. - * method.c (process_overload_item): Likewise. - * typeck.c (comp_target_types): Likewise. - - Stop sharing binfos for indirect virtual bases. - * tree.c (propagate_binfo_offsets): Unshare vbases, too. - (layout_basetypes): Likewise. - (unshare_base_binfos): Copy vbases, too. - * cp-tree.h (BINFO_VIA_PUBLIC, BINFO_BASEINIT_MARKED, - BINFO_VBASE_INIT_MARKED): Remove obsolete macros. - (BINFO_PUSHDECLS_MARKED, SET_BINFO_PUSHDECLS_MARKED, - CLEAR_BINFO_PUSHDECLS_MARKED): New macros. - * search.c (lookup_field, lookup_fnfields, lookup_member): Remove - reference to BINFO_VIA_PUBLIC. - (marked_pushdecls_p, unmarked_pushdecls_p): New fns. - (push_class_decls): Use them. - (dfs_pushdecls): Use SET_BINFO_PUSHDECLS_MARKED. - (dfs_compress_decls): Use CLEAR_BINFO_PUSHDECLS_MARKED. - -1998-08-27 Mark Mitchell - - * decl.c (build_enumerator): Set DECL_CONTEXT for the - CONST_DECLs. - -1998-08-26 Mark Mitchell - - * cp-tree.h (finish_enum): Change prototype. - * decl.c (finish_enum): Use TYPE_VALUES, rather than taking a - VALUES parameter. Don't try to compute mins/maxs if - processing_template_decl. - * parse.y (structsp): Use new calling sequence for finish_enum. - * pt.c (tsubst_enum): Likewise. Take the new type as input. - (lookup_template_class): Remove unused variables. Tweak. - Register enums on instantiation list before substituting - enumeration constants. - (tsubst_decl): Remove unused variables. - (regenerate_decl_from_template): Likewise. - - * decl.c (duplicate_decls): Don't obliterate the - DECL_TEMPLATE_INFO for a template if we're not replacing it with - anything. - - * lex.c (do_identifier): Fix typo in comment. - -Wed Aug 26 10:54:51 1998 Kaveh R. Ghazi - - * errfn.c: Remove stdarg.h/varargs.h. - * tree.c: Likewise. - -1998-08-25 Brendan Kehoe - - * pt.c (tsubst_copy): Only do typename overloading on an - IDENTIFIER_NODE that happens to look like a typename if it actually - has a type for us to use. - -1998-08-25 Jason Merrill - - * typeck.c (comp_cv_target_types): Split out... - (comp_target_types): From here. Don't allow cv-qual changes under - a pointer if nptrs == 0. Fix OFFSET_TYPE handling. - (build_ptrmemfunc): Pass 1 to nptrs. - * cvt.c (perform_qualification_conversions): Use comp_ptr_ttypes. - -1998-08-25 Mark Mitchell - - * search.c (dependent_base_p): Don't compare a binfo to - current_class_type; use the TREE_TYPE of the binfo instead. - - * cp-tree.h (CLASS_TYPE_P): Revise definition. - -1998-08-25 Jason Merrill - - * decl.c (duplicate_decls): Don't complain about different - exceptions from an internal decl even if pedantic. - - * typeck.c (convert_for_assignment): Converting from pm of vbase - to derived is an error, not a sorry. - - * call.c (build_over_call): Use convert_pointer_to_real for 'this'. - * class.c (fixed_type_or_null): Rename from - resolves_to_fixed_type_p. Return the dynamic type of the - expression, if fixed, or null. - (resolves_to_fixed_type_p): Use it. Return 0 if the dynamic type - does not match the static type. - (build_vbase_path): Rename 'alias_this' to 'nonnull'. Use - resolves_to_fixed_type_p again. - -1998-08-24 Mark Mitchell - - * pt.c (tsubst_decl): Move special case code for dealing with - tricky friend templates here from ... - (regenerate_decl_from_template): Here. - -1998-08-24 Jason Merrill - - * decl.c (start_decl): Remove redundant linkage check. - -1998-08-24 Gavin Romig-Koch - - * typeck.c (c_expand_return): Handle the case that valtype - is wider than the functions return type. - -1998-08-24 Mark Mitchell - - * cp-tree.h (CLASS_TYPE_P): New macro. - * decl.c (grokdeclarator): Use it instead of IS_AGGR_TYPE. - * pt.c (process_template_parm): Undo previous change. - -1998-08-24 Benjamin Kosnik - - * cp-tree.h: Declare. - * pt.c (decl_template_parm_p): New function. - * decl.c (pushdecl): Check decls for redeclaring template parms. - (xref_tag): Make redeclaration an error, print decl. - * decl2.c (grokfield): Check field_decls for redeclaration as well. - -1998-08-24 Jason Merrill - - * parse.y (primary): Fix up the type of string constants. - -1998-08-24 Mark Mitchell - - * typeck.c (convert_for_initialization): Move check for odd uses - of NULL to avoid duplicate warnings. - -1998-08-24 Jason Merrill - - * tree.c (lvalue_type): Fix for arrays. - * typeck.c (string_conv_p): New fn. - (convert_for_assignment): Use it. - (build_unary_op): Use lvalue_type. - * call.c (standard_conversion, convert_like): Use string_conv_p. - (add_function_candidate): Use lvalue_type. - * cvt.c (convert_to_reference): Likewise. - * decl2.c (lang_decode_option): Ignore -traditional. - * decl.c (init_decl_processing): flag_writable_strings inhibits - flag_const_strings. - -1998-08-24 Andrew MacLeod - - * lang-options.h (lang_options): Add fconst-strings to the list - of valid options. - * decl2.c (lang_f_options, lang_decode_option): Likewise. - -1998-08-24 Nathan Sidwell - - * lex.c (real_yylex): Don't warn about long long constants if - we're allowing long long. - -1998-08-24 Martin von Löwis - - * decl.c (pushdecl): Use IDENTIFIER_NAMESPACE_VALUE instead of - accessing bindings directly. - - * search.c (my_tree_cons): Reimplement. - - * lang-specs.h: Remove __HONOR_STD. - * inc/exception, inc/new, inc/new.h, inc/typeinfo: Likewise. - -1998-08-23 Mark Mitchell - - * decl.c (grokdeclarator): Complain about in-class initialization - of aggregates and/or references. - * pt.c (process_template_parm): Clear IS_AGGR_TYPE for - TEMPLATE_TYPE_PARMs. - - * decl2.c (grok_array_decl): Add comment. - (mark_used): Don't instantiate an explicit instantiation. - * friend.c (make_friend_class): Remove bogus comment. Fix check - for partial specializations. - * pt.c (check_explicit_specialization): Don't - SET_DECL_EXPLICIT_INSTANTIATION here. - (mark_decl_instantiated): Or here. - (do_decl_instantiation): Do it here, instead. Add checks for - duplicate explicit instantiations, etc. Tidy. - (do_type_instantiation): Likewise. - (instantiate_decl): Improve comments. Complain about explicit - instantiations where no definition is available. - - * cp-tree.h (ansi_null_node): Remove. - * call.c (build_over_call): Warn about converting NULL to an - arithmetic type. - * cvt.c (build_expr_type_conversion): Likewise. Use - null_ptr_cst_p instead of expanding it inline. - * decl.c (ansi_null_node): Remove. - (init_decl_processing): Make null_node always have integral type. - * except.c (build_throw): Warn about converting NULL to an - arithmetic type. - * lex.c (init_parse): Remove handling of ansi_null_node. - * pt.c (type_unification_real): Don't convert NULL to void* type. - * typeck.c (build_binary_op_nodefault): Fix NULL warnings. - (convert_for_assignment): Warn about converting NULL to an - arithmetic type. - (convert_for_initialization): Likewise. - -1998-08-20 Jason Merrill - - * tree.c (search_tree, no_linkage_helper, no_linkage_check): New fn. - * pt.c (coerce_template_parms): Use no_linkage_check. - * decl.c (grokvardecl): Likewise. - (grokfndecl): Likewise. Members of anonymous types have no linkage. - - * method.c (process_overload_item): Remove useless code. - -1998-08-20 Per Bothner - - Handle new'ing of Java classes. - * init.c (build_class_classref): New function. - (build_new_1): If type is TYPE_FOR_JAVA: Call _Jv_AllocObject; - constructor does not return this; don't need to exception-protect. - - * pt.c (lookup_template_class): Copy TYPE_FOR_JAVA flag. - * decl2.c (acceptable_java_type): Handle template-derived types. - -1998-08-20 Per Bothner - - * decl2.c (import_export_vtable): Suppress vtables for Java classes. - -1998-08-20 Mark Mitchell - - * decl.c (duplicate_decls): Always merge the old and new patterns - for templates, regardless of whether or not the new one has - DECL_INITIAL. Don't throw away specializations. Merge - DECL_SAVED_TREE. - * pt.c (tsubst_decl): Use the right pattern when calculating the - complete args for a new template instance. - (do_decl_instantiation): Fix typo in comment. - (regenerate_decl_from_template): Deal with tricky friend template - case. - (instantiate_decl): Likewise. - -Thu Aug 20 09:09:45 1998 Jeffrey A Law (law@cygnus.com) - - * init.c (build_builtin_delete_call): Add missing assemble_external - call. - -1998-08-20 Jason Merrill - - * parse.y (notype_unqualified_id): Also accept ~A. - -1998-08-19 Mark Mitchell - - * typeck.c (build_binary_op_nodefault): Warn on use of NULL in - arithmetic. - * except.c (build_throw): Warn when NULL is thrown, even with - -ansi. Use ansi_null_node, rather than integer_zero_node, in the - thrown expression. - - * cp-tree.h (ansi_null_node): New variable. - * decl.c (ansi_null_node): New variable. - (init_decl_processing): Initialize its type. - * lex.c (init_parse): Initialize its value. Use ansi_null_node - for null_node in non-ANSI mode. - * typeck.c (build_binary_op_nodefault): Use ansi_null_node in - place of null_node to avoid spurious errors. - -1998-08-17 Mark Mitchell - - * cp-tree.h (enter_scope_of): New function. - * parse.y (complex_direct_notype_declarator): Use it. - * semantics.c (enter_scope_of): New function. - -1998-08-17 Jason Merrill - - * decl.c (grokparms): No, here. - - * decl.c (grokdeclarator): Catch parm with pointer to array of - unknown bound here... - * method.c (process_overload_item): ...not here. - - * gxxint.texi: Remove obsolete documentation of overloading code. - - * decl.c (finish_enum): Also set TYPE_SIZE_UNIT. - * class.c (finish_struct_bits): Likewise. - - * tree.c (lvalue_type): Fix for arrays. - * typeck.c (build_unary_op): Use lvalue_type. - * call.c (add_function_candidate): Likewise. - * cvt.c (convert_to_reference): Likewise. - - * decl2.c (lang_decode_option): Ignore -traditional. - - * init.c (build_offset_ref): Don't mess with error_mark_node. - * lex.c (do_scoped_id): Use cp_error. - - * rtti.c (get_tinfo_fn): Don't mess with the context for now. - -1998-08-17 Benjamin Kosnik - - * decl.c (grokdeclarator): Allow anonymous types to be cv-qualified. - -Mon Aug 17 10:40:18 1998 Jeffrey A Law (law@cygnus.com) - - * cp-tree.h (set_identifier_local_value): Provide prototype. - - * decl2.c (do_namespace_alias): Remove unused variables `binding' - and `old'. - -Fri Aug 14 16:42:27 1998 Nick Clifton - - * Makefile.in: Rename BBISON to BISON so that it can be properly - inherited from the parent makefile. - -1998-08-13 Jason Merrill - - * lang-options.h: Add -finit-priority. - * decl2.c: Likewise. Check flag_init_priority instead of - USE_INIT_PRIORITY. - - * decl2.c (setup_initp): New fn. - (start_objects, finish_objects, do_ctors): Handle init_priority. - (do_dtors, finish_file): Likewise. - -1998-08-13 Jason Merrill - - * pt.c (tsubst_copy): Hush warning. - - * rtti.c (get_tinfo_fn): Also set DECL_IGNORED_P. - -1998-08-12 Mark Mitchell - - * pt.c (print_template_context): Don't abort when instantiating a - synthesized method. - - * decl.c (grokdeclarator): Issue errors on namespace qualified - declarators in parameter lists or in class scope. - -1998-08-09 Mark Mitchell - - * pt.c (check_explicit_specialization): Don't abort on bogus - explicit instantiations. - -1998-08-07 Mark Mitchell - - * typeck.c (require_complete_type): Use complete_type_or_else. - (complete_type_or_else): Always return NULL_TREE on failure, as - documented. - - * pt.c (tsubst_aggr_type): Prototype. - (tsubst_decl): New function, split out from tsubst. Set - input_filename and lineno as appropriate. - (pop_tinst_level): Restore the file and line number saved in - push_tinst_level. - (instantiate_class_template): Set input_filename and lineno as - appropriate. - (tsubst): Move _DECL processing to tsubst_decl. Make sure the - context for a TYPENAME_TYPE is complete. - - * decl2.c (grokbitfield): Issue errors on bitfields declared with - function type. - (do_dtors): As in do_ctors, pretend to be a member of the same - class as a static data member while generating a call to its - destructor. - - * cvt.c (cp_convert_to_pointer): Handle NULL pointer - conversions, even in complex virtual base class hierarchies. - -1998-08-06 Mark Mitchell - - * cp-tree.h (ENUM_TEMPLATE_INFO): New macro. - (TYPE_TEMPLATE_INFO): Likewise. - (SET_TYPE_TEMPLATE_INFO): Likewise. - (ENUM_TI_TEMPLATE): Likewise. - (ENUM_TI_ARGS): Likewise. - (lookup_nested_type_by_name): Remove. - * decl.c (maybe_process_template_type_declaration): Handle enums. - (start_enum): Don't check for primary-template enum declarations - here. - (finish_enum): Clean up, document. Make sure template enum - constants get the correct type. - (build_enumerator): Copy initializers for template enumerations, - too. - (grok_enum_decls): Document. - * lex.c (do_identifier): Document use of LOOKUP_EXPR a bit - better. Build LOOKUP_EXPRs for local variables, even if they are - TREE_PERMANENT. - * pt.c (tsubst_enum): Remove field_chain parameter. - (template_class_depth): Include the depth of surrounding function - contexts. - (push_template_decl): Check for primary-template enum declarations - here. Deal with enumeration templates. - (lookup_template_class): Likewise. - (for_each_template_parm): Likewise. - (instantiate_class_template): Don't call tsubst_enum directly, - call tsubst instead, to instantiate enums. Deal with all - field_chain issues here, not in tsubst_enum. - (lookup_nested_type_by_name): Remove. - (tsubst_aggr_type): Revise handling of enumeration types. - (tsubst): Likewise. - (tsubst_copy): Likewise. - (tsubst_expr): Call tsubst, not tsubst_enum for TAG_DEFNs. - -1998-08-04 Mark Mitchell - - * decl.c (pushtag): Don't mangle the name of a TYPE_DECL if it - uses template parameters. - * method.c (build_template_parm_names): Use the full set of - template arguments for tsubst'ing. - (build_overload_identifier): Pass the full set of template - arguments to build_template_parm_names, not just the - innermost_args. - * pt.c (TMPL_ARGS_DEPTH): Define using - TMPL_ARGS_HAVE_MULTIPLE_LEVELS, for clarity. - (NUM_TMPL_ARGS): New macro. - (add_outermost_template_args): Deal with the case where the outer - args will be completely discarded. - (coerce_template_parms): Use the full set of template arguments - for tsubst'ing. Simplify. Add some asserts. Improve - error messages. - (lookup_template_class): Pass the full set of template arguments - to coerce_template_parms. - (tsubst): Add assertion. - (do_type_instantiation): Don't instantiate member template - classes. - - * init.c (build_offset_ref): Deal with a TEMPLATE_ID_EXPR whose - name is a LOOKUP_EXPR, rather than an IDENTIFIER_NODE. - -1998-08-03 Jason Merrill - - * method.c (set_mangled_name_for_decl): Change return type to void. - - * decl.c (lookup_name_real): A namespace-level decl takes priority - over implicit typename. Avoid doing the same lookup twice. - - * search.c (dependent_base_p): New fn. - (dfs_pushdecls, dfs_compress_decls): Use it. - - * typeck.c (get_member_function_from_ptrfunc): Don't try to handle - virtual functions if the type doesn't have any. - -1998-08-03 Mark Mitchell - - * decl2.c (grokfield): Don't mangle the name of a TYPE_DECL if it - uses template parameters. - -1998-08-02 Mark Mitchell - - * cp-tree.def (LOOKUP_EXPR): Document. Remove second argument. - * cp-tree.h (DECL_TI_TEMPLATE): Improve documentation. - * lex.c (do_identifier): Don't use a second argument, or a type, - when building LOOKUP_EXPRs. - (do_identifier): Likewise. - (do_scoped_id): Likewise. - * method.c (hack_identifier): Improve error message. - * pt.c (lookup_template_function): Don't needlessly call - copy_to_permanent or build_min. - (tsubst_copy): Remove #if 0'd code. Tsubst into LOOKUP_EXPRs if - necessary. - (do_decl_instantiation): Improve error message. - * tree.c (mapcar, case LOOKUP_EXPR): Don't be sorry; make a copy. - (build_min): Copy the type to the permanent obstack, too. - -1998-08-01 Jason Merrill - - * init.c (init_init_processing): Remove BI* handling. - (build_builtin_call): Remove. - (build_builtin_delete_call): New fn. - (build_delete): Use it. - -1998-07-31 Mark Mitchell - - * cp-tree.h (PROCESSING_REAL_TEMPLATE_DECL_P): New macro. - (maybe_check_template_type): New function. - * decl.c (maybe_process_template_type_declaration): New function, - split out from pushtag Call maybe_check_template_type. - (pushtag): Use it. Use PROCESSING_REAL_TEMPLATE_DECL_P. - (xref_tag): Use PROCESSING_REAL_TEMPLATE_DECL_P. - * friend.c (do_friend): Use PROCESSING_REAL_TEMPLATE_DECL_P. - * pt.c (template_class_depth_real): Generalization of ... - (template_class_depth): Use it. - (register_specialization): Use duplicate_decls for duplicate - declarations of specializations. - (maybe_check_template_type): New function. - (push_template_decl_real): Fix comment. - (convert_nontype_argument): Likewise. - (lookup_template_class): Likewise. Avoid an infinite loop on - erroneous code. - (tsubst_friend_function): Fix comment. - (tsubst, case FUNCTION_DECL): Deal with a DECL_TI_TEMPLATE that is - an IDENTIFIER_NODE. - * semantics.c (begin_function_definition): Use - reset_specialization to note that template headers don't apply - directly to declarations after the opening curly for a function. - -1998-07-29 Jason Merrill - - * decl.c (push_overloaded_decl): Use current_namespace instead of - DECL_CONTEXT (decl) to determine where we go. - - * decl.c (lookup_name_real): Fix typo. - -1998-07-28 Mark Mitchell - - * friend.c (is_friend): Be lenient with member functions to deal - with nested friends. - -1998-07-28 Jason Merrill - - * class.c (finish_struct_1): Convert integer_zero_node to - ssizetype before passing it to set_rtti_entry. - * typeck2.c (initializer_constant_valid_p): Allow conversion of 0 - of any size to a pointer. - -1998-07-27 Mark Mitchell - - * cp-tree.h (TI_USES_TEMPLATE_PARMS): Remove. - (build_template_decl_overload): Remove. - (set_mangled_name_for_decl): New function. - (innermost_args): Remove is_spec parameter. - (most_specialized, most_specialized_class): Remove declarations. - (lookup_template_class): Add entering_scope parameter. - (maybe_process_partial_specialization): New function. - (finish_template_decl): Likewise. - (finish_template_type): Likewise. - * class.c (finish_struct): Clean up processing of member template - specializations. - * decl.c (pushtag): Fix formatting. - (lookup_tag): Improve handling of pseudo-global levels. - (make_typename_type): Adjust call to lookup_template_class. - (shadow_tag): Use maybe_process_partial_specialization. - (xref_tag): Improve handling of member friends. - (start_function): Call push_nested_class before - push_template_decl. Don't call push_template_decl for - specializations. - * decl2.c (grok_x_components): Don't call xref_tag for - template instantiations. Handle UNION_TYPEs like RECORD_TYPEs. - (grokclassfn): Use set_mangled_name_for_decl. - (arg_assoc_class): Adjust call to innermost_args. - (mark_used): Don't call instantiate_decl for a TEMPLATE_DECL. - * error.c (dump_function_name): Improve printing of template - function names. - * friend.c (is_friend): Don't compare types of decls to determine - friendship, unless flag_guiding_decls. - (make_friend_class): Partial specializations cannot be friends. - (do_friend): Use set_mangled_name_for_decl. Call - push_template_decl_real instead of push_template_decl. - * method.c (build_decl_overload_real): Remove prototype. Give it - external linkage. - (build_overload_identififer): Adjust call to innermost_args. - (build_template_decl_overload): Remove. - (set_mangled_name_for_decl): New function. - * parse.y (.finish_template_type): New non-terminal. - (template_def): Use finish_template_decl. Use template_extdef - instead of extdef. - (template_extdef, template_datadef): New non-terminals, containing - only those rules for things which can be templates. - (datadef): Tidy. - (template_type, self_template_type): Use .finish_template_type. - (named_class_head): Use maybe_process_partial_specialization. - * pt.c (mangle_class_name_for_template): Remove context parameter. - (get_class_bindings): Remove outer_args parameter. - (complete_template_args): Remove. - (add_outermost_template_args): New function. - (register_specialization): Return the specialization. - (unregister_specialization): New function. - (tsubst_template_parms): Likewise. - (most_specialized, most_specialized_class): Prototype here as - static. - (original_template): Rename to most_general_template. - (tsubst_template_parms): New function. - (set_mangled_name_for_template_decl): Likewise. - (TMPL_ARGS_DEPTH): New macro. - (TMPL_ARGS_HAVE_MULTIPLE_LEVELS): Adjust. - (TMPL_ARGS_LEVEL): New macro. - (SET_TMPL_ARGS_LEVEL): Likewise. - (TMPL_ARG): Likewise. - (SET_TMPL_ARG): Likewise. - (TMPL_ARGS_DEPTH): Likewise. - (finish_member_template_decl): Use finish_template_decl. - (maybe_process_partial_specialization): New function, split out - from tsubst. - (inline_needs_template_parms): Use TMPL_PARMS_DEPTH. - (maybe_begin_member_template_processing): Use new macros. - (is_member_template): Likewise. - (is_member_template_class): Likewise. - (add_to_template_args): Likewise. Deal with multiple levels of - args. - (maybe_process_partial_specialization): New function. - (retrieve_specialization): Add consistency check. - (determine_specialization): Return full argument list. - (check_explicit_specialization): Tweak friend handling. Use full - argument lists. Simplify. - (current_template_args): Use new macros. - (push_template_decl_real): Change ill-named mainargs to specargs. - Check that a partial specialization actually specializes at least - one parameter. Improve friend handling. Modify for full - template arguments. - (classtype_mangled_name): Don't mangle the names of - specializations. - (lookup_template_class): Add entering_scope parameter. Use it to - avoid finding a template type when an instantiation is required. - Simplify. Use full template arguments. - (tsubst_friend_function): Use unregister_specialization. Use new - macros. Use full template arguments. - (tsubst_friend_class): Substitute, using tsubst_template_parms, - into the template parameters before passing them to - redeclare_class_template. - (instantiate_class_template): Simplify. Use full template - arguments. Adjust calls to get_class_bindings. Use - SET_IDENTIFIER_TYPE_VALUE where needed. Improve friend handling. - (innermost_args): Use new macros. - (tsubst_aggr_type): New function, split out from tsubst. - (tsubst): Use tsubst_aggr_type, tsubst_template_parms, new calling - conventions for lookup_tmeplate_class. Refine handling of partial - instantiations. Remove calls to complete_template_args. - Simplify. Add consistency checks. Use set_mangled_name_for_decl - and set_mangled_name_for_template_decl. - (tsubst_copy): Use tsubst_aggr_type. - (instantiate_template): Use full template arguments. - (more_specialized): Improve formatting. - (more_specialized_class): Adjust calls to get_class_bindings. - (get_bindings_real): Don't call complete_template_args. - (most_specialized): Don't overwrite input; create a new list. - (most_specialized_class): Use most_general_template. - (regenerate_decl_from_template): Use unregister_specialization. - Use full template arguments. - (instantiate_decl): Use full template arguments. - (set_mangled_name_for_template_decl): New function. - * semantics.c (begin_class_definition): Use - maybe_process_partial_specialization. - (finish_member_class_template): New function. - (finish_template_decl): Likewise. - (finish_template_type): Likewise. - (typeck.c): Don't crash after issuing a compiler_error. - * Makefile.in (CONFLICTS): Adjust; we removed a s/r conflict. - -1998-07-27 Jason Merrill - - * typeck2.c (build_functional_cast): Handle default-initialization. - - * call.c (build_over_call): Pass 1 to popclass. - - * parse.y (direct_notype_declarator): Add precedence declaration - to notype_unqualified_id case. - * Makefile.in (EXPECT): Adjust. - - * tree.c (ovl_member): Fix for single function in OVL. - -1998-07-27 Dave Brolley - - * c-lex.c (yylex): Fix boundary conditions in character literal and - string literal loops. - -1998-07-24 Jason Merrill - - * decl.c (lookup_name_real): OK, do return the from_obj value - unless got_object depends on template parms. - - * parse.y (nested_name_specifier_1): Pull out the TYPE_MAIN_VARIANT. - - * pt.c (coerce_template_parms): Also complain about local enums. - - * cp-tree.h: Add prototype for set_identifier_local_value. - * decl.c (set_identifier_local_value_with_scope): Make static, - prototype. - * search.c (covariant_return_p): Likewise. - * except.c (build_terminate_handler, alloc_eh_object): Likewise. - - * call.c (build_method_call): Only pull out the type of a destructor - if it's a template type parm. - * decl.c (lookup_name_real): Never return the from_obj value. - -1998-07-23 Jason Merrill - - * except.c (process_start_catch_block_old): Call start_decl_1 for - catch parm. - * decl.c (start_decl_1): Avoid duplicate error. - - * init.c (expand_default_init): Only perform the initialization if - it will do something. - -1998-07-23 H.J. Lu (hjl@gnu.org) - - * parse.y (base_class): Check for invalid base class. - -1998-07-23 Jason Merrill - - * decl2.c (import_export_template): Fold in... - (import_export_class): ...to here. Handle dllimport/export. - - * class.c (build_vtable): Pass at_eof to import_export_vtable. - (prepare_fresh_vtable): Likewise. - * decl2.c (import_export_class): Split out... - (finish_prevtable_vardecl): From here. - * class.c (finish_struct_1): Call import_export_class if at_eof. - - * decl.c (start_function): #if 0 mysterious code I wrote and have - forgotten why. - * rtti.c (get_tinfo_fn): If this is for a class type, set - DECL_CONTEXT. - -1998-07-22 Jason Merrill - - * inc/exception: Change terminate and unexpected to (). - - * parse.y (named_class_head_sans_basetype_defn): A - named_class_head_sans_basetype followed by '{' or ':' is a defn. - -1998-07-21 Jason Merrill - - * tree.c (canonical_type_variant): New fn to handle arrays. - * cp-tree.h (CANONICAL_TYPE_VARIANT): Remove. - * pt.c (unify, default case): Also fold arg. Fix array bounds case. - * method.c (process_overload_item): Use build_overload_value for - arrays. - -1998-07-20 Dave Brolley - - * lex.c (mbchar.h): #include it. - (GET_ENVIRONMENT): New macro. - (init_parse): Set character set based on LANG environment variable. - (real_yylex): Handle multibyte characters in character literals. - (real_yylex): Handle multibyte characters in string literals. - -1998-07-19 Jason Merrill - - * lex.c (do_identifier): Look for class value even if we don't - have a global value. Do implicit declaration if parsing is 2. - * semantics.c (finish_call_expr): Pass 2 if we're doing Koenig - lookup. - -1998-07-19 Mark Mitchell - - * decl.c (pushtag): Revert previous change. - * pt.c (lookup_template_class): Don't put out debugging - information for types that use template parameters. - - * decl.c (pushtag): Don't put out debugging information for - compiler-generated typedefs. - - * error.c (dump_type_real): Don't crash when presented with - intQI_type_node or the like. - - * semantics.c (finish_translation_unit): Fix spelling error in - comment. - -1998-07-17 Jason Merrill - - * decl.c (lookup_name_real): Pull out single function here. - (select_decl): Not here. - (unqualified_namespace_lookup): Use CP_DECL_CONTEXT. - - * decl.c (qualify_lookup): Tweak again. - - * pt.c (lookup_template_class): Don't mess with the context of the - instantiation. - * decl2.c (current_decl_namespace): Remove special handling for - templates. - - * pt.c (tsubst, case FUNCTION_DECL): Fix getting complete args for - a member template specialization. - - * tree.c (ovl_member): Use decls_match to compare functions. - * decl.c (decls_match): Check the context of a function. - - * parse.y (primary): Use notype_unqualified_id instead of IDENTIFIER - in Koenig lookup support rules. - * semantics.c (finish_call_expr): Handle the new cases. - - * typeck.c (build_x_function_call): Handle overloaded methods. - - * decl.c (grokvardecl): Don't call build_static_name for extern "C". - -1998-07-16 Mark Mitchell - - * semantics.c (finish_object_call_expr): Revert previous change. - * call.c (build_new_method_call): Likewise. Instead, convert - TYPE_DECLs to IDENTIFIERs here, in the presence of templates. - -1998-07-16 Jason Merrill - - * decl.c (qualify_lookup): Handle templates. - - * decl2.c (do_using_directive): Don't pass ancestor. - * decl.c (push_using_directive): Calculate ancestor. - - * decl2.c (do_nonmember_using_decl): Allow for type shadowing. - * decl.c (pushdecl): Move type shadowing handling from here... - (duplicate_decls): ...to here. - * decl.c (set_identifier_local_value_with_scope): New fn. - (pushdecl): Use it. - (set_identifier_local_value, lookup_type_current_level): New fns. - * decl2.c (do_local_using_decl): Handle types and binding level - stuff properly. - - * init.c (build_offset_ref): Don't call mark_used on an OVERLOAD. - * decl.c (select_decl): Extract a lone function from an OVERLOAD. - (lookup_namespace_name): Likewise. - * typeck.c (build_unary_op): Not here anymore. - - * decl2.c (do_class_using_decl): Make sure we get an identifier. - * class.c (handle_using_decl): Ignore TYPE_DECLs. - - * decl.c (qualify_lookup): New fn. - (lookup_name_real): Use it. - -1998-07-16 Martin v. Loewis - - * decl2.c (add_using_namespace): When directly using a namespace - that was indirect before, promote it. - - * cp-tree.h (LOOKUP_PREFER_TYPES, LOOKUP_PREFER_NAMESPACES, - LOOKUP_PREFER_BOTH, LOOKUP_NAMESPACES_ONLY, LOOKUP_TYPES_ONLY, - LOOKUP_QUALIFIERS_ONLY, LOOKUP_TEMPLATES_EXPECTED): New macros. - * decl.c (select_decl): Replace two flag parameters by one. - (unqualified_namespace_lookup): Likewise, pass flag. - (lookup_flags): New function. - (lookup_name_real): Compute flags, pass them. - (lookup_namespace_name): Call with zero-flag. - * decl2.c (ambiguous_decl): Add flag parameter, complain only - according to flags. - (lookup_using_namespace, qualified_lookup_using_namespace): - Add flag parameter, pass them through. - * lex.c (do_scoped_id): Call with zero-flag. - -1998-07-16 Jason Merrill - - * typeck.c (convert_for_assignment): Use comptypes. - -1998-07-16 Mark Mitchell - - * semantics.c (finish_object_call_expr): Move test for the - function called being a TYPE_DECL to ... - * call.c (build_new_method_call): Here. - -1998-07-15 Jason Merrill - - * decl2.c (arg_assoc_class): Also look at template arguments, if any. - (arg_assoc): Handle error_mark_node and multiple levels of TREE_LIST. - - * lex.c (looking_for_typename): Don't initialize. - - * decl2.c (ambiguous_decl): Clarify error message. - - * decl.c (push_using_directive): Iterate over namespaces used - indirectly. - -1998-07-15 Martin v. Löwis - - * decl2.c (add_using_namespace): Iterate over namespaces used - indirectly. - - * decl.c (lookup_name_real): Accept namespace aliases as locals. - (cat_namespace_levels): Ignore aliases. - (duplicate_decls): Ignore duplicate aliases. - * decl2.c (do_namespace_alias): Process block level namespace - aliases. Store alias with pushdecl. Remove odr errors. - * parse.y (namespace_alias): New non-terminal. - (extdef): Use it. - -1998-07-15 Jason Merrill - - * decl2.c (arg_assoc_type): Handle METHOD_TYPE like FUNCTION_TYPE. - Handle TEMPLATE_TYPE_PARM. - (arg_assoc): Rewrite. - - * pt.c (complete_template_args): Don't look at the context unless - we have to. - - * method.c (build_decl_overload_real): Fix namespace handling. - - * typeck.c (build_unary_op): Extract a lone function from an - OVERLOAD. - - * call.c (build_scoped_method_call): Handle getting a namespace - for basetype in a destructor call. - (check_dtor_name): Handle enums. - - * parse.y (using_directive): New nonterminal. - (extdef, simple_stmt): Use it. - -1998-07-14 Martin von Löwis - - * decl2.c (add_function): Move error message ... - (arg_assoc_namespace): ... from here. - -1998-07-14 Jason Merrill - - * parse.y (namespace_qualifier): Fix multiple level handling. - * decl2.c (namespace_ancestor): Use CP_DECL_CONTEXT. - (arg_assoc): Don't skip the first argument of a function. - -Tue Jul 14 20:09:22 1998 Jeffrey A Law (law@cygnus.com) - - * search.c (my_tree_cons): Clean up. - -1998-07-14 Jason Merrill - - * call.c (joust): Don't warn about "confusing" conversions to the - same type. - -1998-07-14 Martin von Löwis - - * class.c (push_nested_class): Complain about namespaces. - * decl.c (start_decl): Enter the object's namespace. - (cp_finish_decl): Leave it. - (grokdeclarator): Likewise. - * decl2.c (check_decl_namespace): New function. - (finish_file): Call it. - * parse.y (complex_direct_notype_declarator): Set complexity - of namespace-qualified ids to -1, enter the namespace. - - * method.c (build_template_decl_overload): Expect _DECL as first - parameter. Put context temporarily into current_namespace. - * pt.c (check_explicit_specialization): Change caller. - (tsubst): Likewise. - - * init.c (build_offset_ref): Call mark_used and - convert_from_reference for namespace members. - -Mon Jul 13 23:25:28 1998 Martin von Löwis - - * search.c (my_tree_cons): The bitfield is at index 2. - -Mon Jul 13 17:21:01 1998 Nick Clifton - - * lang-options.h: Format changed to work with new --help support - in gcc/toplev.c - -1998-07-12 Martin von Löwis - - * decl2.c (build_expr_from_tree): Change calls of do_identifier. - Do Koenig lookup in CALL_EXPR. - (arg_assoc): Handle error_mark. - * lex.c (is_global): New function. - (do_identifier): Expect arguments for Koenig lookup. - * parse.y (primary): Add rules for calls of unqualified function calls. - (do_id): Change call of do_identifier. - * pt.c (finish_stmt_expr): Likewise. - * semantics.c (finish_id_expr): Likewise. - (finish_call_expr): Add integer parameter to indicate - argument-dependent lookup. - - * decl.c (struct binding_level): New field using_directives. - (push_using_decl): Not sorry anymore. - (push_using_directive): New function. - (lookup_tag): Use CP_DECL_CONTEXT to iterate. - (unqualified_namespace_lookup): New function, code from ... - (lookup_name_real): ... here. - * decl2.c (lookup_using_namespace): Pass using list instead of - initial scope. - (validate_nonmember_using_decl): New function. - (do_nonmember_using_decl): New function. - (do_toplevel_using_decl): Use them. - (do_local_using_decl): New function. - (do_using_directive): Support block-level directives. - * parse.y (simple_stmt): Support using declarations and - directives. - (namespace_qualifier, namespace_using_decl): New non-terminals. - - * xref.c (classname): New function. - (GNU_xref_hier): Change class and base parameters to tree. - * decl.c (xref_baseypes): Change caller. - * friend.c (make_friend_class): Likewise. - -1998-07-12 Kriang Lerdsuwanakij - - * typeck.c (comptypes, case TEMPLATE_TEMPLATE_PARM): Add parameter - comparison. - - * pt.c (for_each_template_parm, case TEMPLATE_DECL): If it is a - template template parameter, record its use. - (for_each_template_parm, case TEMPLATE_TEMPLATE_PARM): Traverse - its template arguments if exists. - - * pt.c (coerce_template_template_parms): New function equivalent - to coerce_template_parms when IS_TMPL_PARM is true. - (coerce_template_parms): Use it. Remove the IS_TMPL_PARM parameter, - all callers changed. - - (coerce_template_parms): Access ARGLIST properly when creating a - new vector. Only accept implicit TYPE_DECL as valid argument for - a template template parameter when it is a base class of - current_class_type. Don't display error message when COMPLAIN is - false. - -1998-07-12 Klaus Kaempf (kkaempf@progis.de) - - * repo.c (get_base_filename): Use file_name_nondirectory. - (open_repo_file): Ditto. - * cp-tree.h (file_name_nondirectory): Add prototype. - -1998-07-12 Jason Merrill - - * friend.c (do_friend): Pull the identifier out of declarator. - Use cp_error and friends. - * decl2.c (qualified_lookup_using_namespace): Fix call to - purpose_member. - * decl.c (lookup_name_real): Don't call complete_type on a namespace. - (grokvardecl): Use DECL_CLASS_SCOPE_P. - * cvt.c (convert_pointer_to_real): Check for error_mark_node sooner. - * class.c (warn_hidden): Fix for OVERLOAD. - From grahams@rcp.co.uk: - * cp-tree.h (DEFARG_NODE_CHECK): New macro. - (DEFARG_LENGTH, DEFARG_POINTER): Use it. - -Sun Jul 12 01:20:57 1998 Jeffrey A Law (law@cygnus.com) - - * g++.1 (-traditional): Remove duplicated documentation. - -1998-07-11 Mark Mitchell - - * method.c (flush_repeats): Add nrepeats parameter. - (issue_nrepeats): Likewise. - (is_back_referenceable_type): New function. Don't back-reference - TEMPLATE_TYPE_PARMs as well as simple types like integers. - (build_mangled_name_for_type): Likewise. - (build_mangled_name_for_type_with_Gcode): Likewise. - (lasttype): Remove. - (nrepeats): Likewise. - (Nrepeats): Likewise. - (start_squangling): Don't clear the variables removed above. - (end_squangling): Likewise. - (flush_repeats): Tidy. Use nrepeats parameter rather than - Nrepeats global. - (issue_nrepeats): Likewise, but with nrepeats global. Use - is_backreferenceable_type. - (build_overload_nested_name): Tidy. Add comment. Use - build_mangled_name_for_type. - (build_underscore_int): Comment. - (build_overload_scope_ref): Use build_mangled_name_for_type. - (build_overload_int): Likewise. - (build_template_template_parm_names): Tidy. - (build_template_parm_names): Use build_mangled_name_for_type. - (build_overload_identifier): Add comments. - (build_mangled_name_for_type_with_Gcode): Split out from - build_mangled_name. - (build_mangled_name_for_type): Use it. - (build_mangled_name): Rework to use build_mangled_name_for_type - and to not use global nrepeats/Nrepeats. Tidy. - (process_modifiers): Tidy. - (check_btype): Use is_backreferenceable_type. Add comment. - Rename `node' to `type'. - (process_overload_item): Set numeric_output_need_bar here. - Use build_mangled_name_for_type. Tidy. - (build_decl_overload_real): Tidy. Don't use Nrepeats. Use - build_mangled_name_for_type. - - * pt.c (push_template_decl_real): Don't look at DECL_TEMPLATE_INFO - for TYPE_DECLs. - -1998-07-08 Vladimir N. Makarov - - * cp-tree.h (warn_long_long): Define. - * decl.c (grokdeclarator): Add flag `warn_long_long' as guard for - warning "ANSI C++ does not support `long long'". - * decl2.c (warn_long_long): Define. - (lang_decode_option): Parse -Wlong-long, -Wno-long-long options. - -1998-07-07 Jason Merrill - - * decl.c (xref_tag): Handle attributes between 'class' and name. - * parse.y (aggr): Likewise. - * semantics.c (finish_class_definition): Likewise. - * Makefile.in (EXPECTED): Adjust. - - * cp-tree.h: Declare flag_optional_diags and warn_multichar. - * decl2.c: Define them. - (lang_decode_option): Handle them. - * lang-options.h: Add -foptional-diags. - * class.c (finish_struct): Don't complain about multiple meanings of - name if -fno-optional-diags. - * decl.c (pushdecl_class_level): Likewise. - * lex.c (real_yylex): Check warn_multichar. - -1998-07-06 Jason Merrill - - * decl.c (lookup_tag): Use CP_DECL_CONTEXT. - - * tree.c (make_binfo): Fix length. - -1998-06-30 Benjamin Kosnik - - * decl2.c (lang_decode_option): Remove warn_template_debugging. - * lang-options.h: Ditto. - -Mon Jun 29 20:17:40 1998 Kaveh R. Ghazi - - * except.c (build_eh_type_type_ref): Remove unused variable `susp'. - (process_start_catch_block): Likewise for variables - `false_label_rtx', `call_rtx' and `return_value_rtx'. - -1998-06-29 Brendan Kehoe - - * tree.c (build_srcloc): Make sure we allocate this node on the - permanent obstack. - -Sat Jun 27 23:34:18 1998 Fred Fish - - * g++spec.c (NEED_MATH_LIBRARY): Define to 1 if not already defined. - (lang_specific_driver): Initialize need_math with NEED_MATH_LIBRARY. - (lang_specific_driver): Only add -lm automatically if need_math is - nonzero. - -Sat Jun 27 12:22:56 1998 Jeffrey A Law (law@cygnus.com) - - * Make-lang.in (g++): Depend on mkstemp.o. Link in mkstemp.o - -Sat Jun 27 07:36:09 1998 Kaveh R. Ghazi - - * Makefile.in (EXPR_H): New dependency variable. - (decl2.o): Depend on $(EXPR_H). - (typeck.o): Likewise. - (init.o): Likewise. - (expr.o): Likewise. - -1998-06-25 Benjamin Kosnik - - * decl.c (start_enum): Put local enums on permanent_obstack. - -1998-06-25 Mark Mitchell - - * cp-tree.h (c_get_alias_set): Declare. - * decl.c (init_decl_processing): Set lang_get_alias_set. - -1998-06-25 Andrew MacLeod - - * cp-tree.h (mark_all_runtime_matches): Add function prototype. - * except.c (mark_all_runtime_matches): Set TREE_SYMBOL_REFERENCED - flag for all function decls which are in the exception table. - * exception.cc (__cplus_type_matcher): Check for CATCH_ALL_TYPE match. - * decl2.c (finish_file): Call mark_all_runtime_matches to make sure - code is emitted for any referenced rtti function. - -1998-06-25 Dave Brolley - - * lang-specs.h: Use new | syntax to eliminate - string concatenation. - -1998-06-25 Jason Merrill - - * cp-tree.h (CP_DECL_CONTEXT): New macro. - * decl2.c (is_namespace_ancestor, lookup_using_namespace): Use it. - * method.c (build_overload_nested_name): Likewise. - * sig.c (build_signature_pointer_or_reference_type): Don't set - DECL_CONTEXT. - -1998-06-24 Martin v. Löwis - - Set DECL_CONTEXT for globals to NULL_TREE instead of global_namespace. - * cp-tree.h (FROB_CONTEXT): New macro. - (DECL_MAIN_P): ::main should have a DECL_CONTEXT of NULL_TREE. - * decl.c (namespace_binding): Replace NULL_TREE with - global_namespace. - (set_namespace_binding, pop_namespace, lookup_name_real): Likewise. - * decl2.c (is_namespace_ancestor, lookup_using_namespace): - Likewise. - * decl.c (pushtag): Use FROB_CONTEXT. - (pushdecl, make_typename_type, define_function, grokdeclarator): - Likewise. - * decl2.c (set_decl_namespace, do_namespace_alias): Likewise. - * pt.c (push_template_decl_real, lookup_template_class, tsubst): - Likewise. - * decl2.c (decl_namespace): Return global_namespace if no context. - * method.c (build_overload_nested_name): Expect null as context. - * pt.c (mangle_class_name_for_template): Do nothing for null - contexts. - (lookup_template_class): Allow for null id_context. - -1998-06-25 Richard Henderson - - * method.c (emit_thunk): Set current_function_is_thunk for the - ASM_OUTPUT_MI_THUNK case as well. - -1998-06-23 Andrew MacLeod - - * exception.cc (__cplus_type_matcher): Get a match_info pointer - instead of an exception table entry as a parameter. - -1998-06-23 Andrew MacLeod - - * parse.y (function_try_block): Don't call start_catch_handler. - * except.c (call_eh_info): Remove coerced field from declaration. - (build_eh_type_type_ref): New function to create an address of a - rtti function for the new style exception tables. - (expand_start_catch_block): Split function, this contains the - common part. - (process_start_catch_block_old): New function to perform the rest - of expand_start_catch_block under old style exceptions. - (process_start_catch_block_old): New function to perform the rest - of expand_start_catch_block under new style exceptions. - (expand_end_catch_block): Only pop the false label off the stack under - the old style of exceptions. - * semantics.c (finish_try_block): Don't call start_catch_handler. - * exception.cc (struct cp_eh_info): Add original_value field. - (__cplus_type_matcher): Perform type matching on the original exception - value, and if we have a match, set the current value. - (__cp_push_exception): Set the original expcetion value. - -1998-06-23 Jason Merrill - - * call.c (joust): Fix confusing conversion warning. - - * call.c (build_op_delete_call): Add placement parm. Check - LOOKUP_SPECULATIVELY. - * cp-tree.h, decl2.c, init.c: Adjust. - * decl.c (finish_function): Use it. - - * pt.c (tsubst): Diagnose creating void fields or variables. - -Mon Jun 22 08:50:26 1998 Kaveh R. Ghazi - - * call.c (build_scoped_method_call): Remove unused variable `tmp'. - - * cp-tree.h (check_dtor_name): Add prototype. - - * init.c (expand_member_init): Remove unused variables - `ptr_type_node', `parm' and `rval'. - - * ptree.c (print_lang_type): Use HOST_WIDE_INT_PRINT_DEC specifier - in call to fprintf. - (lang_print_xnode): Likewise. - - * typeck2.c (enum_name_string): Cast argument to sprintf to long - and use %ld specifier. - - * xref.c (GNU_xref_end_scope): Use HOST_WIDE_INT_PRINT_DEC - specifier in call to fprintf. - (GNU_xref_member): Cast argument to sprintf to int. - -Fri Jun 19 23:22:42 1998 Bruno Haible - - * typeck2.c (pop_init_level): Warn about implicit zero initialization - of struct members. - -Thu Jun 18 09:32:32 1998 Kaveh R. Ghazi - - * cp-tree.h: Prototype function `check_java_method'. - -1998-06-17 Jason Merrill - - * class.c (finish_struct): Make conflicting use of id a pedwarn. - * decl.c (pushdecl_class_level): Likewise. - -1998-06-17 Mark Mitchell - - * pt.c (convert_nontype_argument): Issue an error when presented - with an integer (real) constant that cannot be simplified to an - INT_CST (REAL_CST). - - * cp-tree.h (c_get_alias_set): Remove declaration added in - 1998-06-13 change that should never have been checked in. - -1998-06-17 Jason Merrill - - * typeck.c (build_binary_op_nodefault): Change % in format strings - to %%. - - * decl.c (grokvardecl): Don't build_static_name for decls that - aren't at namespace scope. - - * init.c (perform_member_init): Catch default-initialization of - references. - -1998-06-17 Mark Mitchell - - * errfn.c (cp_thing): Handle the `%%' formatting sequence. - -1998-06-17 Jason Merrill - - * method.c (hack_identifier): Complain about getting a namespace - or class template. - * typeck.c (decay_conversion): Remove check for namespaces. - * typeck2.c (incomplete_type_error): Likewise. - * parse.y (template_arg): Add PTYPENAME expansion. - -1998-06-16 Andrew MacLeod - - * decl.c (grokvardecl): Don't build external assembler names for - TYPENAMEs in other namespaces as there is no declarator. - * error.c (cp_file_of, cp_line_of): Don't extract file or line number - info from DECL_CONTEXT if it is NULL. - -1998-06-16 Jason Merrill - - * call.c (check_dtor_name): Split out. - (build_scoped_method_call): Use it. - (build_method_call): Use it. - * init.c (build_offset_ref): Use it. - - * typeck.c (build_static_cast): Fix handling of pointers to members. - - * decl.c (finish_function): Just return nothing from a constructor. - * typeck.c (c_expand_return): Complain about returning a void - expression from a destructor. - -1998-06-13 Mark Mitchell - - * class.c (alter_access): Accept a BINFO explaining how to get - from the entity whose accessed is being altered to the type doing - the altering. - (handle_using_decl): New function containing code split out from ... - (finish_struct_1): Here. - - * cp-tree.h (complete_type_or_else): Declare. - * init.c (build_new_1, build_delete): Use it. - * typeck.c (require_complete_type): Use complete_type, rather than - expanding it inline. - (complete_type_or_else): New function. - (build_component_ref): Use it. - (pointer_int_sum): Make sure the type pointed to is complete. - (pointer_diff): Likewise. - - * pt.c (for_each_template_parm): Traverse the TYPE_CONTEXT for - types. - - * search.c (get_matching_virtual): Note that member templates - cannot override virtual functions. - -1998-06-12 Brendan Kehoe - - * pt.c (check_explicit_specialization): If DECLARATOR turned into - an error_mark_node from lookup_template_function, return the same. - (determine_specialization): Also make sure TEMPLATE_ID isn't an - error_mark_node, before we try to read its operands. - * decl.c (grokdeclarator): If we got an error_mark_node from - check_explicit_specialization, just return it right back. - -1998-06-12 Mark Mitchell - - * class.c (instantiate_type): Don't treat template-ids that don't - specify any template arguments as equivalent to ordinary - identifiers. Use OFFSET_REF instead of SCOPE_REF to refer to - pointer-to-members for member templates. Tidy slightly. - * cp-tree.def (TEMPLATE_ID_EXPR): Revise documentation. - * init.c (build_offset_ref): Handle template-ids like ordinary - identifiers, for the most part, but store a TEMPLATE_ID_EXPR in the - offset part of the OFFSET_REF. - * typeck.c (build_unary_op): Change check for unknown types to - look for OFFSET_REFs, not SCOPE_REFs. - -1998-06-11 Mark Mitchell - - * pt.c (is_member_template_class): New function. - (push_template_decl_real): Use it. - -1998-06-11 Benjamin Kosnik - - * friend.c (do_friend): Add support for nested classes using - member functions of the enclosing class as friends. - -1998-06-10 Mark Mitchell - - * call.c (convert_default_arg): Make global, not static. - (convert_arg_for_ellipsis): Split out from ... - (build_over_call): Here. - * cp-tree.h (convert_default_arg); Declare. - (convert_arg_to_ellipsis): Likewise. - (do_member_init): Remove. - * init.c (do_member_init): Remove; this code is dead. - (expand_member_init): Remove much of this code; it is dead. - * typeck.c (convert_arguments): Use convert_default_arg and - convert_arg_for_ellipsis, rather than duplicating here. - - * call.c (convert_like): Don't fail silently if - build_user_type_conversion fails. Always return error_mark_node - for failure. - -1998-06-10 Jason Merrill - - * search.c (covariant_return_p): Complain about ambiguous base. - - * typeck.c (build_component_ref): Diagnose ref to nested type. - -1998-06-10 Brendan Kehoe - - * decl.c (grokparms): Check that INIT isn't an error_mark_node - before giving error about invalid type for default arg. - -1998-06-10 Jason Merrill - - * call.c (build_method_call): Fix thinko. - -1998-06-10 Dave Brolley - - * decl2.c (lang_decode_option): New argc/argv interface. - * cp-tree.h (lang_decode_option): New argc/argv interface. - * lang-specs.h (default_compilers): Only call cpp if -E, -M or -MM is - specified for cpplib-enabled compilers. - * lex.c (lang_init): Don't check_newline for cpplib. - (init_parse): Don't initialize cpplib here. - -1998-06-10 Brendan Kehoe - - * typeck.c (build_component_ref): Make sure FIELD has a lang_specific - piece before checking DECL_MUTABLE_P. - -1998-06-10 John Carr - - * tree.c (debug_binfo): Make printf format match arguments. - - * error.c (OB_PUTI): Make printf format match arguments. - -1998-06-10 Jason Merrill - - * init.c (perform_member_init): Handle default-initialization. - - * except.c (build_throw): Handle throwing NULL. - - * typeck.c (build_x_function_call): Use resolve_offset_ref. - - * search.c (compute_access): Only strip an anonymous union - for a FIELD_DECL. - - * call.c (add_builtin_candidates): Tweak. - - * cvt.c (build_expr_type_conversion): Restore code for conversion - from class types. - * decl2.c (delete_sanity): Use it. Clean up. - - * typeck.c (comp_ptr_ttypes_real): Fix cv-qual comparisons. - -1998-06-10 Branko Cibej - - * typeck.c (c_expand_return): Don't warn about void expressions on - return statements in functions returning void. - -1998-06-09 Mark Mitchell - - * pt.c (fn_type_unification): Revise documentation. Tidy. - (type_unification): Likewise. - -1998-06-09 Andrew MacLeod - - * semantics.c (finish_try_block): Rename expand_start_catch, and delete - expand_end_catch. - * parse.y (function_try_block): Rename expand_start_catch, and delete - expand_end_catch. - * except.c (expand_end_eh_spec): Rename expand_start_catch, and delete - expand_end_catch. - -1998-06-09 Jason Merrill - - * search.c (lookup_member): New fn. - * class.c (finish_struct_1): Use it. - * decl.c (lookup_name_real): Use it. - -Mon Jun 8 20:45:52 1998 Kaveh R. Ghazi - - * Makefile.in (decl2.o): Depend on dwarf2out.h and dwarfout.h. - - * cp-tree.h: Add prototype for `maybe_print_template_context' and - `maybe_make_one_only'. - - * decl.c (auto_function): Remove unused variable `decl'. - - * decl2.c: Include dwarf2out.h and dwarfout.h. - - * lex.c: Remove redundant declarations of `set_float_handler' and - `asm_out_file'. - -1998-06-08 Andrew MacLeod - - * except.c (init_exception_processing): Remove NEW_EH_MODEL compile - time flag. Call __cp_eh_info instead of __cp_exception_info. - * exception.cc (struct cp_eh_info): Remove NEW_EH_MODEL flag. - (__cp_exception_info): Return offset into cp_eh_info structure to - match what use to be the start of this structure. - (__cp_eh_info): New function to return a pointer to cp_eh_info struct. - (__cplus_type_matcher, __cp_push_exception): Remove NEW_EH_MODEL - compile time flag. - (__uncatch_exception, __check_eh_spec, std::uncaught_exception): Call - __cp_eh_info instead of __cp_exception_info. - -1998-06-08 Jason Merrill - - * decl.c (cp_finish_decl): Disable inlining of extern inlines - with static variables. - -1998-06-08 Mark Mitchell - - * init.c (build_offset_ref): Correct previous change to use build, - not build_min. - -1998-06-07 Mark Mitchell - - * class.c (instantiate_type): Handle pointer-to-members where the - member is a template. - * init.c (build_offset_ref): Likewise. - * typeck.c (build_unary_op): Likewise. - -1998-06-07 Richard Henderson - - * lex.c (lang_init_options): New function. - (lang_init): Remove flag_exceptions == 2 hack. - -1998-06-05 Jason Merrill - - * search.c (envelope_add_decl): Tweak for implicit typename. - - * call.c (joust): Also warn about confusing conversion op/constructor - overload resolution. - - * spew.c (yylex): Also return the TYPE_DECL if got_object. - Don't clear got_object after '~'. - * call.c (build_scoped_method_call): Tweak destructor handling. - (build_method_call): Likewise. - * pt.c (tsubst_copy, case METHOD_CALL_EXPR): Don't mess with - TYPE_MAIN_VARIANT for destructors. - * semantics.c (finish_object_call_expr): Complain about calling a - TYPE_DECL. - -1998-06-05 Per Bothner - - * g++spec.c (lang_specific_pre_link, lang_specific_extra_ofiles): - Define - update needed by gcc.c change. - -1998-06-05 Jason Merrill - - * error.c (cp_printers): Use 'o' instead of '_' for the null entry. - -1998-06-05 Martin v. Loewis - - * cp-tree.h (DECL_NAMESPACE_ALIAS, ORIGINAL_NAMESPACE): Declare. - * decl.c (lookup_name_real): Add namespaces_only parameter. - If set, return only NAMESPACE_DECLs. - (select_decl): Likewise. - (identifier_type_value): Give additional parameter. - (lookup_name_nonclass): Likewise. - (lookup_name): Likewise. - (find_binding): Skip namespace aliases. - (binding_for_name): Likewise. - (push_namespace): Check for namespace aliases. - (lookup_name_namespace_only): New function. - (begin_only_namespace_names, end_only_namespace_names): New functions. - * decl2.c (set_decl_namespace): Skip namespace aliases. - (do_using_directive): Likewise. - (do_namespace_alias): Produce namespace aliases, fix alias - redeclaration. - * error.c (dump_decl): Support SCOPE_REF. - * parse.y (extdef): Wrap lookup with namespace_only for namespace - aliases and using declarations. - -1998-06-04 Jason Merrill - - * tree.c (really_overloaded_fn): Only see through one TREE_LIST. - - * error.c (dump_expr): Clean up NEW_EXPR case. - -1998-06-04 Martin von Löwis - - Suggested by Brendan Kehoe - * decl2.c (do_toplevel_using_decl): When decl is a TYPE_DECL, - treat it as using ::decl. - - * decl2.c (arg_assoc_type): Process unknown_type_node and OFFSET_TYPE. - - * tree.c (mapcar): Support NEW_EXPR. - - * error.c (dump_expr): Support NEW_EXPR. - -1998-06-03 Jason Merrill - - * method.c (make_thunk): Use overload machinery to make name. - * search.c (covariant_return_p): New fn. - (get_matching_virtual): Use it. - - * init.c (build_new_1): Fix check for void. - -1998-06-01 Per Bothner - - * cp-tree.h (TYPE_FOR_JAVA): New macro. - * decl.c, cp-tree.h (java_byte_type_node, java_short_type_node, - java_int_type_node, java_long_type_node, java_float_type_node, - java_double_type_node, java_char_type_node, java_boolean_type_node): - New "primitive" types, with predefined names __java_byte etc. - (record_builtin_java_type): New function. - (init_decl_processing): Make Java types with record_builtin_java_type. - (pushtag, grokdeclarator): Set TYPE_FOR_JAVA if in extern "JAVA". - (xref_baseypes): If base class was TYPE_FOR_JAVA, so is this class. - (grokfndecl): Call check_java_method for Java classes. - * method.c (is_java_type): Removed. Replaced with TYPE_FOR_JAVA. - (process_overload_item): Match types against specific - java_XX_type_node types, rather than using is_java_type. - * class.c (finish_struct_1): Don't add default copy constructor - or operator= if TYPE_FOR_JAVA. - (pop_lang_conext): Restore strict_prototyp proper if Java. - * decl2.c (acceptable_java_type, check_java_method): New functions. - * pt.c (instantiate_class_template): Copy TYPE_FOR_JAVA from pattern. - (tsubst): Move common statement after if statement. - * typeck.c (comptypes): If strict, TYPE_FOR_JAVA must match. - -1998-06-01 Jason Merrill - - * pt.c (for_each_template_parm): Use first_rtl_op. - - * tree.c (build_cplus_array_type_1): Also check index_type for - template parms. - -1998-05-31 Jason Merrill - - * pt.c (tsubst): Always copy BINFO_BASETYPES. - -1998-05-29 scott snyder - - * tree.c (layout_basetypes): If we change TYPE_SIZE, change - TYPE_SIZE_UNIT too. - -1998-05-29 Mark Mitchell - - * decl.c (grokdeclarator): Don't complain about in-class - initialization of static consts if we don't really know the type - of the variable. - -1998-05-29 Jason Merrill - - * cp-tree.h (DECL_DESTRUCTOR_P): New macro. - * method.c (build_destructor_name): New fn. - * decl2.c (maybe_retrofit_in_chrg): Split out... - (grokclassfn): From here. Reorganize. - * decl.c (grok_ctor_properties): Make sure ctors for types with - vbases have the in_chrg parm. - * pt.c (instantiate_class_template): Update - TYPE_USES_VIRTUAL_BASECLASSES from tsubsted bases. Don't call - grok_*_properties. - (tsubst): Call grok_ctor_properties and maybe_retrofit_in_chrg. - -1998-05-28 Mark Mitchell - - * pt.c (instantiate_decl): Make test for whether or not static - variables should be instantiated early match its comment. - -1998-05-28 Jason Merrill - - * decl.c (start_decl): Always pedwarn about vacuously redeclaring - a member. - (start_function): Call check_default_args. - * decl2.c (grokfield): Don't call check_default_args. - (check_default_args): Use cp_error_at. - * lex.c (do_pending_defargs): Call check_default_args. - -1998-05-27 Brendan Kehoe - - * call.c (build_method_call): Make sure get_type_value returns - something before we try to use its TYPE_MAIN_VARIANT. - (build_scoped_method_call): Likewise. - -1998-05-27 Jason Merrill - - * typeck2.c (digest_init): Complain about getting a TREE_LIST to - initialize an array. - - * search.c (expand_upcast_fixups): Don't set DECL_CONTEXT and - DECL_VIRTUAL_P. - - * friend.c (do_friend): Clarify template warning. - -1998-05-27 Mark Mitchell - - * decl.c (shadow_label): Don't treat decls as identifiers. - (maybe_push_to_top_level): Clear shadowed_labels. - - * pt.c (instantiate_decl): Reset lineno and filename after calling - regenerate_decl_from_template. - - * decl.c (grokdeclarator): Don't try to use TYPE_OBSTACK on an - error_mark_node. - -1998-05-27 Kevin Buhr - - * parse.y (base_class): Use is_aggr_type, not IS_AGGR_TYPE. - -1998-05-26 Kriang Lerdsuwanakij - - * pt.c (process_template_parm): Accept TYPENAME_TYPE nodes. - (convert_nontype_argument): Handle cases when nontype template - parameters become classes after substitution. - -1998-05-26 Mark Mitchell - - * friend.c (is_friend): Use comptypes, rather than == to compare - types. Modify for new representation of template friends. - (make_friend_class): Likewise. - * pt.c (tsubst_friend_class): Undo 1998-05-21 change. Tweak. - (instantiate_class_template): Deal with template friends. - - * decl.c (store_parm_decls): Remove redundant call to - expand_main_function. - -1998-05-26 Benjamin Kosnik - - * decl.c (start_decl): Check for DECL_LANG_SPECIFIC before - DECL_USE_TEMPLATE. - -1998-05-26 Per Bothner - - * language_as_string: Handle lang_java. - -1998-05-26 Jason Merrill - - * decl.c (pushdecl): Don't copy the type_decl. - -1998-05-26 Martin v. Löwis - - * class.c (pushclass): Always store TYPE_MAIN_VARIANT in - current_class_type. - * decl.c (grokdeclarator): Put typedefs on the type's obstack. - - * parse.y (complex_direct_notype_declarator): Use $1 to access - scope of notype_qualified_id. - -1998-05-26 Dave Brolley - - * lex.c (parse_options,yy_cur,yy_lim): Add for cpplib. - (init_parse): Initialize cpplib interface. - - * Makefile.in (CXX_OBJS): Make sure dependencies never end with an - empty continuation. - -1998-05-26 Mark Mitchell - - * decl.c (pushtag): Avoid crashing on erroneous input. - -1998-05-25 Martin v. Löwis - - * decl.c (push_namespace): Only produce one unique name for - anonymous namespaces. - (get_unique_name): Remove. - -1998-05-25 Mark Mitchell - - * call.c (tourney): Don't do any extra comparisons. - - * decl2.c (build_anon_union_vars): Don't crash on empty sub-unions. - - * cp-tree.h (processing_template_parmlist): Declare. - * decl.c (pushtag): Don't call push_template_decl when we - shouldn't. - * pt.c (processing_template_parmlist): New variable. - (TMPL_ARGS_HAVE_MULTIPLE_LEVELS): New macro. - (complete_template_args): Use it. - (add_to_template_args): Likewise. - (innermost_args): Likewise. - (tsubst): Likewise. - (begin_template_parm_list): Use processing_template_parmlist. - (end_template_parm_list): Likewise. - - * cp-tree.h (ANON_UNION_TYPE_P): New macro. - * decl.c (grokdeclarator): Use it. - * decl2.c (grok_x_components): Likewise. - * init.c (initializing_context): Likewise. - * method.c (do_build_copy_constructor): Likewise. - (do_build_assign_ref): Likewise. - * search.c (compute_access): Likewise. - * typeck.c (build_component_ref): Likewise. - - * decl.c (grokdeclarator): Don't give a cv-qualified version of an - unnamed type a typedef name "for linkage purposes". - - * pt.c (lookup_template_class): Don't look at - IDENTIFIER_CLASS_VALUE when there's no current_class_type. - - * method.c (build_overload_int): Handle error cases gracefully. - - * pt.c (instantiate_decl): Handle static member variables - correctly. - - * pt.c (tsubst): Use the tsubst'd type when producing new - TEMPLATE_PARM_INDEX nodes. - -1998-05-24 Mark Mitchell - - * tree.c (cp_tree_equal): Handle pointers to member functions. - - * call.c (maybe_handle_implicit_object): Handle QUAL_CONVs. Make - sure the type of the REF_BIND is a reference type. - (maybe_handle_ref_bind, compare_ics): Rename reference_type to - target_type for clarity. - - * parse.y (xcond): Move call to condition_conversion ... - * semantics.c (finish_for_cond): Here. - * parse.c: Regenerated. - -1998-05-24 Jason Merrill - - * decl.c (push_namespace): Namespaces have type void. - * typeck2.c (incomplete_type_error): Complain about namespace - used as expression. - * typeck.c (decay_conversion): Likewise. - -1998-05-24 Martin von Löwis - - * error.c (dump_expr): Support namespaces. - -1998-05-23 Jason Merrill - - * cp-tree.def: Add SRCLOC. - * cp-tree.h: Add struct tree_srcloc and accessor macros. - * tree.c (build_srcloc, build_srcloc_here): New fns. - * pt.c (add_pending_template): Use build_srcloc_here. - (push_tinst_level): Update last_template_error_tick before erroring. - (instantiate_decl): Restore lineno and input_filename before - calling add_pending_template. - * decl2.c (finish_file): Set up lineno and input_filename for - pending templates. - -1998-05-22 Jason Merrill - - * decl.c (lang_print_error_function): New fn. - (init_decl_processing): Set print_error_function to use it. - * errfn.c (cp_thing): Don't call maybe_print_template_context here. - - * call.c (maybe_handle_ref_bind): Propagate ICS_USER_FLAG and - ICS_BAD_FLAG. - - * cvt.c (ocp_convert): Don't set LOOKUP_NO_CONVERSION for - copy-initialization. - - * class.c (build_vtable_entry): Use int_fits_type_p. - (build_vtable): Pass a signed offset to build_vtable_entry. - (prepare_fresh_vtable, modify_one_vtable, fixup_vtable_deltas1, - set_rtti_entry): Likewise. - -1998-05-22 Per Bothner - - * cp-tree.h: Add comments documenting which LANG_FLAGS are used. - (C_TYPE_VARIABLE_SIZE, C_DECL_VARIABLE_SIZE): Removed, not used. - -1998-05-22 Jason Merrill - - * pt.c (print_template_context): Use fprintf instead of cp_error. - - * pt.c (determine_specialization): Just return an error_mark_node. - Also print the decl we want in error messages. If we complain, - return error_mark_node. - (tsubst_friend_function): Set lineno and input_filename so - error messages will be useful. - (instantiate_template): Just return an error_mark_node. - (check_explicit_specialization): Don't mess with a returned - error_mark_node. - - * pt.c (print_template_context): Add new argument. - (maybe_print_template_context): New fn. - (push_tinst_level): Increment tinst_level_tick. - (pop_tinst_level): Likewise. - * errfn.c (cp_thing): Call maybe_print_template_context. Use - xrealloc instead of xmalloc. - - * typeck.c (build_unary_op, CONVERT_EXPR): Propagate TREE_CONSTANT. - -1998-05-21 Jason Merrill - - * pt.c (tsubst_friend_class): Don't call redeclare_class_template - if the template we looked up is the same as the one we already - have. - -Thu May 21 11:54:44 1998 Dave Brolley - - * lex.c: (handle_sysv_pragma): FILE* parameter not used. - (cpp_reader,parse_in): Add for cpplib. - (check_newline): Call handle_sysv_pragma with new interface. - (check_newline): Call GET_DIRECTIVE_LINE, not get_directive_line. - - * input.c: (yy_cur,yy_lim,yy_get_token,GETC): Add for cpplib. - (sub_getch): Call GETC for cpplib. - - * cp-tree.h: (get_directive_line): Different prototype for cpplib. - (GET_DIRECTIVE_LINE): Macro wrapper for get_directive_line. - - * Makefile.in (CXX_OBJS): add @extra_cxx_objs@ for cpplib. - -1998-05-21 Jason Merrill - - * decl2.c (maybe_make_one_only): New fn. - (import_export_vtable): Use it. - (import_export_decl): Likewise. - * pt.c (mark_decl_instantiated): Likewise. - -1998-05-21 Mark Mitchell - - * decl2.c (find_representative_member): Rename to ... - (build_anon_union_vars): New function. - (finish_anon_union): Fix stupidity of previous change. - -1998-05-20 Jason Merrill - - * decl.c (grokfndecl): Handle definition of specialization in - friend declaration. - - * error.c (dump_decl): Fix LOOKUP_EXPR handling. - -1998-05-20 Mark Mitchell - - * class.c (delete_duplicate_fields_1): Use DECL_DECLARES_TYPE_P - to look for type declarations. - (finish_struct): Deal with templates on the CLASSTYPE_TAGS list. - * cp-tree.h (DECL_DECLARES_TYPE_P): New macro. - (finish_member_class_template): Declare. - * decl.c (pushtag): Put member class templates on the - CLASSTYPE_TAGS list, just as for ordinary member classes. - (pushdecl_class_level): Use DECL_DECLARES_TYPE_P. - (lookup_tag): Look for IDENTIFIER_CLASS_VALUEs, just as with - IDENTIFIER_NAMESPACE_VALUEs. - * parse.y (component_decl): Move code to ... - * semantics.c (finish_member_class_template): New function. - Don't put member class templates on the list of components for a - class. - * parse.c: Regenerated. - * pt.c (classtype_mangled_name): Don't try DECL_CONTEXT on types. - In fact, don't use DECL_CONTEXT at all here. - -1998-05-20 Martin von Loewis - - * decl.c (record_unknown_type): New function. - (init_decl_processing): Call it for the unknown and global type - nodes. - -1998-05-20 Mark Mitchell - - * decl2.c (find_representative_member): New function. - (finish_anon_union): Use it. - - * cp-tree.h (MAIN_NAME_P): New macro. - (DECL_MAIN_P): Likwise. - * decl.c (pushdecl): Avoid crashing on redefinitions of `main'. - (grokfndecl): Use the new macros. - (grokdeclarator): Likewise. - (start_function): Likewise. - (store_parm_decls): Likewise. - (finsh_function): Likewise. - * friend.c (do_friend): Likewise. - * typeck.c (build_function_call_real): Likewise. - (build_unary_op): Likewise. - -Wed May 20 02:16:01 1998 Jason Merrill - - * decl2.c (start_objects, finish_objects, do_dtors, - do_ctors): Split out from... - (finish_file): ...here. - -Tue May 19 20:36:23 1998 Jason Merrill - - * tree.c (is_overloaded_fn): Don't abort on placeholders from - push_class_decls. - -Tue May 19 15:16:22 1998 Brendan Kehoe - - * class.c (is_empty_class): Return 0 if TYPE is an error_mark_node. - - * error.c (dump_expr): Handle an ARROW_EXPR. - -Tue May 19 15:13:39 1998 Mark Mitchell - - * decl.c (saveable_obstack): Declare. - (pushdecl): Copy TYPE_DECLs to the same obstack as the type they - declare, if necessary. - -Tue May 19 14:50:27 1998 Mark Mitchell - - * call.c (compare_qual): Remove. - (is_subseq): Tweak. - (is_properly_derived_from): New function. - (maybe_handle_ref_bind): Likewise. - (maybe_handle_implicit_object): Likewise. - (compare_ics): Modify substantially to bring into conformance with - the standard. - * cp-tree.h (TYPE_PTRMEMFUNC_OBJECT_TYPE): New macro. - (comp_cv_qualification): Declare. - (comp_cv_qual_signature): Likewise. - * typeck.c (comp_cv_qualification): Likewise. - (comp_cv_qual_signature): Likewise. - -Tue May 19 10:05:02 1998 Kaveh R. Ghazi - - * Makefile.in (parse.o): Depend on toplev.h. - - * class.c (typecode_p): Remove prototype and definition. - - * cp-tree.h (currently_open_class, is_empty_class, member_p): - Add prototype. - - * decl.c (push_overloaded_decl_top_level): Remove prototype and - definition. - - * errfn.c (cp_error): Cast function pointer `error' to (errorfn *) - in call to `cp_thing'. - (cp_warning): Likewise for function pointer `warning'. - - * except.c (do_function_call): Remove prototype and definition. - (call_eh_info): Wrap variable `t1' in macro NEW_EH_MODEL. - - * method.c (is_java_type): Add prototype and make it static. - - * parse.y: Include toplev.h. - - * pt.c (type_unification): Remove unused variable `arg'. - (instantiate_decl): likewise for `save_ti'. - - * tree.c (propagate_binfo_offsets): Likewise for `base_binfos'. - -Tue May 19 02:43:25 1998 Jason Merrill - - * init.c (build_member_call): Handle template_ids. - * parse.y (primary): Add global_scope template_id. - -Mon May 18 23:22:52 1998 Jason Merrill - - * decl2.c (get_sentry): Use end_temporary_allocation. - Don't declare permanent_obstack. - -Mon May 18 12:28:44 1998 Mark Mitchell - - * parse.y (.finish_new_placement): New non-terminal. - (unary_expr, new_type_id): Use it. - * parse.c: Regenerated. - -Mon May 18 12:20:27 1998 Brendan Kehoe - - * pt.c (redeclare_class_template): Say where the original definition - of the template-parameter's default argument appeared. - -Mon May 18 03:00:57 1998 Jason Merrill - - * call.c (build_over_call): Tweak empty class handling. - - * decl.c (make_typename_type): Use currently_open_class. - - * class.c (instantiate_type): Don't abort on TREE_NONLOCAL_FLAG. - -Mon May 18 01:43:01 1998 Martin v. Loewis - - * decl.c (lookup_name_real): Don't look at IDENTIFIER_LOCAL_VALUE - for a type unless it is one. - - * class.c (finish_struct_1): Use OVL_CURRENT in error message. - -Mon May 18 01:24:08 1998 Jeffrey A Law (law@cygnus.com) - - * Makefile.in (program_transform_name, objdir): Define. - - * Makefile.in (BISON): Use bison from the build tree if it exists. - (FLEX): Similarly. - -Sun May 17 14:52:08 1998 Martin v. Loewis - - * typeck.c (type_unknown_p): Return true for TREE_LIST also. - - * call.c (build_method_call): Use TYPE_MAIN_VARIANT on typedefs. - -Sun May 17 14:51:41 1998 Jason Merrill - - * call.c (build_scoped_method_call): Likewise. - -Sun May 17 13:53:48 1998 Mark Mitchell - - * init.c (build_new_1): Call suspend_momentary around the creation - of values that must be saved for exception handling. - * parse.y (.build_new_placement): New non-terminal. - (unary_expr, new_placement): Use it. - * parse.c: Regenerated. - -Sun May 17 12:32:08 1998 Jason Merrill - - * decl.c (duplicate_decls): Use CANONICAL_TYPE_VARIANT to compare - old and new types. - - * pt.c (tsubst): Make sure that BINFO_TYPE of new binfos is the - canonical type. - - * call.c (build_over_call): Don't use IS_SIGNATURE on a namespace. - -Fri May 15 20:28:00 1998 Jason Merrill - - * decl.c (start_decl): Revert problem change. - - * Makefile.in (CONFLICTS): Fix. - -Fri May 15 15:34:02 1998 Benjamin Kosnik - - * decl.c (duplicate_decls): Clean up, add DECL_DATA_AREA bits. - -Fri May 15 00:46:05 1998 Jason Merrill - - * class.c (finish_struct_1): Use BINFO_SIZE. - - * decl.c (start_decl): Use 'tem'. - -Thu May 14 16:30:47 EDT 1998 Andrew MacLeod - - * exception.cc: Include eh-common.h. - (struct cp_eh_info): add eh_info struct with NEW_EH_MODEL. - (__cplus_type_matcher): First stab at new C++ runtime type matcher. - (__cp_push_exception): Initialize eh_info struct as well. - * except.c: Remove local structs and include eh-common.h. - (init_exception_processing): Set language and version codes. - (call_eh_info): add presence of eh_info to runtime description of - struct cp_eh_info. - (expand_end_eh_spec): call start_catch_block() and end_catch_block(). - * semantics.c (finish_try_block): call start_catch_block() and - end_catch_block(). - * parse.y (function_try_block): call start_catch_block() and - end_catch_block(). - -Thu May 14 12:27:34 1998 Brendan Kehoe - - * typeck.c (original_type): New function. - (common_type): Use it to get the DECL_ORIGINAL_TYPE for T1 and T2, - to see if they're actually the same. - * cp-tree.h (original_type): Declare. - -Wed May 13 12:54:30 1998 Kaveh R. Ghazi - - * Makefile.in (lex.o): Depend on output.h. - - * call.c (add_function_candidate): Remove unused variable `cand'. - (add_conv_candidate): Likewise. - (build_builtin_candidate): Likewise. - - * cp-tree.h: Add prototype for `types_overlap_p'. - - * decl.c (signal_catch): Mark parameter `sig' with ATTRIBUTE_UNUSED. - - * decl2.c (merge_functions): Remove unused variables `tmp' and - `tempn'. - - * error.c (expr_as_string): Mark parameter `v' with ATTRIBUTE_UNUSED. - (code_as_string): Likewise. - (language_as_string): Likewise. - (parm_as_string): Likewise. - (op_as_string): Likewise. - (assop_as_string): Likewise. - (cv_as_string): Likewise. - - * lex.c: Include output.h. - - * pt.c (type_unification): Cast first argument of `bzero' to a char*. - - * search.c (dfs_no_overlap_yet): Mark parameter `t' with - ATTRIBUTE_UNUSED. - - * tinfo.cc (__class_type_info::dcast): Change the type of variable - `i' from int to size_t. - - * typeck.c (language_lvalue_valid): Mark parameter `exp' with - ATTRIBUTE_UNUSED. - -Tue May 12 21:37:49 1998 Jason Merrill - - * error.c (dump_simple_decl): Use DECL_CLASS_SCOPE_P and/or - DECL_NAMESPACE_SCOPE_P. - (lang_decl_name): Likewise. - * pt.c (tsubst_friend_function, tsubst): Likewise. - * decl.c (pushdecl, redeclaration_error_message, start_decl, - cp_finish_decl, start_function): Likewise. - * class.c (finish_struct_1): Likewise. - * call.c (build_over_call): Likewise. - (compare_ics): Use DERIVED_FROM_P. - -Tue May 12 07:24:18 1998 Mark Mitchell - - * cp-tree.h (CANONICAL_TYPE_VARIANT): New macro. - * method.c (build_mangled_name): Use it. - (build_decl_overload_real): Likewise. - - * error.c (dump_simple_decl): New function, broken out from ... - (dump_decl): Use it. - -Mon May 11 11:38:07 1998 Mark Mitchell - - * ptree.c (lang_print_xnode): Add missing `break'. - - * pt.c (tsubst): Remove duplicate check for IDENTIFIER_NODE. - - * call.c (add_template_candidate): Adjust for changes to - fn_type_unification. - (add_template_candidate_real): Likewise. - (add_template_conv_candidate): Likewise. - (build_user_type_conversion_1): Likewise. - (build_new_function_call): Likewise. - (build_object_call): Likewise. - (build_new_op): Likewise. - (build_new_method_call): Likewise. - * class.c (instantiate_type): Likewise. - * cp-tree.h (unification_kind_t): New type. - (fn_type_unification): Adjust prototype. - (type_unificaiton): Likewise. - * pt.c (UNIFY_ALLOW_NONE): New macro. - (UNIFY_ALLOW_MORE_CV_QUAL): Likewise. - (UNIFY_ALLOW_LESS_CV_QUAL): Likewise. - (UNIFY_ALLOW_DERIVED): Likewise. - (unify): Change prototype. - (maybe_adjust_types_for_deduction): New function. - (check_cv_quals_for_unify): Likewise. - (determine_specialization): Adjust. - (fn_type_unification): Likewise. - (type_unification): Likewise. - (type_unification_real): Likewise. Use - maybe_adjust_types_for_deduction. Fix mishandling of - back-unification of template functions passed as arguments. Pass - appropriate combination of UNIFY_ALLOW_* to unify. - (unify): Remove unused NTPARMS parameter. Use - check_cv_quals_for_unify. Remove bogus code that allowed - too-generous unification in order to adhere more closely to standard. - (get_bindings_real): Adjust. - (get_class_bindings): Likewise. - - * method.c (build_overload_identifier): Only use the innermost - template arguments when mangling. - * pt.c (tsubst_template_argument_vector): New function. - (complete_template_args): Deal with the situation where the - extra_args contain more than one level of arguments. - (lookup_template_class): Deal with member template classes, which - may have more than one level of arguments. - (tsubst): Don't tsbust into the TREE_TYPE of an IDENTIFIER_NODE. - Improve handling of member template classes. Use - DECL_PRIMARY_TEMPLATE instead of inline expansion. Use - tsubst_template_argument_vector where appropriate. - (regenerate_decl_from_template): Break out from ... - (instantiate_decl): Here. - - * lex.c (yyprint): Remove TYPENAME_ELLIPSIS. - * parse.h: Regenerated. - * parse.c: Really regenerated. - - * cp-tree.h (finish_unary_op_expr): New function. - (finish_id_expr): Likewise. - (begin_new_placement): Likewise. - (finish_new_placement): Likewise. - (finish_declarator): Likewise. - (finish_translation_unit): Likewise. - (finish_parmlist): Likewise. - (begin_class_definition): Likewise. - (finish_class_definition): Likewise. - (finish_default_args): Likewise. - (finish_inline_definitions): Likewise. - * parse.y (GCC_ASM_KEYWORD): Remove. - (TYPENAME_ELLIPSIS): Likewise. - * parse.c: Regenerated. - Use new functions in semantics.c in the actions for many rules. - * gxx.gperf (GCC_ASM_KEYWORD): Just use ASM_KEYWORD. - * hash.h: Regenerated. - * semantics.c (finish_expr_stmt): Allow NULL expr. - (finish_unary_op_expr): New function, containing - code previously in parse.y. - (finish_id_expr): Likewise. - (begin_new_placement): Likewise. - (finish_new_placement): Likewise. - (finish_declarator): Likewise. - (finish_translation_unit): Likewise. - (finish_parmlist): Likewise. - (begin_class_definition): Likewise. - (finish_class_definition): Likewise. - (finish_default_args): Likewise. - (finish_inline_definitions): Likewise. - -Sun May 10 23:43:13 1998 Mark Mitchell - - * typeck.c (build_c_cast): Don't decay arrays and functions to - pointer type when converting to a class type. - -Sun May 10 22:53:56 1998 Jason Merrill - - * cp-tree.h (DECL_NAMESPACE_SCOPE_P): New macro. - (DECL_CLASS_SCOPE_P): Likewise. - -Sun May 10 22:48:22 1998 H.J. Lu (hjl@gnu.org) - - * class.c (finish_struct_1): Use OVL_CURRENT on TREE_VEC_ELT. - * decl2.c (constructor_name_full): Likewise. - -Sun May 10 22:48:12 1998 Mike Stump - - * tree.c (mapcar): Add OVERLOAD support. - - * init.c (resolve_offset_ref): We must use basetype_path before we - destroy it with a call to convert_pointer_to. - -Sat May 9 14:44:37 1998 Jason Merrill - - * class.c (currently_open_class): New fn. - * decl.c (lookup_name_real): Use it. - * search.c (lookup_field): Likewise. - -Fri May 8 23:32:42 1998 Martin von Loewis - - * cp-tree.def (OVERLOAD): New node. - * cp-tree.h (BINDING_TYPE, SET_IDENTIFIER_GLOBAL_VALUE, - SET_IDENTIFIER_NAMESPACE_VALUE): Define. - (NAMESPACE_BINDING): Remove. - (IDENTIFIER_GLOBAL_VALUE, IDENTIFIER_NAMESPACE_VALUE): Use - namespace_binding. - (OVL_FUNCTION, OVL_CHAIN, OVL_CURRENT, OVL_NEXT, OVL_USED): - Define. - (tree_overload): New struct. - (IDENTIFIER_TYPE_VALUE): Use identifier_type_value. - (REAL_IDENTIFIER_TYPE_VALUE): Define. - (IDENTIFIER_HAS_TYPE_VALUE): Use IDENTIFIER_TYPE_VALUE. - (lang_decl_flags): Remove in_namespace. - (lang_decl): Remove chain. - (DECL_CHAIN, DECL_NAMESPACE): Remove. - (flag_honor_std): Declare extern. - (identifier_type_value, pushdecl_namespace_level, push_using_decl, - namespace_binding, set_namespace_binding, - lookup_function_nonclass, cat_namespace_levels, - set_decl_namespace, lookup_arg_dependent, binding_init, ovl_cons, - scratch_ovl_cons, ovl_member, build_overload): Declare. - (decl_list_length, get_namespace_id, current_namespace_id, - overloaded_globals_p): Remove. - (lookup_using_namespace, qualified_lookup_using_namespace): Change - return type. - (push_scratch_obstack): New macro. - * call.c (add_function_candidate): Special-case type of OVERLOAD node. - (build_user_conversions_1): Iterate using OVL_NEXT for ctors, - convs, fns. - (build_new_function_call): Iterate using OVL_CHAIN. - Print DECL_NAME in when reporting ambiguities. - (build_object_call): Iterate using OVL_NEXT for fns, convs. - (build_new_op): Call lookup_function_nonclass. - Iterate using OVL_NEXT. - (build_op_delete_call): Change detection of members. - Do not wrap TREE_LIST around fields and single global functions. - (build_over_call): Don't push a class level if the context is a - namespace. - (build_new_method_call): Iterate using OVL_NEXT. - * class.c (add_method): Chain overloaded members using - build_overload. Remove copying of method. - (grow_method): When iterating through the obstack, expect OVERLOAD - nodes. Chain overload members. - (finish_struct_methods): Chain overload members. Unpack OVERLOAD - nodes in call to get_baselinks. - (duplicate_tag_error): Expect OVERLOAD nodes when unchaining. - (finish_struct_1): Iterate over ctor using OVL_NEXT. Handle - fdecls that are OVERLOAD nodes. - (validate_lhs): New function. - (instantiate_type): Do not copy OVERLOAD nodes. Remove dead - code. Use DECL_NAME in error messages. Split code between global - and member function processing. - * decl.c (global_type_node): New static variable. - (in_std): New global. - (struct binding_level): New field usings. - (resume_binding_level): Assert that we are not in a class. - (toplevel_bindings_p): Just check for namespace_p or - pseudo_global. - (resume_level): Remove. - (find_binding): New function. - (binding_for_name): Call it. - (namespace_binding, set_namespace_binding): New functions. - (push_namespace): Associate binding level with new namespace, - resume_binding_level for existing namespace. Remove old code. - Fake std by counting. - (store_bindings): Use REAL_IDENTIFIER_TYPE_VALUE. - (maybe_push_to_top_level): Save current namespace. - (pop_from_top_level): Restore saved namespace. - (pop_namespace): Call suspend_binding_level. Remove old code. - (cat_namespace_levels): New function. - (set_identifier_type_value_with_scope): For namespace bindings, - set BINDING_TYPE, and use global_type_node. - Use REAL_IDENTIFIER_TYPE_VALUE otherwise. - (identifier_type_value): New function. - (pushtag): If no context, use current_namespace. - (duplicate_decls): Don't process DECL_CHAIN. - (pushdecl): Set DECL_CONTEXT to current_namespace, if it is not - already set. Never reset it to NULL_TREE. Lookup global variables - in their namespace. Push overloaded templates if they are on - namespace level. - (pushdecl_namespace_level): New function. - (pushdecl_top_level): Implement using pushdecl_namespace_level. - (pushdecl_using_decl): New function. - (overloaded_globals_p): Remove. - (push_overloaded_decl): Create OVERLOAD nodes, and iterate through - them. Use namespace_binding and set_namespace_value. - (redeclaration_error_message): Complain if the declarations come - from different namespaces. - (lookup_tag): On namespace level, look in the BINDING_TYPE. - (lookup_namespace_name): Pass tree_bindings from stack. Remove - old code. - (select_decl): New function. - (lookup_name_real): Call it for qualified and unqualified lookup. - Pass tree_bindings from the stack. - If prefer_type is 1, also accept namespaces. - (lookup_function_nonclass): New function. - (init_decl_processing): Set the binding level of the global - namespace to global_binding_level. - Build a proper type list for __builtin_apply. - Initialize std_node to "fake std" if flag_honor_std is set. - Initialize global_type_node. - Allocated bad_alloc in namespace std if flag_honor_std. - (define_function): Set the DECL_CONTEXT to the current_namespace. - (start_decl): A namespace is not considered as a context here. If - the DECL_CONTEXT is a namespace, push the decl. - (cp_finish_decl): Check for namespaces used as initializers. - (grokfndecl): Add namespace parameter. Remove processing of - DECL_CHAIN. - (grokvardecl): Add namespace parameter. - (grokdeclarator): Process SCOPEs that are namespaces. For - mangling, temporarily set the DECL_CONTEXT on anonymous structs. - (start_function): Check for contexts that are namespaces. - Set context for declarations that have not been pushed. - (store_parm_decls): Check for ::main only. - (finish_function): Likewise. - (start_method): Check for contexts that are namespaces. - (start_method): Remove DECL_CHAIN processing. - * decl2.c (flag_honor_std): Declare. - (lang_decode_option): Set it if -fhonor-std or -fnew-abi is given. - (decl_namespace_list): New static global. - (grok_x_components): Ignore namespaces as type contexts. - (check_classfn): Expect OVERLOAD nodes. - (grokfield): Remove DECL_CHAIN processing. - (finish_file): Call cat_namespace_levels. - (merge_functions): New function. - (ambiguous_decl): Rewrite. - (lookup_using_namespace): Produce tree_bindings. - (qualified_lookup_using_namespace): Likewise. - (set_decl_namespace, decl_namespace, current_decl_namespace, - push_decl_namespace, pop_decl_namespace): New functions. - (arg_lookup): New struct. - (add_function, arg_assoc_namespace, arg_assoc_class, - arg_assoc_type, arg_assoc_args, arg_assoc, lookup_arg_dependent): - New functions. - (get_namespace_id, current_namespace_id): Remove. - (do_toplevel_using_decl): Rewrite. - (do_class_using_decl): Complain about namespace qualifiers. - (do_using_directive): Sorry if not on namespace level. Complain - about unknown namespaces. - * error.c (dump_aggr_type): Check for namespace contexts. - * except.c (init_exception_processing): Push terminate into std. - * friend.c (is_friend): A namespace is not a context, here. - * init.c (expand_member_init): Remove DECL_CHAIN processing. - (build_offset_ref): Process OVERLOAD nodes. - * lang-specs.h (__HONOR_STD): Define if -fnew-abi or -fhonor-std. - * lex.c (identifier_type): Loop using OVL_CHAIN. - (see_typename): Set looking_for_typename to 2. - (real_yylex): Likewise. - (do_identifier): Expect OVERLOAD nodes instead of TREE_LISTs. - (do_scoped_id): Expect OVERLOAD nodes. - Change calling convention for qualified_lookup_using_namespace. - (build_lang_decl): Don't set in_namespace anymore. - * method.c (typevec_size): New global. - (build_overload_nested_name): Return if global_namespace. - Otherwise, always expect a declaration context. - (build_qualified_name): Likewise. - Make sure we don't write beyond typevec_size. - (build_decl_overload_real): Likewise. - Allocate one extra slot for the namespace. - (hack_identifier): Mark code dead. - Process OVERLOAD and NAMESPACE_DECL nodes. - * parse.y (program): Pop namespaces until in global namespace. - (extdef): In a using-declaration, don't discard the identifier if - there is no declaration. - (left_curly): Ignore type contexts which are namespaces. - (typename_sub2): Use IDENTIFIER_TYPE_VALUE to retrieve the type - used as scope. - * pt.c (template_class_depth): Expect types to be namespaces. - (determine_specialization): Simplify by expecting OVERLOAD nodes. - (push_template_decl): Push into namespace level. - Reset ctx if it is a namespace. - Set DECL_CONTEXT to current_namespace if not set already. - Ignore real contexts that are namespaces. - (mangle_class_name_for_template): Skip global_namespace. - Mangle other namepaces as declarations. - (lookup_template_function): Set type of OVERLOAD nodes to unknown. - (lookup_template_class): Push into namespace of context. - If the context is a namespace, set it to global_namespace. - Use id_context for mangling. - (for_each_template_parm): Handle OVERLOAD and NAMESPACE_DECL nodes. - (tsubst_friend_function): Ignore namespace contexts. - Push into namespace level. - (tsubst): Handle NAMESPACE_DECL nodes. - Remove DECL_CHAIN processing. - (type_unification_real): Recognize OVERLOAD instead of TREE_LIST nodes. - * ptree.c (print_lang_identifier): Print bindings. - (lang_print_xnode): Print OVERLOAD nodes. - * rtti.c (init_rtti_processing): Push type_info into std. - * search.c (lookup_fnfields_here): Expect OVERLOAD nodes. - (lookup_fnfields_1, get_virtuals_named_this, get_matching_virtual, - dfs_debug_mark, dfs_pushdecls, dfs_compress_decls, add_conversions, - lookup_fnfields_here): Likewise. - Process all nodes, instead of going through TREE_CHAIN. - * sig.c (build_signature_pointer_or_reference_type): Set context - to global_namespace. - (build_signature_table_constructor): Expect OVERLOAD nodes. - * spew.c (yylex): Save old setting of looking_for_typename. - * tree.c (decl_list_length): Remove. - (binding_init): New function. - (count_functions): Rewrite. - (is_overloaded_fn): Expect OVERLOAD nodes. - (really_overloaded_fn, get_first_fn, lvalue_type): Likewise. - (ovl_cons, scratch_ovl_cons, build_overload, build_overload_after, - ovl_member): New functions. - * typeck.c (require_complete_type): Expect OVERLOAD nodes. - (type_unknown_p): Likewise. - (require_instantiated_type): Likewise. - (build_component_ref): Declare code dead. - (build_x_function_call): Create and expect OVERLOAD nodes. - (build_function_call_real): Check for ::main only. - (build_unary_op): Likewise. Expect OVERLOAD nodes. - (convert_for_assignment): Check for TREE_LIST before accessing - TREE_VALUE. - * decl.c (duplicate_decls): Check for namespace bindings instead - of global bindings. - (pushdecl, push_overloaded_decl, lookup_tag, lookup_name_real, - lookup_name_current_level, start_decl, xref_tag, - finish_enum): Likewise. - * init.c (build_offset_ref): Likewise. - * search.c (lookup_field): Likewise. - (lookup_fnfields): Likewise. - (dfs_debug_mark): Likewise. - * decl.c (poplevel): Use SET_IDENTIFIER_TYPE_VALUE. - (poplevel_class, pop_from_top_level): Likewise. - * decl2.c (finish_method): Likewise. - * class.c (build_vtable): Use SET_IDENTIFIER_GLOBAL_VALUE. - * decl.c (record_builtin_type): Likewise. - (init_decl_processing, grokfndecl): Likewise. - * lex.c (get_time_identifier, do_identifier, do_scoped_id): Likewise. - (make_lang_type): Likewise. - * parse.y (make_thunk): Likewise. - * pt.c (tsubst): Likewise. - * tree.c (debug_binfo): Likewise. - * exception.cc, new.cc, new1.cc, new2.cc, tinfo.cc, tinfo.h, - tinfo2.cc, inc/new.h: Add std qualifications. - * inc/new: Wrap with namespace std if __HONOR_STD. - * inc/typeinfo: Likewise. - -Fri May 8 00:43:50 1998 Jason Merrill - - * call.c (build_user_type_conversion_1): Handle second_conv - properly for templates. - -Thu May 7 17:09:25 EDT 1998 Andrew MacLeod - - * method.c (build_decl_overload_real): Set TREE_USED flag to - zero for build_type_variants nodes as well. - -Wed May 6 19:27:09 1998 Jason Merrill - - * pt.c (tsubst): Don't tsubst the type of an IDENTIFIER_NODE. - -Wed May 6 16:49:48 1998 Jim Wilson - - * Makefile.in (call.o, class.o, decl.o, decl2.o, errfn.o, error.o, - except.o, expr.o, friend.o, init.o, lex.o, method.o, pt.o, repo.o, - rtti.o, search.o, semantics.o, sig.o, tree.o, typeck.o, typeck2.o, - xref.o): Add toplev.h dependencies. - -Wed May 6 16:44:58 1998 Jeffrey A Law (law@cygnus.com) - - * errfn.c (cp_error, cp_warning): Remove declarations for - error and warning respectively. - -Wed May 6 14:28:18 1998 Kaveh R. Ghazi - - * error.c: Convert to using ctype macros defined in system.h. - * method.c: Likewise. - * xref.c: Likewise. - * lex.c: Likewise. Also remove redundant system header stuff. - -Wed May 6 06:36:41 1998 Robert Lipe - - * call.c, class.c, decl.c, decl2.c, errfn.c, error.c, except.c, - expr.c, friend.c, init.c, lex.c, method.c, pt.c, repo.c, rtti.c, - search.c, semantics.c, sig.c, tree.c, typeck.c, typeck2.c, - xref.c: Add include of toplev.h. - -Wed May 6 02:33:39 1998 Jason Merrill - - * tree.c (perm_manip): Also regenerate the RTL of an extern. - (copy_to_permanent): Use end_temporary_allocation. - -Tue May 5 23:54:04 1998 Jason Merrill - - * init.c (expand_vec_init): The initialization of each array - element is a full-expression. - -Tue May 5 18:24:13 EDT 1998 Andrew MacLeod - - * method.c (build_mangled_name): Add a call to build_type_variant - to get the right type. - -Tue May 5 01:25:03 1998 Jason Merrill - - * Makefile.in: Add .SUFFIXES. - - * cp-tree.def: Remove NAMESPACE_DECL. - -Sun May 3 01:32:14 1998 Jason Merrill - - * call.c (build_over_call): Do evaluate arg even if it has empty - class type. - * decl.c (start_function): Don't push a member function. - -Thu Apr 30 18:59:23 1998 Jim Wilson - - * Makefile.in (g++FAQ.info): Put -o option before input file. - -Thu Apr 30 13:05:33 EDT 1998 Andrew MacLeod - - * gxxint.texi: Add info for squangling codes K and B. - -Tue Apr 28 13:22:01 1998 Mark Mitchell - - * semantics.c (begin_stmt_expr): Avoid duplicating the effect of - the expression in templates. - (finish_stmt_expr): Likewise. - -1998-04-28 Brendan Kehoe - - * decl2.c (ambiguous_decl): Fix NAME parm to be a tree, not int. - -Mon Apr 27 13:58:10 1998 Mark Mitchell - - * decl.c (maybe_push_to_top_level): Always clear - current_template_parms and processing_template_decl. - (pushtag): Remove check of current_class_type and some comments, - since maybe_push_to_top_level no longer creates confusion. - -Sun Apr 26 12:10:18 1998 Mark Mitchell - - * cp-tree.h (CLASSTYPE_IS_TEMPLATE): New macro. - (DECL_CLASS_TEMPLATE_P): Likewise. - (DECL_PRIMARY_TEMPLATE): Likewise. - (PRIMARY_TEMPLATE_P): Use it. - (push_template_decl_real): New function. - (redeclare_class_template): Take new template parameters as - input. - (is_specialization_of): New function. - (comp_template_args): Declare. - * decl.c (pushtag): Handle friend template classes. - (xref_tag): Likewise. Use new calling convention for - redeclare_class_template. - * decl2.c (grok_x_components): Handle friend templates. - * friend.c (is_friend): Use is_specialization_of where - appropriate. Deal with friend class templates. - (make_friend_class): Let a class template be friends with itself. - * pt.c (comp_template_args): Remove declaration. - (tsubst_friend_class): New function. - (push_template_decl_real): New function. - (push_template_decl): Use it. - (redeclare_class_template): Adjust for new calling convention. - (comp_template_args): Give it external linkage. - (instantiate_class_type): Use tsubst_friend_class to deal - with friend templates. - * typeck.c (comptypes): Use comp_template_args, rather than - expanding it inline. - * parse.y (component_decl): Handle a nested template type - like other component type declarations. - - * pt.c (check_explicit_specialization): Handle overloaded - constructors correctly. - - * pt.c (mabybe_get_template_decl_from_type_decl): New function. - (lookup_template_class): Use it. - -Thu Apr 23 21:19:06 1998 Jason Merrill - - * cp-tree.def: Add WRAPPER. USER_CONV now only has two ops. - * cp-tree.h: Add WRAPPER support. - * call.c (add_candidate): Split out from add_*_candidate fns. - (build_over_call): Take the candidate instead of function and args. - Enforce access control here. Emit overload warnings here. - (add_warning): New fn. - (joust): Add WARN parm. If not set, call add_warning instead of - printing a warning. Reenable some warnings. - (tourney): Pass it. - (convert_like): Adjust. - (build_new_op): Adjust. - (build_new_function_call): Adjust. - (build_user_type_conversion_1): Adjust. - (USER_CONV_FN): Adjust. - * tree.c (build_expr_wrapper, build_expr_ptr_wrapper, - build_int_wrapper): New fns. - -Thu Apr 23 18:27:53 1998 Mark P. Mitchell - - * pt.c (unify): Fix typo in previous change. - -Thu Apr 23 09:32:58 1998 Jason Merrill - - * error.c (dump_type_real): Declare canonical_name. - - * typeck.c (comp_target_types): Fix PMFs. - -Wed Apr 22 13:24:48 1998 Mark Mitchell - - * class.c (finish_struct): Set TREE_PRIVATE and TREE_PROTECTED for - the DECL_RESULTs of a member TEMPLATE_DECL, not just the - TEMPLATE_DECL. - - * pt.c (tsubst): Decrease the template-level of - TEMPLATE_TEMPLATE_PARMS. Likewise for the DECL_INITIAL of a - TEMPLATE_PARM_INDEX. - (template_decl_level): New function. - (unify): Make sure to record unifications for template - parameters, even when the parameters exactly match the arguments. - Combine duplicated code for TEMPLATE_TEMPLATE_PARMs and - TEMPLATE_TYPE_PARMS. Don't try to unify template parameters that - aren't from the level we're currently working on. - -Tue Apr 21 22:00:04 1998 Mark Mitchell - - * errfn.c (cp_thing): Use xrealloc, not xmalloc, to copy memory. - - * decl2.c (check_member_template): Set DECL_IGNORED for member - class templates, too. - - * decl2.c (grokfield): Remangle the name of a member TYPE_DECL. - -Tue Apr 21 18:59:11 1998 Benjamin Kosnik - - * decl.c (duplicate_decls): Only check DECL_FRIEND_P if function. - -Tue Apr 21 14:22:00 1998 Jeffrey A Law (law@cygnus.com) - - * cp-tree.h (intTI_type_node, unsigned_intTI_type_node): Declare. - * decl.c (intTI_type_node, unsigned_intTI_type_node): Define. - (init_decl_processing): Handle TI types. - * typeck.c (unsigned_type, signed_type): Handle TI types. - -Sat Apr 18 15:25:21 1998 Jim Wilson - - * g++spec.c (lang_specific_driver): New argument in_added_libraries. - New local added_libraries. Increment count when add library to - arglist. - -Fri Apr 17 21:25:00 1998 Mark Mitchell - - * cp-tree.h (type_as_string_real): New function. - * pt.c (mangle_class_name_for_template): Use it. - * error.c (dump_aggr_type): Change prototype. - (dump_type_prefix): Likewise. - (dump_type_suffix): Likewise. - (dump_type_real): Convert from dump_type. If desired, the - "canonica" name of a typedef, i.e., the name of the underlying - type, can be printed. - (dump_type): Call dump_type_real. - -Fri Apr 17 14:30:45 1998 Jason Merrill - - * decl2.c (lang_decode_option): -fnew-abi implies -fvtable-thunks. - - * typeck.c (comp_target_types): Tweak pedantic case. - (comp_target_parms): Tweak pedantic case. Clean up somewhat. - Return -1 or 1 instead of 1 or 2. - (compparms): Remove STRICT handling. - (convert_for_assignment): Fix handling of pmfs. - -Fri Apr 17 14:04:16 1998 Mark Mitchell - - * typeck.c (comp_target_types): Handle references like pointers. - (comp_target_parms): Note that return code from comp_target_types - can be negative to indicate failure. - -Fri Apr 17 09:10:52 1998 Andreas Schwab - - * Make-lang.in (c++.all.build): Don't depend on $(DEMANGLER_PROG), - which requires a working target compiler to build. - -Fri Apr 17 08:57:35 1998 Jeffrey A Law (law@cygnus.com) - - * tree.c (avoid_overlap): Add prototype. - - * spew.c (num_tokens): Add prototype. - (nth_noken, add_token, consume_token, debug_yychar): Likewise. - - * search.c (dfs_check_overlap): Add prototype. - (dfs_no_overlap_yet): Likewise. - - * pt.c (original_template): Add prototype. - (inline_needs_template_parms): Likewise. - (push_inline_template_parms_recursive): Likewise. - (retrieve_specialization, register_specialization): Likewise. - (print_candidates, reduce_template_parm_level): Likewise. - (build_template_decl, mark_template_parm): Likewise. - (tsubst_friend_function, get_bindings_real): Likewise. - - * method.c (start_squangling): Add prototype. - (end_squangling, check_ktype, issue_ktype): Likewise. - (build_overloaded_scope_ref, check_btype): Likewise. - (build_mangled_template_parm_index): Likewise. - - * lex.c (init_cpp_parse): Add prototype. - (handle_cp_pragma, handle_sysv_pragma): Likewise. - (reduce_cmp, token_cmp): Likewise. - - * except.c (call_eh_info): Add prototype. - (push_eh_info, get_eh_info, get_eh_value, get_eh_type): Likewise. - (get_eh_caught, get_eh_handlers, do_pop_exception): Likewise. - - * decl2.c (is_namespace_ancestor): Add prototype. - (namespace_ancestor, add_using_namespace): Likewise. - (ambiguous_decl): Likewise. - - * decl.c (indent): Add prototype. - - * call.c (add_template_candidate_real): Add prototype. - -Fri Apr 17 01:57:12 1998 Jason Merrill - - * decl2.c (build_expr_from_tree): Just return a PMF. - -Fri Apr 17 00:45:12 1998 Mark Mitchell - - * typeck2.c (process_init_constructor): Don't strip cv-qualifiers - when doing initializations. - - * pt.c (unify): Use comptypes to compare type args. - -Fri Apr 17 00:24:22 1998 Jason Merrill - - * decl.c (duplicate_decls): Fix check for when it's safe to free - the new decl. - - * pt.c (mangle_class_name_for_template): Don't pass a typedef type - to type_as_string. - -Thu Apr 16 17:47:30 1998 Jeffrey A Law (law@cygnus.com) - - * pt.c (build_template_parm_index): Add prototype. - - * search.c (my_tree_cons): Don't clear words outside the - newly allocated node. - -Wed Apr 15 15:34:44 1998 Dave Brolley - - * lex.c (init_parse): Now returns char* containing the filename. - -Wed Apr 15 13:20:06 1998 John Carr - Jeff Law - - * errfn.c: Rework to avoid problems when HOST_WIDE_INT is longer - than a pointer. - -Sun Apr 12 22:31:19 1998 Richard Kenner - - * cvt.c (cp_convert_to_pointer): Use TYPE_PRECISION. - -Fri Apr 10 12:16:49 1998 Benjamin Kosnik - - * decl.c (duplicate_decls): Don't warn for redundant decls if - friend: let add_friend take care of it. - -Thu Apr 9 02:40:48 1998 Jason Merrill - - * sig.c (build_signature_pointer_constructor): Don't set - TREE_HAS_CONSTRUCTOR for a signature pointer. - * cvt.c (ocp_convert): Don't force a temporary for internal structs. - * init.c (resolve_offset_ref): Warn about implicit & on pmfs - here, too. - * typeck.c (build_unary_op): Only allow taking the address of a - real constructor. - * typeck2.c (digest_init): Simplify. - (store_init_value): Don't pedwarn about using { } for pmfs. - -Thu Apr 9 22:16:57 1998 Per Bothner - - * cp-tree.h (start_decl): Update prototype. - * decl.c (start_decl): Like the C version, new parameters - for the attributes. Call cplus_decl_attributes here, - (pushdecl): Like C version, do build_type_copy if TYPE_DECL, - (grokdeclarator): Pass NULL for new start_decl arguments. - * pt.c (tsubst_expr): Likewise. - * parse.y: Merge cplus_decl_attribute calls into start_decl calls. - * typeck.c (common_type): Check TYPE_MAIN_VARIANT. - * lex.c (build_lang_decl): Add lang_name_java. - * class.c (push_lang_context): Add lang_name_java. - * method.c (build_mangled_name): Check for is_java_type. - -Thu Apr 9 22:16:57 1998 Benjamin Kosnik - - * decl.c (grokdeclarator): Check TYPE_MAIN_VARIANT. - * call.c (build_scoped_method_call): Check for TREE_CODE for - VOID_TYPE instead of type == void_type_node. - (build_method_call): Ditto. - * decl.c (lookup_name_real): Ditto. - (grokdeclarator): Ditto. - (start_decl): Ditto. - (grokparms): Ditto. - (start_function): Ditto. - (finish_function): Ditto. - (start_method): Ditto. - -Thu Apr 9 00:18:44 1998 Dave Brolley (brolley@cygnus.com) - - * lex.c (finput): New variable. - (init_cpp_parse): Renamed from init_parse. - (init_parse): Handle !USE_CPPLIB. Call init_cpp_parse when finished. - (finish_parse): New function. - * cp-tree.h (init_lex, init_parse): Remove declarations. - -Mon Apr 6 02:25:05 1998 Jason Merrill - - * call.c (build_call): Still evaluate the actual argument. - * class.c (is_empty_class): Update for -fnew-abi. - - * decl2.c: -fnew-abi implies -fsquangle. - - * method.c (do_build_assign_ref): Don't do anything to copy - an empty class. - (do_build_copy_constructor): Likewise. - * call.c (build_over_call): Likewise. - -Sat Apr 4 18:43:58 1998 Jason Merrill - - * tree.c (avoid_overlap): Return a value. - -Sat Apr 4 12:52:35 1998 Jeffrey A Law (law@cygnus.com) - - * method.c (check_btype): Add missing argument to xrealloc. - (check_ktype): Likewise. - -Fri Apr 3 02:22:59 1998 Jason Merrill - - Implement empty base optimization. - * class.c (finish_struct_1): Add vbase fields earlier. Set - CLASSTYPE_SIZE of an empty base to 0. Types with bases can be empty. - * search.c (dfs_check_overlap, dfs_no_overlap_yet): New fns. - (types_overlap_p): New fn. - * tree.c (avoid_overlap): New fn. - (build_base_fields): Use it to avoid overlapping empty bases. - * cp-tree.h, decl2.c, lang-options.h: Add -fnew-abi. - - * decl.c (cplus_expand_expr_stmt): Strip unused INDIRECT_REFs. - - Re-implement allocation of base class subobjects. - * tree.c (unshare_base_binfos): New fn. - (layout_basetypes): Use it. Now handles offsets of both virtual and - non-virtual bases, after layout_type. - (layout_vbasetypes): Remove. - (build_base_fields): Generate FIELD_DECLs for each non-virtual base. - (build_vbase_pointer_fields): Split out from old layout_basetypes. - * class.c (finish_base_struct): Lose offset handling code. - Move nonvdtor warning here. Don't mess with t_binfo anymore. - (finish_struct_1): Don't mess with t_binfo anymore. Use fns above. - * cp-tree.h: Adjust. - -Thu Apr 2 14:25:13 1998 Jason Merrill - - * cp-tree.h: Lose CLASSTYPE_VBASE_SIZE, some unused stuff. - * decl.c, decl2.c, pt.c, ptree.c, lex.c: Likewise. - * class.c (duplicate_tag_error): Likewise. - (finish_struct_1): Set CLASSTYPE_SIZE, CLASSTYPE_MODE, CLASSTYPE_ALIGN. - * tree.c (layout_vbasetypes): Update from layout_record, remove - var_size support, use CLASSTYPE_SIZE instead of CLASSTYPE_VBASE_SIZE. - (layout_basetypes): Likewise. - -Wed Apr 1 18:22:25 1998 Jeffrey A Law (law@cygnus.com) - - * class.c, Make sure system.h is included just after config.h. - Delete lingering stdio and errno references too. - * decl.c, errfn.c, parse.y, ptree.c search.c, xref.c: Likewise. - -Wed Apr 1 15:38:36 1998 Jason Merrill - - * friend.c (is_friend): Fix access control for local classes. - - * class.c (is_empty_class): New fn. - * call.c (build_call): Don't pass empty class objects to a function. - -Wed Apr 1 14:58:35 1998 Mark Mitchell - - * call.c (build_over_call): Do name resolution for default - arguments of function templates in the scope of the templates. - -Tue Mar 31 13:43:57 1998 Jeffrey A Law (law@cygnus.com) - - * call.c: Include system.h. Remove includes, declarations and - defines provided by system.h. - * class.c, cvt.c, decl.c, decl2.c, errfn.c error.c: Likewise. - * except.c, expr.c friend.c, g++spec.c, init.c, input.c: Likewise. - * lex.c, parse.y, pt.c, ptree.c repo.c rtti.c, search.c: Likewise. - * semantics.c, sig.c, spew.c, tree.c, typeck.c: Likewise. - * typeck2.c, xref.c: Likewise. - * Makefile.in: Dependencies updated as appropriate. - * Make-lang.in: Likewise. - -Mon Mar 30 12:15:00 1998 Mark Mitchell - - * pt.c (fn_type_unification): Allow incomplete unification without - an immediate error message. - -Mon Mar 30 08:55:42 1998 Jason Merrill - - * tree.c (member_p): New fn. - * decl2.c (finish_file): Only set DECL_STATIC_FUNCTION_P for - initializing class members. - - * cp-tree.def (TEMPLATE_PARM_INDEX): Class 'x'. - * ptree.c (lang_print_xnode): Handle TEMPLATE_PARM_INDEX. - - * call.c (build_method_call): Handle non-scoped destructors, too. - * pt.c (tsubst_copy): Likewise. - - * pt.c (print_template_context): Split out... - (push_tinst_level): ...from here. - - * friend.c (is_friend): Don't pass a type to decl_function_context. - - * typeck.c (convert_for_initialization): Always hand off - conversions to class type. - -Sun Mar 29 20:01:59 1998 Jason Merrill - - * friend.c (is_friend): Local classes have the same access as the - enclosing function. - -Sun Mar 29 00:47:32 1998 Jeffrey A Law (law@cygnus.com) - - * typeck.c (expand_target_expr): Delete dead function. - - * search.c: Put various prototypes inside #ifdef MI_MATRIX. - - * repo.c (save_string): Delete dead function. - - * method.c (thunk_printable_name): Delete dead function. - - * lex.c (yynextch): Delete dead function. - - * expr.c (tree_extract_aggr_init): #if 0 out. - - * except.c (do_unwind): Delete dead function. - (easy_expand_asm): Likewise. - - * cvt.c (build_conversion_type_1): Delete dead function. - - * cp-tree.h (push_expression_obstack): Declare. - - * call.c (source_type): #if 0 out. - - * class.c (alter_access): Remove unused label. Add braces - around empty else clause. - - * lex.c (yyprint): Fix argument to printf. - -Sat Mar 28 17:43:52 1998 Mark Mitchell - - * pt.c (tsubst): Clear TREE_USED for new FUNCTION_DECLs. - - * pt.c (instantiate_class_template): Make sure template - arguments are permanent. - * init.c (resolve_offset_ref): Don't go looking around in - template types. - - * semantics.c: Add routines to handle expressions, and some - declaration processing. - * parse.y: Use them. - (current_class_depth): Move declaration to cp-tree.h. - * parse.c: Regenerated. - * cp-tree.h: Use them. - (current_class_depth): Declare. - * pt.c (tsubst_copy): Use begin_stmt_expr and finish_stmt_expr. - -Fri Mar 27 20:23:18 1998 Mark Mitchell - - * error.c (dump_decl): Be a bit more explicit with template - type arguments, when verbose. - -Fri Mar 27 18:16:40 1998 Jason Merrill - - * inc/exception: Reorder closing braces. - -Fri Mar 27 13:22:18 1998 Mark Mitchell - - * pt.c (redeclare_class_template): New function. - * cp_tree.h (redeclare_class_template): Declare it. - * decl.c (xref_tag): Use it. - -Thu Mar 26 11:16:30 1998 Jason Merrill - - * call.c (build_over_call): Check IS_AGGR_TYPE, not - TYPE_LANG_SPECIFIC. - * typeck.c (convert_arguments): Likewise. - - * decl.c (grokdeclarator): Remove const and volatile from type after - setting constp and volatilep. - - * class.c (finish_struct_1): Don't warn about bool bitfield larger - than one bit. - -Thu Mar 26 10:25:52 1998 Mark Mitchell - - * pt.c (convert_nontype_argument): STRIP_NOPS where appropriate. - -Thu Mar 26 10:24:05 1998 Mark Mitchell - - * call.c (build_object_call): Complain about ambiguous operator(), - rather that crashing. - (build_new_op): Likewise. - (build_op_delete_call): Likewise. - -Thu Mar 26 10:23:24 1998 Mark Mitchell - - * cvt.c (perform_qualification_conversions): Use comp_target_types - instead of comp_ptr_ttypes. - -Wed Mar 25 16:10:50 1998 Mark Mitchell - - * cp-tree.h (enforce_access): Declare. - * call.c (enforce_access): Make it extern, not static. - * class.c (alter_access): Use enforce_access; modify code for ISO - compliance, rather than ARM rules. - -Wed Mar 25 12:10:45 1998 Kriang Lerdsuwanakij - - * cp-tree.h: Fix typo. - -Wed Mar 25 02:01:02 1998 Jason Merrill - - * expr.c (cplus_expand_expr): Only do PCC_STATIC_STRUCT_RETURN thing - if (aggregate_value_p (type)). - - * decl2.c (constructor_name_full): Handle TYPENAME_TYPE. - -Tue Mar 24 16:12:01 1998 Mark Mitchell - - * tree.c (mapcar): When dealing with a DECL, use it's constant - value, if any. - * pt.c (lookup_template_class): Don't mangle the names of template - classes whose arguments are unknown. - - * pt.c (tsubst_expr): Handle GOTO_STMT correctly. - -Tue Mar 24 12:21:55 1998 Benjamin Kosnik - - * decl.c (init_decl_processing): Set TYPE_PRECISON for bools to 1. - -Tue Mar 24 12:21:48 1998 Jim Wilson - - * decl.c (init_decl_processing): Initialize TYPE_MAX_VALUE for - boolean_type_node to 1. - -Tue Mar 24 10:23:47 1998 Mark Mitchell - - * error.c (dump_expr): Remove unused variable `l'. - - * pt.c (for_each_template_parm): New function, created by - converting uses_template_parms. - (tree_fn_t): New typedef. - (uses_template_parms): Use it. - (mark_template_parm): New function. - (push_template_decl): Check that the argument list of a partial - specialization uses all the template parameters. - - * Make-lang.in (c++filt): Don't delete cxxmain.c after we're done - with it; we might want it for debugging. - * cp-tree.h (type_unification): Change interface. - * class.c (finish_struct_1): Skip nested template types, just like - ordinary nested types. - (instantiate_type): Use new interface to type_unification. - * lex.c (init_lex): Add __sz as opname for sizeof. - * method.c (build_overload_scope_ref): New function. - (build_overload_int): Handle complex expressions. Set - numeric_output_need_bar if necessary. - (build_overload_value): Handle non-PARM_DECL nodes; this - routine is now used by build_overload_int. Remove some - assignments to numeric_output_need_bar. Use - build_overload_scope_ref. - (build_qualified_name): Note that some template mangled names end - with digits, and set numeric_output_need_bar appropriately. Use - build_underscore_int. - * pt.c (unify): Change interface. - (type_unification_real): Likewise. - (determine_specialization): Use new interfaces. - (tsubst): Deal gracefully with situations in which the argument - vector is not fully filled. - (fn_type_unification): Use new interfaces. - (type_unification): Likewise. Remove NOP_EXPR hack. - (type_unification_real): Likewise. - (unify): Likewise. Deal with unification of complex expresions. - -Mon Mar 23 12:24:37 1998 Jason Merrill - - * pt.c (complete_template_args): Initialize skip properly. - - * decl.c (make_typename_type): Revert. - (make_implicit_typename): Remove. - (lookup_name_real): Don't call it. Call lookup_field if we see a - TYPE_DECL from a template base. - * search.c (lookup_field): Do implicit typename stuff. - -Sun Mar 22 00:50:42 1998 Nick Clifton - Geoff Noer - - * Makefile.in: Various fixes for building cygwin32 native toolchains. - * Make-lang.in: Likewise. - -Fri Mar 20 18:07:39 1998 Kriang Lerdsuwanakij - - * pt.c (tsubst, TEMPLATE_TEMPLATE_PARM): Simplify. - -Fri Mar 20 10:42:07 1998 Jason Merrill - - * decl.c (make_implicit_typename): Rewrite removed code. - (make_typename_type): Call it if the type we look up comes from - a base that uses template parms. - - * pt.c (complete_template_args): Rewrite. - (tsubst, FUNCTION_DECL): Use it. - -Fri Mar 20 08:12:43 1998 H.J. Lu (hjl@gnu.org) - - * semantics.c (finish_asm_stmt): Fix combine strings. Call - c_expand_asm_operands () if output_operands, input_operands or - clobbers is not NULL_TREE. - -Fri Mar 20 00:10:19 1998 Kriang Lerdsuwanakij - - * pt.c (complete_template_args): New function. - (get_bindings): Deal with specializations of function templates - with return type containing parameters from outer class - templates. - (tsubst, TEMPLATE_TEMPLATE_PARM): When reducing parameter level, - substitute arguments and compose a new type. - -Thu Mar 19 19:01:48 1998 Mark Mitchell - - * pt.c (tsubst): Clear DECL_PENDING_INLINE_INFO for new - FUNCTION_DECLs. - -Thu Mar 19 11:51:58 1998 Jason Merrill - - * decl.c (make_implicit_typename): Lose useless code. - - * call.c (standard_conversion): Handle A* -> const A* properly. - - * pt.c (get_bindings_real): Rename from get_bindings. Add - check_rettype parm. - (get_bindings): Pass 1. - (get_bindings_overload): Pass 0. - -Wed Mar 19 09:08:12 1998 Mark Mitchell - - * pt.c (check_explicit_specialization): When reverting a static - member function, also remove the `this' parameter from - last_function_parms. - -Thu Mar 19 02:27:48 1998 Jason Merrill - - * pt.c (tsubst_copy, CONST_DECL): Don't bother tsubsting - a function context. - - * decl.c (store_bindings): Use free_binding_vecs. - (pop_from_top_level): Likewise. - -Wed Mar 18 12:41:43 1998 Jason Merrill - - * decl.c (make_implicit_typename): Only change the type of a - TYPENAME_TYPE. - -Wed Mar 18 10:09:51 1998 Mark Mitchell - - * semantics.c: New file, containing routines to perform the - semantic phase of parsing. - * parse.y: Use it. - * pt.c (tsubst_expr): Likewise. - * cp-tree.h: Declare the various functions in semantics.c. - Provide macros to access _STMT tree nodes. - * cp-tree.def: Add ASM_STMT tree node. - * Makefile.in, Make-lang.in: Add dependencies on and for - semantics.c. - -Wed Mar 18 00:24:10 1998 Jason Merrill - - * pt.c (push_template_decl): Only check primary templates. - - * pt.c (check_explicit_specialization): Complain about default args - in explicit specialization. - - * parse.y (nomods_initdcl0): Also call cp_finish_decl for a - constructor_declarator. - -Tue Mar 17 14:44:54 1998 Mark Mitchell - - * typeck2.c (build_x_arrow): Don't crash when an aggregate type - has no overloaded operator ->. - - * call.c (build_field_call): Don't crash when presented with a - field that is actually a nested type. - - * decl.c (pushtag): Deal with friend class injection in local - classes. - - * call.c (build_object_call): Don't crash if OBJ is a - pointer-to-member-function. - -Tue Mar 17 11:40:26 1998 Jason Merrill - - * pt.c (push_template_decl): Complain about template with C linkage, - anonymous template class. - -Mon Mar 16 12:10:39 1998 Jason Merrill - - * class.c (pushclass): Only use the mi_matrix stuff #ifdef MI_MATRIX. - * search.c: Likewise. - - * lex.c (do_pending_defargs): Only call - maybe_{begin,end}_member_template_processing for FUNCTION_DECLs. - - * parse.y (initdcl0_innards): Move maybeasm back into initdcl0 et al. - -Mon Mar 16 10:47:22 1998 Mark Mitchell - - * parse.y: Deal with CONSTRUCTORS in new_initializers. - -Mon Mar 16 10:54:21 1998 Mark Mitchell - - * pt.c (tsubst_copy): Deal with BIND_EXPR in a way that more - closely mimics the behavior in parse.y. - (tsubst_expr): Return the resuting BLOCK when making a tsubst'ing - into a compound statement. - -Sun Mar 15 02:07:26 1998 Jason Merrill - - * cp-tree.h (TEMPLATE_PARMS_FOR_INLINE): New macro. - * pt.c (inline_needs_template_parms): New fn. - (original_template): New fn. - (push_inline_template_parms_recursive): New fn. - (maybe_begin_member_template_processing): Use them. - (maybe_end_member_template_processing): Likewise. - (is_member_or_friend_template): Rename to is_member_template. - Member functions of local classes are never member templates. - -Sun Mar 15 01:14:22 1998 Kriang Lerdsuwanakij - - * lex.c (do_identifier): Handle TEMPLATE_DECL that was - added in the class scope to catch redefinition error. - - * pt.c (reduce_template_parm_level): Also copy - the DECL_TEMPLATE_PARMS field. - -Sun Mar 15 10:54:08 1998 Mark Mitchell - - * pt.c (tsubst): Clear TYPE_REFERENCE_TO when creating a - reduced-level template type parameter. - -Sun Mar 15 12:26:02 1998 Manfred Hollstein - - * cp-tree.h (struct lang_decl_flags): Add needs_final_overrider. - (DECL_NEEDS_FINAL_OVERRIDER_P): New macro. - * class.c (override_one_vtable): Set DECL_NEEDS_FINAL_OVERRIDER_P. - * decl.c (duplicate_decls): Propagate it. - * typeck2.c (abstract_virtuals_error): Use two loops to emit - abstract virtual functions and virtual functions which need a - final overrider separately. - -Thu Mar 12 09:39:40 1998 Manfred Hollstein - - * lang-specs.h: Properly put brackets around array elements in - initializer. - - * typeck.c (build_binary_op_nodefault): Correctly place parens around - && and || in expression. - -Thu Mar 12 09:26:04 1998 Manfred Hollstein - - * call.c (default_parm_conversions): Remove prototype definition. - (build_method_call): Remove unused variable result. - - * cvt.c (ocp_convert): Remove unused variable conversion. - - * decl2.c (ambiguous_decl): Add explicit parameter definition for name. - - * except.c (do_unwind): #if 0 definition of unused variables fcall - and next_pc. - - * expr.c (extract_scalar_init): #if 0 prototype and function - definition. - - * init.c (expand_aggr_init_1): Remove unused variable init_type. - (build_new_1): Remove unused variable t. - - * pt.c (instantiate_class_template): Remove unused variable newtag; - cast called function return value to void. - (do_decl_instantiation): Remove unused variables name and fn. - - * tree.c (get_type_decl): Add default return to shut up compiler from - complaining control reaches end of non-void function. - - * typeck.c (build_x_conditional_expr): Remove unused variable rval. - -Thu Mar 12 09:12:15 1998 Manfred Hollstein - - * call.c (default_parm_conversions): Remove prototype definition. - (build_method_call): Remove unused variable result. - (build_over_call): Add default case in enumeration switch. - -Thu Mar 12 08:39:13 1998 Manfred Hollstein - - * decl2.c (lang_decode_option): Change j's type to size_t. - - * tree.c (layout_vbasetypes): record_align and desired_align are of - type unsigned int; const_size and nonvirtual_const_size likewise. - -Wed Mar 11 07:25:20 1998 Mark Mitchell - - * parse.y (new_initializer): Make sure all initializers are - lists. - -Tue Mar 10 07:32:36 1998 Mark Mitchell - - * decl2.c (import_export_decl): Mark tinfo functions for - cv-qualified versions of class types as DECL_NOT_REALLY_EXTERN. - -Fri Mar 6 23:27:35 1998 Jeffrey A Law (law@cygnus.com) - - * method.c: Fix typo. - -Fri Mar 6 10:06:59 1998 Kaveh R. Ghazi - - * method.c: Include "system.h" to get stdlib.h, stdio.h, - ctype.h, string.h, etc. - (issue_nrepeats): Add default case in enumeration switch. - (check_btype): Likewise. - (process_overload_item): Likewise. - - * Makefile.in (method.o): Depend on system.h. - -Wed Mar 4 22:26:53 1998 Andreas Schwab - - * lex.c (do_scoped_id): Fix parenthesizing. - -Wed Mar 4 12:11:53 1998 Michael Tiemann - - * rtti.c (get_tinfo_fn_dynamic): If this function is called an - FLAG_RTTI is unset, initialize type info machinery and continue - with FLAG_RTTI enabled. - (get_typeid): Ditto. - -Wed Mar 4 11:47:55 1998 Jason Merrill - - * typeck.c (unary_complex_lvalue): &D::i has type B::* if i comes - from B. - -Wed Mar 4 11:28:08 1998 Mark Mitchell - - * pt.c (finish_member_template_decl): Deal more gracefully with - invalid declarations. - -Tue Mar 3 01:38:17 1998 Jason Merrill - - * cvt.c, decl.c, decl2.c, init.c, rtti.c, typeck.c, typeck2.c, - cp-tree.h: Clean up more old overloading code, old RTTI code, and - some formatting quirks. - - * call.c, class.c, cp-tree.h, cvt.c, decl.c, init.c, lex.c, - method.c, pt.c, ptree.c, typeck.c: Remove support for - -fno-ansi-overloading and overloading METHOD_CALL_EXPR. - * class.h: Remove. - * Makefile.in: Adjust. - - * pt.c (unify): Don't allow reduced cv-quals when strict. - - * call.c, class.c, pt.c, cp-tree.h: Remove nsubsts parm from - *type_unification* and unify. - -Mon Mar 2 12:11:06 1998 Jason Merrill - - * parse.y (explicit_template_type): Remove TEMPLATE keyword. - (nested_name_specifier): And add it before this use. - (typename_sub0): And this use. Also add use without the keyword. - (typename_sub1): Likewise. - * pt.c (instantiate_class_template): Don't actually instantiate - anything if our type uses template parms. - -Mon Mar 2 11:04:59 1998 Jim Wilson - - * decl.c (start_function): Don't call temporary_allocation for a - nested function. - -Sun Mar 1 21:06:37 1998 Jason Merrill - - * pt.c (instantiate_class_template): Don't mess with friends if - our type uses template parms. - -Sat Feb 28 12:06:44 1998 Jason Merrill - - * parse.y (nested_name_specifier): Use explicit_template_type. - (typename_sub): Allow a template_type, an explicit_template_type, - or an implicit template type at the end. - * lex.c (yyprint): Handle a PTYPENAME being a TEMPLATE_DECL. - * decl.c (make_typename_type): Handle template-id where the name - is a TEMPLATE_DECL. - * call.c (build_scoped_method_call): Handle member template - destructor call. - * pt.c (tsubst_copy, METHOD_CALL_EXPR): Don't assume a member - destructor is represented by the type. - - * cp-tree.h (TYPENAME_TYPE_FULLNAME): New macro. - * parse.y (nested_name_specifier): Add 'template' case. - (explicit_template_type): New rule. - (typename_sub): Use it. - * decl.c (make_typename_type): Handle getting a template-id for NAME. - * pt.c (tsubst): Likewise. - -Fri Feb 27 11:17:50 1998 Jason Merrill - - * pt.c (add_to_template_args): Fix thinko. - (instantiate_class_template): Call it later. - - * pt.c (get_class_bindings): Add outer_args parm. - (most_specialized_class): Likewise. - (instantiate_class_template): Pass it. - (more_specialized_class): Likewise. - (lookup_template_class): Get context from template if none - was specified. - (finish_member_template_decl): Don't do anything with a - partial specialization. - * decl2.c (check_member_template): Use IS_AGGR_TYPE instead of - AGGREGATE_TYPE_P. - * class.c (finish_struct): Member class templates have already been - checked for name clashes. - * decl.c (pushdecl_with_scope): Handle pushing at class level. - -Fri Feb 27 02:25:16 1998 Jason Merrill - - * pt.c (tsubst, TEMPLATE_DECL): Support member class templates. - (tsubst, *_PARM): Support multiple levels of template classes. - (instantiate_class_template): Look up the pattern from the - original template. - (lookup_template_class): Handle getting a template for d1. - (push_template_decl): Correct setting of 'primary'. - (reduce_template_parm_level): Add 'levels' parm. - (finish_member_template_decl): Support member class templates. - (template_class_depth): Handle multiple levels. - * parse.y (component_decl_1, fn.def2): Remove member template case. - (component_decl): Add member template cases. - * decl2.c (check_member_template): We now handle member template - classes. - * decl.c (pushtag): Handle member templates. - * method.c (do_inline_function_hair): Don't touch - IDENTIFIER_GLOBAL_VALUE. - * init.c (build_offset_ref): If name isn't an identifier, just - return it. - * spew.c (yylex): Handle PTYPENAME like TYPENAME. - - * typeck.c (get_delta_difference): Do adjust for conversions to - and from virtual base. - -Wed Feb 25 09:51:29 1998 Jason Merrill - - * typeck.c (get_delta_difference): Give hard error for conversion - from virtual base. - - * cp-tree.h: Tweak formatting. - -Wed Feb 25 00:35:33 1998 Jason Merrill - - * decl.c (push_namespace): Handle redeclaration error. - - * cp-tree.h (IDENTIFIER_NAMESPACE_VALUE): New macro. - (IDENTIFIER_NAMESPACE_BINDINGS): New macro. - (NAMESPACE_BINDING): New macro. - (IDENTIFIER_GLOBAL_VALUE): Use NAMESPACE_BINDING. - * *.c: Use them. - - * pt.c (push_template_decl): Use innermost_args. - - * decl.c (get_unique_name): Tweak from earlier in the name. - -Tue Feb 24 22:15:04 1998 Martin von Loewis - - * cp-tree.def: Add CPLUS_BINDING node. - * cp-tree.h (tree_binding): new struct - (BINDING_SCOPE, BINDING_VALUE): new macros - (current_namespace, global_namespace): declare extern - (struct lang_decl_flags): new field in_namespace - (DECL_NAMESPACE_USING, DECL_NAMESPACE_USERS): new macros - (DECL_NAMESPACE, SET_DECL_NAMESPACE): new macros - (TREE_INDIRECT_USING): new macro - * decl2.c (current_namespace, global_namespace): Declare. The - value is a NAMESPACE_DECL now, not a TREE_LIST. - (is_namespace_ancestor, namespace_ancestor):new static functions. - (add_using_namespace, ambiguous_decl): likewise. - (lookup_using_namespace): new support function for lookup_name. - (qualified_lookup_using_namespace): new support function for - do_scoped_id and lookup_namespace_name - (get_namespace_id): mark as obsolete. - (current_namespace_id): Likewise. - (do_namespace_alias): Implement. - (do_using_directive): Implement as call to add_using_namespace. - * decl.c (binding_for_name): new function. - (push_namespace, pop_namespace): implement. - (push_decl): don't install a FUNCTION_DECL in the global branch. - (lookup_namespace_name): implement using qualified lookup. - (lookup_name_real): For global scoping, lookup in - global_namespace. For namespace scoping, lookup in given - namespace. For unscoped lookup, iterate over namespace, - considering using directives. - (init_decl_processing): initialize global_namespace. - (grokvardecl): Build assembler name as static name for globals. - (grokdeclarator): Remove old namespace mangling. - (xref_tag): When installing a global binding for the - tag, make sure we have an identifier. - * method.c (build_overload_nested_name): mangle namespaces. - (build_qualified_name): Likewise. - (build_decl_overload_real): Likewise. - * lex.c (build_lang_decl): set namespace for new declaration to - current_namespace. - (do_scoped_id): find global names in global or current - namespace, or using qualified namespace lookup, depending on - context. - * init.c (build_member_call): When scope is namespace, use - build_x_function_call instead. - (build_offset_ref): When scope is namespace, collapse processing - to lookup_namespace_name instead. - * error.c (dump_decl): Support NAMESPACE_DECL. - * decl.c (pushdecl): Bind globals to current namespace. - (push_overloaded_decl): Likewise. - (lookup_tag): Likewise. - (lookup_name_current_level): Likewise. - (xref_tag): Likewise. - (start_function): Likewise. - * lex.c (do_identifier): Likewise. - (identifier_typedecl_value): Likewise. - (real_yylex): Likewise. - * method.c (do_inline_function_hair): Likewise. - * parse.y (unscoped): Likewise. - * pt.c (check_explicit_specialization): Likewise. - (lookup_template_class): Likewise. - * rtti.c (call_void_fn): Likewise. - * sig.c (build_sigtable): Likewise. - * ptree.c (lang_print_xnode): New function. - -Tue Feb 24 01:40:24 1998 Jason Merrill - - * pt.c (instantiate_class_template): Don't instantiate if pedantic - and the args use template parms. - - * pt.c (push_tinst_level): If the instantiaton uses template parms, - fail silently. - * decl.c (xref_basetypes): Do call complete_type for basetypes - that involve template parameters. - -Tue Feb 24 00:36:43 1998 Jason Merrill - - * typeck2.c (process_init_constructor): Fix labeled init check. - -Mon Feb 23 05:08:55 1998 Jason Merrill - - * pt.c, call.c, decl.c, method.c, cp-tree.h: Remove unused NARGS - argument to tsubst and friends. - - * pt.c (tsubst, FUNCTION_DECL): Tidy. - - * typeck.c (build_x_function_call): Handle static member function - templates like non-templates. Handle friend templates like normal - function templates. - * pt.c (tsubst, *_PARM): Don't use orig_level. - (get_bindings): Don't call add_to_template_args. - (instantiate_template): Likewise. - (tsubst, FUNCTION_DECL): Call add_to_template_args as appropriate. - * ptree.c (print_lang_type): Print index/level for template parms. - -Mon Feb 23 02:52:29 1998 Mark Mitchell - - * Make-lang.in (cc1plus): Note that cc1plus depends on - cp/cp-tree.h and cp/cp-tree.def. - - * cp-tree.def (TEMPLATE_CONST_PARM): Remove. - (TEMPLATE_PARM_INDEX): New tree code, used to indicate a - position in a template parameter list. - * cp-tree.h (template_parm_index): New structure, used as the tree - structure for a TEMPLATE_PARM_INDEX. - (TEMPLATE_PARM_IDX): New macro. - (TEMPLATE_PARM_LEVEL): Likewise. - (TEMPLATE_PARM_DESCENDANTS): Likewise. - (TEMPLATE_PARM_ORIG_LEVEL): Likewise. - (TEMPLATE_PARM_DECL): Likewise. - (TEMPLATE_TYPE_PARM_INDEX): Likewise. - (TEMPLATE_TYPE_ORIG_LEVEL): Likewise. - (TEMPLATE_TYPE_DECL): Likewise. - (TEMPLATE_CONST_IDX): Remove. - (TEMPLATE_CONST_LEVEL): Likewise. - (TEMPLATE_CONST_SET_INFO): Likewise. - (TEMPLATE_TYPE_SET_INFO): Likewise. - (TEMPLATE_TYPE_IDX): Redefine in terms of TEMPLATE_PARM_INDEX - node. - (TEMPLATE_TYPE_LEVEL): Likewise. - * decl.c (decls_match): Call comp_template_parms, rather than - expanding it inline. - (duplicate_decls): If two template declarations are being merged, - then their TEMPLATE_INFOs should be merged as well. - (grokfndecl): Save template-id information when declaring a friend - with explicit template arguments. Pass arguments to - check_explicit_specialization via correct convention; at some - point check_explicit_specialization changed, but these call-sites - did not. - (grokdeclarator): Tidy up slightly. - * decl2.c (check_classfn): Tidy up slightly. Don't assume that - two template functions with the same DECL_ASSEMBLER_NAME the same, - since the names are not yet mangled. - * error.c (dump_decl): Use TEMPLATE_PARM_INDEX instead of - TEMPLATE_CONST_PARM. - (dump_expr): Likewise. Use the TEMPLATE_PARM_DECL to get at the - decl for a non-type parameter, rather than printing `'. - * friend.c (is_friend): Handle TEMPLATE_DECL friends. - (do_friend): Deal with template friends. - * lex.c (do_pending_inlines): Call - maybe_begin_member_template_processing, rather than - conditionally calling begin_member_template_processing. - (process_next_inline): Likewise. Call - maybe_end_member_template_processing, rather than - conditionally calling end_member_template_processing. - (do_pending_defargs): Likewise. - (do_identifier): Use TEMPLATE_PARM_INDEX instead of - TEMPLATE_CONST_PARM. - * method.c (build_mangled_template_parm_index): New function. - (build_overload_value): Use it. - (build_overload_name): Likewise. - * pt.c (finish_member_template_decl): Allow friend declarations. - (template_class_depth): New function. - (is_member_template): Rename, and modify, to become... - (is_member_or_friend_template): New function. - (end_member_template_processing): Rename, and modify, to become... - (maybe_end_member_template_processing). - (build_template_parm_index): New function. - (reduce_template_parm_level): New function. - (process_template_parm): Modify to use build_template_parm_index. - (push_template_decl): Deal with friend templates. - (uses_template_parms): Use TEMPLATE_PARM_INDEX instead of - TEMPLATE_CONST_PARM. - (tsubst_friend_function): New function. - (instantiate_class_template): Generate the DECL_FRIENDLIST - for a new instantiation by using tsubst_friend_function rather - than just tsubst. - (tsubst): Don't tsubst into a type which is a TEMPLATE_DECL. - Use TEMPLATE_PARM_INDEX instead of TEMPLATE_CONST_PARM, and the - appropriate new macros. Use reduce_template_parm_level to - generate lower-level template parameters. Handle tsubst'ing into - TEMPLATE_DECLS that declare TEMPLATE_TEMPLATE_PARMS. Don't forget - to tsubst the DECL_CONTEXT and DECL_CLASS_CONTEXT of newly created - templates. Similarly for the template parameters for a new - template. - (tsubst_copy): Tidy up slightly. Use TEMPLATE_PARM_INDEX instead - of TEMPLATE_CONST_PARM. Handle TYPE_DECLs by tsubsting into them. - (unify): Use TEMPLATE_PARM_INDEX instead of TEMPLATE_CONST_PARM. - (get_bindings): Call add_to_template_args if necessary. - (instantiate_decl): Handle instantiations of friend templates. - * search.c (lookup_field_1): Don't treat the TYPE_FIELDS of a - TEMPLATE_TYPE_PARM as a list of fields; it's not! - * spew.c (yylex): Do a little manual constant propogation to - clarify the code. - -Sun Feb 22 19:53:29 1998 Jeffrey A Law (law@cygnus.com) - - * error.c: Include sys/types.h. - -Thu Feb 19 14:49:09 1998 Jeffrey A Law (law@cygnus.com) - - * method.c (build_mangled_name): Start CPP directives in column zero. - -Thu Feb 19 10:36:48 1998 Jason Merrill - - * typeck2.c (process_init_constructor): Sorry about non-trivial - labeled initializers. - * parse.y (initlist): Reenable labeled initializers. - -Thu Feb 19 10:15:55 1998 Kriang Lerdsuwanakij - - * pt.c (coerce_template_parms) Add a new parameter, is_tmpl_parm, - all callers changed. Rely on the new parameter instead of arg - being a TREE_LIST when determine whether we are working inside - template template parameter. Clean up is_type test. - -Thu Feb 19 10:04:12 1998 Jason Merrill - - * cvt.c (cp_convert_to_pointer): Preserve TREE_CONSTANT. - * typeck2.c (initializer_constant_valid_p): Allow conversions - between pointers and refrerences. - -1998-02-19 Brendan Kehoe - - * typeck.c (build_unary_op): Only warn about incr/decr a pointer - if pedantic || warn_pointer_arith. - -Thu Feb 19 09:37:21 1998 Kriang Lerdsuwanakij - - * pt.c (unify): Handle TEMPLATE_DECL. - -1998-02-18 Brendan Kehoe - - * cp-tree.h (strip_attrs): Remove decl. - -1998-02-18 Doug Evans - - * decl.c (duplicate_decls): Call merge_machine_decl_attributes. - Update olddecl's attributes too. - (strip_attrs): Remove function. - * typeck.c (common_type): Call merge_machine_type_attributes. - -Tue Feb 17 14:07:52 1998 Mark Mitchell - - * parse.y (initdcl0_innards): New grammar symbol. - (nomods_initdecls, nomods_initdcl0): Change type from itype to - none, since the resulting value is never used. - (parse_decl): New function. - (datadef): Remove redundant actions. - (initdcl0, notype_initdcl0, nomods_initdcl0): Use initdcl0_innards. - * parse.c: Regenerated. - -Tue Feb 17 11:54:16 1998 Jason Merrill - - * parse.y (simple_stmt): Use getdecls() to check for decl. - -Sat Feb 14 11:50:51 1998 Manfred Hollstein - - * Make-lang.in (DEMANGLER_INSTALL_NAME, DEMANGLER_CROSS_NAME): New - macros. - (c++.install-common): Install c++filt properly as native or as cross - variant. - (c++.uninstall): Add c++filt. - -Fri Feb 13 14:55:37 1998 Jason Merrill - - * call.c (standard_conversion): Fix multi-level ptr conversions. - -Fri Feb 13 14:06:22 1998 Mike Stump - - * init.c (build_new): Propagate error_mark_node up. - -Fri Feb 13 13:24:32 1998 Jason Merrill - - * parse.y (simple_stmt): If the condition isn't a declaration, - start the controlled block after the test. - -Fri Feb 13 02:26:10 1998 Andreas Schwab - - * call.c (build_over_call): Convert builtin abs, labs and fabs to - tree-codes. - * decl.c (init_decl_processing): Reenable abs, labs and fabs as - builtins. - -Fri Feb 13 01:36:42 1998 Jason Merrill - - * call.c (standard_conversion): A BASE_CONV replaces an RVALUE_CONV. - -Fri Feb 13 00:21:59 1998 Jason Merrill - - * cp-tree.h: Add access_protected_virtual_node. - * class.c (init_class_processing): Initialize it. - * decl.c (xref_basetypes): Use it. - * parse.y (base_class_access_list): Likewise. - - * Make-lang.in (DEMANGLER_PROG): Add $(exeext). - (c++.install-common): Install c++filt. - -Thu Feb 12 12:46:51 1998 Benjamin Kosnik - - * decl.c (shadow_tag): Give error for typedef-ing built-in types. - -Wed Feb 11 23:28:05 1998 Mark Mitchell - - * call.c (reference_binding): Use comptypes when comparing - TYPE_MAIN_VARIANTS to handle non-canonical array/index types. - -Wed Feb 11 16:42:04 1998 Mark Mitchell - - * tree.c (is_overloaded_fn): Use really_overloaded_fn. - (really_overloaded_fn): Move check here from is_overloaded_fn. - (get_first_fn): Use really_overloaded_fn and is_overloaded_fn. - -Wed Feb 11 15:54:18 1998 Mark Mitchell - - * typeck.c (build_ptrmemfunc): Type-check pointer-to-member - conversions. - -Mon Feb 9 22:23:31 1998 Mark Mitchell - - * cp-tree.h (push_template_decl): Return the decl passed in, or an - equivalent duplicate. - * decl.c (pushtag): Use the return value from push_template_decl. - (duplicate_decls): When duplicating a template declaration, merge - the DECL_TEMPLATE_RESULTs as well. - (make_implicit_typename): Don't try to dive into typename types to - find a context for making a new implicit typename. - (start_decl): Use the return value from push_template_decl. - (grokdeclarator): Complain about declarations list `const operator - int'. Since we don't correctly handle in-class initializations of - non-static data members, complain about this (now illegal) - practice. Issue an error for initializations of non-const statics - since that is illegal as well, and since we don't handle that case - correctly either. - (start_function): Use the return value from push_template_decl. - (start_method): Likewise. - * decl2.c (grokfield): Likewise. Since the change to - grokdeclarator ensures that all initialized fields are in fact - static, remove a redundant test for TREE_PUBLIC. - * parse.y (initlist): Disable labeled initializers since they do - not work as per the documentation, and since they do not use the - same syntax as the C front end. - * pt.c (push_template_decl): Return the decl passed in, or an - equivalent duplicate. - (lookup_template_class): When searching in a nested context, - use the right arguments. - (uses_template_parms): Handle the DECL_INITIAL for a CONST_DECL. - * typeck.c (build_component_ref): Assign the correct type to the - result of build_vfn_ref. - -Tue Feb 10 23:56:46 1998 Jason Merrill - - * pt.c (convert_nontype_argument): Fix typo. - (check_explicit_specialization): Allow old-style specialization - of class template members. - -Tue Feb 10 20:36:52 1998 Jason Merrill - Manfred Hollstein - - * decl.c (grokdeclarator): Use DECL_USE_TEMPLATE instead - when deciding to override DECL_ASSEMBLER_NAME. - -Tue Feb 10 15:30:55 EST 1998 Andrew MacLeod - - * decl2.c (lang_f_options): Add -fsquangle to option processing list. - * cp-tree.h (flag_do_squangling): Add declaration. - * lang-options.h: Add -fsquangle and -fno-squangle. - * method.c: Add macros and static variables for squangling. - (build_overload_name): Rename to build_mangled_name, add logic for B - compression, and split into process_modifiers and - process_overload_item. - (process_modifiers): New function, to handle constant, reference, - and pointer types. - (process_overload_item): New function, handles issue of type codes. - (build_overload_name): New function, start squangling and call - build_mangled_name. - (ALLOCATE_TYPEVEC, DEALLOCATE_TYPEVEC): Remove macro and expand inline. - (start_squangling): New function to initialize squangling structs. - (end_squangling): New function to destroy squangling structs. - (nrepeats): Rename variable to Nrepeats. - (issue_nrepeats): New function for issuing 'n' type repeats. - (check_ktype): New function to check for type K name compression. - (build_overload_nested_name): Add a check for K name compression. - (build_qualified_name): Add a check for K name compression and don't - use DECL_ASSEMBLER_NAME when squangling is on. - (check_btype): New function, checks for B type compression. - (build_static_name, build_decl_overload_real): Initiate squangling. - (build_typename_overload, build_overload_with_type): Initiate - squangling - -Sun Feb 8 23:47:38 1998 scott snyder - - * method.c (make_thunk): Avoid name buffer overflow. - -Sat Feb 7 16:48:54 1998 Jason Merrill - - * pt.c (instantiate_decl): Call cp_finish_decl for vars even if we - don't define them yet. - - * parse.y (nomods_initdcl0): Add constructor_declarator case. - -Fri Feb 6 21:32:25 1998 Richard Kenner - - * config-lang.in (diff_excludes): Use basename only. - -Thu Feb 5 19:10:40 1998 Jason Merrill - - * tinfo2.cc: Add tinfo for signed char. - -Thu Feb 5 14:38:23 1998 Mike Stump - - * search.c (compute_access): Handle protected constructors in derived - classes as accessible. - -Wed Feb 4 01:26:49 1998 Jason Merrill - - * expr.c (cplus_expand_expr, PCC_STATIC_STRUCT_RETURN code): - Call convert_from_reference sooner. - -Tue Feb 3 23:50:52 1998 Mark Mitchell - - * cvt.c (ocp_convert): Obtain the constant values from constant - decls even if the destination type is the same as the type of the - decl. - - * decl2.c (finish_file): Make sure that static inlines with - definitions are not marked DECL_EXTERNAL before returning. - -Tue Feb 3 22:43:42 1998 Jason Merrill - - * decl.c: Lose arg_looking_for_template. - (lookup_name_real): Likewise. - * parse.y: Lose processing_template_arg, template_arg1 - (primary): Likewise. - * spew.c (yylex): Set lastiddecl for PTYPENAMEs, too. - -Tue Feb 3 22:04:01 1998 Kriang Lerdsuwanakij - - * error.c (dump_decl): Fix type of default arguments for template - template parameters and nontype template parameters. - * parse.y (template_parm): Handle invalid default template - template arguments here. - - * parse.y (template_parm): Use template_arg instead of PTYPENAME - for default template template argument. - * pt.c (coerce_template_parms): Merge default template argument - codes. Can treat RECORD_TYPE as template name if it is implicitly - created. Fix argument index in error message. - * typeck.c (comptypes): Merge template argument comparison codes in - TEMPLATE_TEMPLATE_PARM and RECORD_TYPE. - -Tue Jan 6 01:42:44 1998 Mumit Khan - - * lex.c (file_name_nondirectory): Also check for '/'. - -Mon Feb 2 11:24:22 1998 Mark Mitchell - - * parse.y (primary): Deal with statement-expressions in - templates. - * pt.c (tsubst_copy): Handle BIND_EXPR. - * tree.c (mapcar): Likewise. - - * call.c (add_template_candidate_real): Pass extra parameter to - fn_type_unification. - * cp-tree.h (fn_type_unification): Add parameter. - * pt.c (fn_type_unification): Add additional parameter to deal with - static member functions. - (get_bindings): Deal with static member functions. - - * cp-tree.h (DECL_NONSTATIC_MEMBER_FUNCTION_P): New macro. - (revert_static_member_fn): Declare. - * decl.c (revert_static_member_fn): Remove declaration. Change - linkage from internal to external. - (cp_finish_decl): Deal with virtual functions in classes local to - template functions. - * decl2.c (finish_file): Don't forget to emit increment/decrement - expressions in initializers for file-scope variables. - * parse.y (typename_sub2): If the typename doesn't names a - template, rather than a type, issue an error message. - * pt.c (check_explicit_specialization): Handle specializations of - static member functions. - (coerce_template_parms): Handle offset references to lists of - member functions. - * search.c (note_debug_info_needed): Don't crash when handed a - type which is being defined. - * typeck.c (complete_type): Don't crash when handed NULL_TREE; - that can happen with some illegal code. - -Mon Feb 2 00:57:38 1998 Kaveh R. Ghazi - - * call.c (user_harshness): Initialize `code' to 0. - (build_method_call): Initialize `candidates', `cp' and `len' to 0. - (null_ptr_cst_p): Add parentheses around && within ||. - (standard_conversion): Likewise. - (z_candidate): Likewise. - (build_user_type_conversion_1): Initialize `args' to NULL_TREE. - (build_object_call): Likewise for `mem_args'. - (build_new_op): Likewise for `mem_arglist'. Add `return' from - default case in enumeration switch. - - * class.c (build_vtable_entry): Add explicit braces to avoid - ambiguous `else'. - (build_class_init_list): Likewise. - (finish_struct_1): Initialize `width' to 0. - (instantiate_type): Initialize `name' to NULL_TREE. Add - explicit braces to avoid ambiguous `else'. - - * cvt.c (convert_to_aggr): Add explicit braces to avoid ambiguous - `else'. - - * decl.c (grok_reference_init): Eliminate unused parameter, all - callers changed. - (record_builtin_type): Initialize `tdecl' to NULL_TREE. - (init_decl_processing): Initialize `vb_off_identifier' to NULL_TREE. - (cp_finish_decl): Initialize `ttype' to NULL_TREE. - (grokdeclarator): Add parentheses around && within ||. Add - explicit braces to avoid ambiguous `else'. - (grokparms): Initialize `type' to NULL_TREE. - (xref_tag): Remove unused label `just_return'. - (finish_enum): Initialize `minnode' and `maxnode' to NULL_TREE. - (finish_function): Initialize `cond' and `thenclause' to NULL_TREE. - (hack_incomplete_structures): Add parentheses around assignment - used as truth value. - - * decl2.c (coerce_delete_type): Hide definition of `e3'. - - * error.c: Include . - (dump_expr): Change the type of `i' to size_t. Remove unused - label `error'. - - * except.c (init_exception_processing): Remove unused variable `d'. - (expand_throw): Likewise for `label'. - - * friend.c (add_friends): Add explicit braces to avoid ambiguous - `else'. - - * init.c (sort_member_init): Initialize `last_field' to NULL_TREE. - (sort_base_init): Likewise for `binfo'. - (expand_member_init): Likewise for `rval'. - (build_member_call): Add parentheses around assignment used as - truth value. - (build_offset_ref): Add explicit braces to avoid ambiguous `else'. - (build_new): Initialize `nelts' to NULL_TREE. Initialize - `old_immediate_size_expand' to 0. - (build_new_1): Initialize `nelts' and `alloc_node' to NULL_TREE. - (build_vec_delete_1): Remove unused variable `block'. - (expand_vec_init): Initialize `itype' to NULL_TREE. - - * lex.c: Include if we don't have . Protect - declaration of `index' and `rindex' with autoconf macros. - (reinit_parse_for_expr): Remove unused variables - `look_for_semicolon' and `look_for_lbrac'. - (cons_up_default_function): Initialize `args' to NULL_TREE. - (readescape): Initialize `firstdig' to 0. - (real_yylex): Add parentheses around assignment used as truth value. - - * method.c: Include if we don't have . - Protect declaration of `index' with autoconf macro. - - * parse.y (primary): Add explicit braces to avoid ambiguous `else'. - Initialize `type' to NULL_TREE. - (structsp): Remove unused variable `id'. - - * pt.c (coerce_template_parms): Add explicit braces to avoid - ambiguous `else'. - (lookup_template_class): Initialize `template' to NULL_TREE. - (instantiate_class_template): Remove unused variable `name' and `e'. - (tsubst): Likewise for `i'. Initialize `last' to NULL_TREE. - (do_poplevel): Initialize `saved_warn_unused' to 0. - (type_unification): Remove unused varable `parm'. - (unify): Likewise for `j'. - - * repo.c (init_repo): Add parentheses around assignment used as - truth value. - (finish_repo): Remove unused varable `p'. - - * search.c (get_binfo): Initiize `type' to NULL_TREE. - (get_base_distance): Likewise. - (lookup_field): Initialize `rval_binfo_h', `type', `basetype_path' - and `new_v' to NULL_TREE. - (lookup_fnfields): Likewise for `rval_binfo_h'. - (breadth_first_search): Add parentheses around assignment used as - truth value. - (get_template_base): Initialize `type' to NULL_TREE. - - * sig.c (append_signature_fields): Initialize `last_mfptr' to - NULL_TREE. - (build_signature_table_constructor): Likewise for - `last_rhs_field', `pfn' and `vt_off'. - (build_sigtable): Likewise for `init'. - - * tree.c (break_out_calls): Initialize `t2' to NULL_TREE. - (propagate_binfo_offsets): Likewise for `delta'. - (hash_tree_cons): Initialize hashcode to 0. - (can_free): Likewise for `size'. - (cp_tree_equal): Add explicit braces to avoid ambiguous `else'. - - * typeck.c (convert_sequence): Hide prototype. - (common_type): Add explicit braces to avoid ambiguous `else'. - (comp_target_types): Likewise. - (build_x_function_call): Initialize `ctypeptr' to NULL_TREE. - (build_function_call_real): Add explicit braces to avoid ambiguous - `else'. - (convert_arguments): Initialize `called_thing' to 0. - (convert_for_initialization): Initialize `savew' and `savee' to 0. - - * typeck2.c (incomplete_type_error): Initialize `errmsg' to 0. - (digest_init): Initialize `old_tail_contents' to NULL_TREE. - (build_x_arrow): Likewise for `last_rval'. - - * xref.c (GNU_xref_decl): Initialize `cls' to 0. - -Sun Feb 1 12:45:34 1998 J"orn Rennecke - - * decl.c (init_decl_processing): Use set_sizetype. - * decl2.c (sizetype): Don't declare. - * typeck.c (c_sizeof): Convert result of *_DIV_EXPR to sizetype. - (c_sizeof_nowarn, build_binary_op_nodefault): Likewise. - (build_component_addr, unary_complex_lvalue): Likewise. - * rtti.c (expand_class_desc): Likewise. - * class.c (get_vfield_offset): Likewise. - -Thu Jan 29 10:39:30 1998 Mark Mitchell - - * pt.c (convert_nontype_argument): Move check for is_overloaded_fn - early to avoid bogus error. Handle overloaded function - names provided as template arguments correctly. - (coerce_template_parms): Don't mishandle overloaded functions when - dealing with template template parameters. - (lookup_template_class): Issue an error message, rather than - crashing, when the TYPE_DECL provided is not a template type. - -Wed Jan 28 23:14:44 1998 Jason Merrill - - * class.c (instantiate_type): Don't just return a known type if - it's wrong. - -Wed Jan 28 11:04:07 1998 Mark Mitchell - - * class.c (instantiate_type): Remove handling of FUNCTION_DECL - since that code could never be reached. - - * error.c (dump_decl): Avoid aborting in the midst of printing an - error message about an illegal template declaration. - - * parse.y (structsp): Print an error message, rather than crashing, - when a class-head does not name a class. - - * pt.c (convert_nontype_argument): Allow REAL_TYPE and COMPLEX_TYPE - template arguments as a g++ extension. - - * cp-tree.def (ALIGNOF_EXPR): New tree code. - * decl2.c (grok_alignof): If processing_template_decl, just store - the expression. - * typeck.c (c_alignof): Likewise. - * decl2.c (build_expr_from_tree): Handle ALIGNOF_EXPR. - * error.c (dump_expr): Likewise. - * pt.c (tsubst_copy): Likewise. - * tree.c (cp_tree_equal): Likewise. - * pt.c (uses_template_parms): Correctly determine whether or not a - SIZEOF_EXPR/ALIGNOF_EXPR uses template parameters so that constant - folding can be done. - - * cp-tree.h (grok_enum_decls): Remove type parameter. - * decl.c (grok_enum_decls): Likewise. - * decl2.c (grok_x_components): Call grok_enum_decls - unconditionally, since it will do nothing if there is no - current_local_enum. Use the new calling sequence. - * pt.c (tsubst_enum): Use the new calling sequence for - grok_enum_decls. - - * decl.c (start_function): Make member functions of local classes - in extern inline functions have comdat linkage here... - (grokdeclarator): Rather than here. - -Wed Jan 28 10:55:47 1998 Jason Merrill - - * pt.c (convert_nontype_argument): Use decl_constant_value. - -Tue Jan 27 16:42:21 1998 Mark Mitchell - - * call.c (add_template_candidate_real): New function. - (add_template_candidate): Use it. - (add_template_conv_candidate): Likewise. - (joust): Pass extra argument to more_specialized. - * class.c (instantiate_type): Handle a single FUNCTION_DECL. - (is_local_class): Remove. - (finish_struct): Check TI_PENDING_SPECIALIZATION_FLAG. - * cp-tree.h (is_local_class): Remove. - (perform_array_to_pointer_conversion): Likewise. - (finish_member_template_decl): Add. - (check_explicit_specialization): Return a tree, not an int. - (more_specialized): Take additional argument. - (get_bindings): Likewise. - (TI_PENDING_SPECIALIZATION_FLAG): New macro. - * cvt.c (perform_qualification_conversions): Use comp_ptr_ttypes. - (perform_array_to_pointer_conversion): Remove. - * decl.c (saved_scope): Add processing_specialization, - processing_explicit_instantiation fields. - (maybe_push_to_top_level): Save them. - (pop_from_top_level): Restore them. - (grokfndecl): Use new return value from - check_explicit_specialization. - (start_decl): Don't check flag_guiding_decls before pushing - decls. - (cp_finish_decl): Remove previous (bogus) change. - (grok_declarator): Use decl_function_context rather than - is_local_class. - * decl2.c (finish_file): Pass extra argument to get_bindings. - (build_expr_from_tree): Let build_x_component_ref check - validity of arguments rather than doing it here. - * lex.c (cons_up_default_function): Remove code fooling with - processing_specialization, processing_explicit_instantiation - flags, as that is now done in {maybe_push_top,pop_from}_top_level. - * method.c (build_overload_identifier): Mangle local classes in - template functions correctly. - * parse.y (finish_member_template_decl): Move to pt.c. - * pt.c (finish_member_template_decl): Moved here from parse.y. - (print_candidates): New function. - (determine_specialization): Change interface. Properly look for - most specialized versions of template candidates. - (check_explicit_specialization): Fully process explicit - instantiations. - (push_template_decl): Avoid looking at CLASSTYPE fields in - FUNCTION_DECLS. - (determine_overloaded_function): Remove. - (convert_nontype_argument): Change name from - convert_nontype_parameter. Use determine_overloaded_function - instead of instantiate_type. - (mangle_class_name_for_template): Handle type contexts as well as - function contexts. - (classtype_mangled_name): Likewise. - (lookup_template_class): Likewise. - (tsubst): Likewise. - (more_specialized): Take explict template arguments as a - parameter. - (most_specialized): Likewise. - (get_bindings): Likewise. Check that return types match before - proclaiming a function a match. - (do_decl_instantiation): Remove code searching for function to - instantiate; that is now done in check_explicit_specialization. - (add_maybe_template): Pass extra argument to get_bindings. - * tree.c (really_overloaded_fn): Use is_overloaded_fn to simplify - implementation. - * typeck.c (build_component_ref): Check for invalid arguments. - -Tue Jan 27 01:44:02 1998 Jason Merrill - - * expr.c (cplus_expand_expr, AGGR_INIT_EXPR): Don't check that - return_target and call_target are equivalent. - - * pt.c (type_unification_real): Just accept function parms that - don't use any template parms. - -Sun Jan 25 03:30:00 1998 Jason Merrill - - * decl.c (cp_finish_decl): When bailing on a comdat variable, also - unset DECL_NOT_REALLY_EXTERN. - - * parse.y (typename_sub*): Fix std::. - -Sat Jan 24 12:13:54 1998 Jason Merrill - - * error.c (dump_decl): Fix type default template args. - (dump_type): Hand TEMPLATE_DECL off to dump_decl. - -Fri Jan 23 18:34:37 1998 Mumit Khan - - * lex.c (DIR_SEPARATOR): Define to be '/' if not already defined. - (file_name_nondirectory): Use. - -Wed Jan 21 10:29:57 1998 Kriang Lerdsuwanakij - - * pt.c (coerce_template_parms): Don't access elements of ARGLIST - that are not really present. Substitute default arguments in - template template arguments. Correctly convert TEMPLATE_DECL to - TEMPLATE_TEMPLATE_PARM. - (comp_template_args): TEMPLATE_DECL and TEMPLATE_TEMPLATE_PARM - are no longer treated specially here. - * parse.y (template_template_parm): Fix copy error. - * decl.c (grokdeclarator): Warn about missing `typename' for nested - type created from template template parameters. - * parse.y (bad_parm): Likewise - - * class.c (finish_struct): Handle TEMPLATE_TEMPLATE_PARM. - (push_nested_class): Likewise. - * cp-tree.def (TEMPLATE_TEMPLATE_PARM): New tree code. - * cp-tree.h (DECL_TEMPLATE_TEMPLATE_PARM_P): New macro. - (copy_template_template_parm): Declare. - * decl.c (arg_looking_for_template): New variable. - (lookup_name_real): Handle TEMPLATE_TEMPLATE_PARM. - Try to return TEMPLATE_DECL or TEMPLATE_TEMPLATE_PARM - node if arg_looking_for_template is nonzero. - (pushdecl): Handle TEMPLATE_TEMPLATE_PARM. - (grok_op_properties, xref_tag, xref_basetypes): Likewise. - (grokdeclarator): Handle TEMPLATE_DECL. - * decl2.c (constructor_name_full): Handle TEMPLATE_TEMPLATE_PARM. - * error.c (dump_type): Add TEMPLATE_DECL and TEMPLATE_TEMPLATE_PARM. - (dump_type_prefix, dump_type_suffix) Handle TEMPLATE_TEMPLATE_PARM. - (dump_decl): Handle unnamed template type parameters. - Handle template template parameters. - (dump_function_name): Handle template template parameters. - * init.c (is_aggr_typedef, is_aggr_type, get_aggr_from_typedef): - Handle TEMPLATE_TEMPLATE_PARM. - * method.c (build_template_template_parm_names): New function. - (build_template_parm_names): Handle TEMPLATE_DECL. - (build_overload_nested_name, build_overload_name): - Handle TEMPLATE_TEMPLATE_PARM. - * parse.y (maybe_identifier): New nonterminal. - (template_type_parm): Use it. - (template_template_parm, template_arg1): New nonterminal. - (template_parm): Add template_template_parm rules. - (template_arg): Set processing_template_arg. - (template_arg1): Rules moved from template_arg. - (primary, nonnested_type): Set arg_looking_for_template if we are - processing template arguments. - * pt.c (begin_member_template_processing): Handle TEMPLATE_DECL. - (process_template_parm): Handle template template parameters. - (coerce_template_parms, comp_template_args): Likewise. - (mangle_class_name_for_template, lookup_template_class): Likewise. - (uses_template_parms): Handle TEMPLATE_DECL and - TEMPLATE_TEMPLATE_PARM. - (current_template_args): Handle TEMPLATE_DECL. - (tsubst, tsubst_copy, unify): Handle TEMPLATE_TEMPLATE_PARM. - * search.c (dfs_walk, dfs_record_inheritance): - Handle TEMPLATE_TEMPLATE_PARM. - * tree.c (copy_template_template_parm): New function. - (mapcar): Handle TEMPLATE_TEMPLATE_PARM. - * typeck.c (comptypes): Handle TEMPLATE_TEMPLATE_PARM. - -Mon Jan 19 22:40:03 1998 Mark Mitchell - - * decl.c (start_decl): Don't allow duplicate definitions of static - data members. - - * call.c (build_user_type_conversion_1): Handle user-defined - template conversion operators correctly. - - * decl2.c (build_expr_from_tree): Issue an error message if the - object in a COMPONENT_REF is a TEMPLATE_DECL. - - * typeck.c (incomplete_type_error): Handle TEMPLATE_TYPE_PARMs. - - * class.c (is_local_class): New function. - * cp-tree.h (is_local_class): Declare it. - (last_tree): Likewise. - (begin_tree): Likewise. - (end_tree): Likewise. - (lookup_template_class): Change prototype. - * decl.c (cp_finish_decl): Check for NULL where necesary. - Consider FUNCTION_DECLS to declare objects with top-level binding, - when calling make_decl_rtl. - (grokdeclarator): Give members of local classes internal linkage. - (start_function): Remove declaration of last_tree. - (finish_function): Set flag_keep_inline_functions around call to - rest_of_compilation if we are processing a member function in a - local class. - (start_method): Call push_template_decl for member functions of - local classes in template functions. - * decl2.c (import_export_decl): Don't give external linkage to - instantiations of templates with internal linkage. - * parse.y (last_tree): Remove declaration. - (template_type): Pass extra parameter to lookup_template_class. - (self_template_type): Likewise. - (structsp): Move call to reset_specialization into left_curly. - (left_curly): Call reset_specialization, and begin_tree. - * pt.c (saved_trees): New variable. - (mangle_class_name_for_template): Change prototype. Use - additional function context to name local classes in templates - correctly. - (classtype_mangled_name): Pass the context. - (push_template_decl): Handle local classes and templates, and - member functions for such classes. - (convert_nontype_parameter): Fix handling of pointer-to-member - constants. - (lookup_template_class): Handle local classes in templates. - (tsubst): Likewise. Don't assume that template instantiations - have external linkage; pay attention to the template declaration. - (mark_decl_instantiated): Likewise. - (begin_tree): New function. - (end_tree): Likewise. - - * decl.c (xref_basetypes): Don't call complete_type for basetypes - that involve template parameters; that can lead to infinite - recursion unnecessarily. - - * pt.c (register_specialization): Do not register specializations - that aren't ready to be registered yet. - (check_explicit_specialization): Handle explicit specialization of - constructors and destructors. - (build_template_decl): New function. - (push_template_delc): Handle out-of-class specializations of - member templates. - - * pt.c (check_explicit_specialization): Set up the template - information before registering the specialization. - (coerce_template_parms): Fix thinko. - (tsubst): Handle specializations of member templates correctly. - - * class.c (finish_struct_methods): Remove calls to - check_explicit_specialization from here. - (finish_struct): And insert them here. - * cp-tree.h (perform_qualification_conversions): New function. - (perform_array_to_pointer_conversion): Likewise. - (begin_explicit_instantiation): Likewise. - (end_explicit_instantiation): Likewise. - (determine_specialization): Renamed from - determine_explicit_specialization. - (comp_template_parms): New function. - (processing_explicit_instantiation): New variable. - * cvt.c (perform_qualification_conversions): New function. - (perform_array_to_pointer_conversion): Likewise. - * decl.c (duplicate_decls): Don't consider template functions - alike unless they have the same parameters. Refine handling of - instantiation/specialization mismatches. - (start_decl): Don't call pushdecl for template specializations, - since they don't affect overloading. - (start_function): Likewise - (grokfndecl): Call check_explicit_specialization a little later. - Don't call duplicate_decls for memberm template specializations. - (grokdeclarator): Don't update template_count for classes that are - themselves specializations. Remove use of `2' as parameter to - grokfndecl since that value isn't used. - * lex.c (cons_up_default_function): Save and restore - processing_explicit_instantiation around calls to grokfield. - * parse.y (finish_member_template_decl): New function. - (component_decl_1): Use it. - (fn.def2): Likewise. - (template_arg_list_opt): New nonterminal. - (template_type): Use it. - (self_template_type): Likewise. - (template_id): Likewise. - (object_template_id): Likewise. - (notype_template_declarator): Likwise. - (begin_explicit_instantiation): Likewise. - (end_explicit_instantiation): Likewise. - (explicit_instantiation): Use them. - * pt.c (coerce_template_parms): Add parameters. - (processing_explicit_instantiation): New variable. - (convert_nontype_parameter): New function. - (determine_overloaded_function): Likewise. - (begin_explicit_instantiation): Likewise. - (end_explicit_instantiation): Likewise. - (retrieve_specialization): Likewise. - (register_specialization): Likewise. - (processing_explicit_specialization): Removed. - (determine_specialization): Handle specializations of member - functions of template class instantiations. - (check_explicit_specialization): Refine to conform to standard. - (comp_template_parms): New function. - (coerce_template_parms): Call convert_nontype_parameter. - (tsubst): Refine handling of member templates. Use - register_specialization. - (instantiate_template): Use retrieve_specialization. - (do_decl_instantiation): Likewise. - (instantiate_decl): Likewise. - (type_unification): Improve handling of explict template - arguments. - * tree.c (mapcar): Return error_mark_node, rather than aborting, - on VAR_DECLS, FUNCTION_DECLS, and CONST_DECLS. - * typeck.c (build_unary_op): Call determine_specialization, rather - than determine_explicit_specialization. - -Mon Jan 19 13:18:51 1998 Jason Merrill - - * cvt.c (build_up_reference): A TARGET_EXPR has side effects. - -Fri Jan 16 11:40:50 1998 Bruno Haible - - * error.c (dump_decl): For enum tags, output the tag, not its value. - -1998-01-13 Brendan Kehoe - - * decl.c (init_decl_processing): Only call init_rtti_processing - FLAG_RTTI is set. - -Mon Jan 12 01:35:18 1998 Jason Merrill - - * init.c (build_new_1): Split out from build_new. - (build_new): Just return a NEW_EXPR. - * expr.c (cplus_expand_expr): Handle NEW_EXPR. - - * decl2.c (get_temp_regvar): Tweak. - - * cp-tree.h (TREE_CALLS_NEW): Comment out. - * class.c (resolves_to_fixed_type_p): Remove use. - * method.c (build_opfncall): Likewise. - * call.c (build_new_op): Likewise. - -Wed Jan 7 23:47:13 1998 Jason Merrill - - * exception.cc (__eh_alloc, __eh_free): New fns. - (__cp_push_exception, __cp_pop_exception): Use them. - (__uncatch_exception): Call terminate here if no exception. - * except.c (build_terminate_handler): New fn. - (expand_start_catch_block): Use it. - (expand_exception_blocks): Likewise. - (alloc_eh_object): New fn. - (expand_throw): Use it. Protect exception init with terminate. - * typeck.c (build_modify_expr): Remove code that ignores trivial - methods. - -Mon Dec 22 11:36:27 1997 Kaveh R. Ghazi - - * call.c (add_builtin_candidate): Add default case in enumeration - switch. - (build_new_op): Likewise. - (convert_like): Likewise. - * cvt.c (build_expr_type_conversion): Likewise. - * tree.c (real_lvalue_p): Likewise. - (lvalue_p): Likewise. - (cp_tree_equal): Likewise. - * typeck.c (comptypes): Likewise. - (build_component_ref): Likewise. - (build_function_call_real): Likewise. - (build_binary_op_nodefault): Likewise. - (build_unary_op): Likewise. - (build_modify_expr): Likewise. - * typeck2.c (initializer_constant_valid_p): Likewise. - -Sun Dec 21 15:59:00 1997 Nick Clifton - - * decl2.c (lang_decode_option): Add support for -Wunknown-pragmas. - -Thu Dec 18 14:51:50 1997 Mark Mitchell - - * pt.c (coerce_template_parms): Make sure to digest_init if - possible. - - * decl.c (duplicate_decls): Make the newdecl virtual if the - olddecl was, just as is done with other attributes of olddecl. - -Thu Dec 18 14:43:19 1997 Jason Merrill - - * typeck.c (unary_complex_lvalue): Ignore op0 when taking the - address of an OFFSET_REF. - - * cp-tree.def: Add AGGR_INIT_EXPR. - * error.c, tree.c, typeck.c: Replace uses of NEW_EXPR with - AGGR_INIT_EXPR where appropriate. - * expr.c (cplus_expand_expr): Likewise. Simplify. - - * decl2.c (finish_file): Remove call to register_exception_table. - -Wed Dec 17 17:08:52 1997 Benjamin Kosnik - - * pt.c (instantiate_class_template): Don't do injection when - processing_template_decl is true, as pollutes current_binding_level - for base classes. - -Wed Dec 17 21:17:39 1997 Peter Schmid - - * pt.c (maybe_fold_nontype_arg): Add prototype. - -Tue Dec 16 10:31:20 1997 Jason Merrill - - * tree.c (mapcar): Handle TRY_CATCH_EXPR et al. - * error.c (dump_expr): Likewise. - -Mon Dec 15 12:22:04 1997 Jason Merrill - - * typeck.c (build_function_call_real): Remove "inline called before - definition" pedwarn. - - * pt.c (coerce_template_parms): Use maybe_fold_nontype_arg. - -Sun Dec 14 22:34:20 1997 Jason Merrill - - * cvt.c (cp_convert_to_pointer): Fix base conversion of pm's. - - * pt.c (type_unification_real): Change __null to type void* with - a warning. - -Sun Dec 14 20:38:35 1997 Mark Mitchell - - * call.c (implicit_conversion): Don't call - build_user_type_conversion_1 with a NULL expr, since it will - crash. - - * pt.c (unify): Don't try to unify array bounds if either array is - unbounded. - -Fri Dec 12 16:09:14 1997 Jason Merrill - - * errfn.c (cp_pedwarn, cp_pedwarn_at, cp_error_at, cp_warning_at): - Replace extern decls with casts. - - * decl.c (expand_start_early_try_stmts): Don't mess with a sequence. - Update last_parm_cleanup_insn. - (store_after_parms): Remove. - * cp-tree.h: Adjust. - -Thu Dec 11 22:18:37 1997 Jason Merrill - - * decl2.c (comdat_linkage): Also set DECL_COMDAT. - (finish_file): Check DECL_COMDAT instead of weak|one_only. - (import_export_vtable): Use make_decl_one_only instead of - comdat_linkage for win32 tweak. - (import_export_decl): Likewise. - * pt.c (mark_decl_instantiated): Likewise. - - * decl2.c (finish_file): Lose handling of templates in pending_statics. - -Thu Dec 11 21:12:09 1997 Jason Merrill - - * decl2.c (finish_file): Lose call to expand_builtin_throw. - * except.c (expand_builtin_throw): Remove. - * cp-tree.h: Remove ptr_ptr_type_node. - * decl.c: Likewise. - -Thu Dec 11 20:43:33 1997 Teemu Torma - - * decl.c (ptr_ptr_type_node): Define. - (init_decl_processing): Initialize it. - * cp-tree.h: Declare it. - * exception.cc (__cp_exception_info): Use __get_eh_info. - (__cp_push_exception): Ditto. - (__cp_pop_exception): Ditto. - - From Scott Snyder : - * except.c (expand_builtin_throw): Use get_saved_pc_ref instead of - saved_pc. - (init_exception_processing): Removed saved_pc initialization. - -Wed Dec 10 11:04:45 1997 Jason Merrill - - * pt.c (instantiate_decl): Defer all templates but inline functions. - -Mon Dec 8 23:17:13 1997 Jason Merrill - - * init.c (expand_vec_init): Don't fold a list of parameters. - - * decl.c (copy_args_p): Handle copy elision for types with virtual - bases. - * call.c (build_over_call): Likewise. - -Sun Dec 7 22:38:12 1997 Mark Mitchell - - * pt.c (lookup_template_function): Copy the template arguments, - not just the list containing them, to the permanent obstack. - -Sun Dec 7 15:53:06 1997 Jason Merrill - - * except.c (expand_start_catch_block): suspend_momentary for the - terminate handler. - - * error.c (dump_decl): Handle LOOKUP_EXPR. - -Sun Dec 7 15:45:07 1997 Mark Mitchell - - * rtti.c (build_dynamic_cast): Copy the cast-to type to the - permanent obstack if we are processing a template decl. - * typeck.c (build_static_cast): Likewise. - (build_const_cast): Likewise. - (build_reinterpret_cast): Likewise. - - * pt.c (coerce_template_parms): Coerce some expressions, even - when processing_template_decl. - -Sun Dec 7 01:46:33 1997 Bruno Haible - - * typeck.c (build_binary_op_nodefault, pointer_diff): Symmetric - handling of pointer difference expressions. - - * typeck.c (comp_target_types): Comparison of function/method types - is independent of nptrs. - -Sun Dec 7 01:40:27 1997 Mark Mitchell - - * pt.c (tsubst): Avoid creating pointer to reference and - reference to reference types. - -Sat Dec 6 01:29:37 1997 Jason Merrill - - * parse.y (do_id): New nonterminal. - (template_id): Use it. - -Fri Dec 5 01:17:34 1997 Jason Merrill - - * parse.y (template_id): do_identifier for PFUNCNAMEs, too. - * spew.c (yylex): Don't do_identifier here. - * decl2.c (build_expr_from_tree): Revert last change. - - * decl2.c (build_expr_from_tree): Expand the name for a method call. - * parse.y (object_template_id): Don't try to take the DECL_NAME. - -Wed Dec 3 20:02:39 1997 Jason Merrill - - * init.c (build_new): Use a TARGET_EXPR instead of SAVE_EXPR for - alloc_expr. - * call.c (build_op_delete_call): Adjust. - - * except.c (expand_end_catch_block): Lose rethrow region. - (expand_start_catch_block): Likewise. - (expand_end_catch_block): Don't expand_leftover_cleanups. - -Wed Dec 3 13:24:04 1997 Benjamin Kosnik - - * pt.c (tsubst): Remove tree_cons call (places redundant info into - DECL_TEMPLATE_INSTANTIATION). - -Wed Dec 3 11:44:52 1997 Jason Merrill - - * tree.c (is_overloaded_fn): Handle getting a fn template. - (really_overloaded_fn): Likewise. - * error.c (dump_decl): Handle TEMPLATE_ID_EXPRs better. - * pt.c (check_explicit_specialization): Tweak. - (determine_explicit_specialization): Tweak. - - * tree.c, cp-tree.h (get_target_expr): New fn. - -Wed Dec 3 08:47:27 1997 Paul Eggert - - * pt.c (check_explicit_specialization): Fix misspelling in - diagnostic: `preceeded'. - * typeck.c (get_delta_difference): Fix misspelling in diagnostic: - `conversiona'. - -1997-12-02 Mark Mitchell - - * pt.c (determine_explicit_specialization): Avoid an internal - error for bad specializations. - - * method.c (build_overload_value): Handle SCOPE_REF. - -Tue Dec 2 19:18:50 1997 Mike Stump - - * class.c (prepare_fresh_vtable): Enable even more complex MI - vtable names. - -Tue Dec 2 01:37:19 1997 Jason Merrill - - * exception.cc (__check_eh_spec): Optimize a bit. - - * exception.cc (__cp_pop_exception): Lose handler arg. - * except.c (do_pop_exception): Likewise. - (push_eh_cleanup): Let the cleanup mechanism supply the handler. - (expand_end_catch_block): Likewise. - -Fri Nov 28 01:58:14 1997 Jason Merrill - - * pt.c (check_explicit_specialization): Complain about using a - template-id for a non-specialization. - -Fri Nov 28 12:35:19 1997 Scott Christley - - * repo.c: Prototype rindex only if needed. - * xref.c: Likewise. - -Fri Nov 28 01:56:35 1997 Bruno Haible - - * error.c (dump_decl): Handle TEMPLATE_ID_EXPR. - -Thu Nov 27 00:59:46 1997 Jason Merrill - - * typeck.c (build_const_cast): Handle references here instead of - handing off to convert_to_reference. - - * except.c: Lose Unexpected, SetTerminate, SetUnexpected, - TerminateFunctionCall. - (init_exception_processing): Likewise. Terminate et al are now - the fns, not ADDR_EXPRs. - (various): Lose redundant assemble_external calls. - (do_unwind): s/BuiltinReturnAddress/builtin_return_address_fndecl/. - - * cp-tree.h (struct lang_decl_flags): Add comdat. - (DECL_COMDAT): New macro. - * decl.c (duplicate_decls): Propagate it. - (cp_finish_decl): Handle it. - * decl2.c (import_export_decl): Just set DECL_COMDAT on VAR_DECLs. - - * class.c: Remove static pending_hard_virtuals. - (add_virtual_function): Take pointers to pending_virtuals - and pending_hard_virtuals. - (finish_struct_1): Pass them. Declare pending_hard_virtuals. - -Wed Nov 26 20:28:49 1997 Jason Merrill - - * decl2.c (import_export_vtable): If we support one_only but not - weak symbols, mark instantiated template vtables one_only. - (import_export_decl): Likewise for tinfo functions. - (finish_vtable_vardecl): Also write out vtables from explicitly - instantiated template classes. - * pt.c (mark_class_instantiated): Revert last change. - - * except.c (expand_throw): Call mark_used on the destructor. - -Wed Nov 26 15:13:48 1997 Jeffrey A Law (law@cygnus.com) - - * lex.c (lang_init): Enable flag_exceptions by default if no - command line switch was specified. - -1997-11-26 Mark Mitchell - - * pt.c (unify): Handle `void' template parameters in - specializations. - -Wed Nov 26 01:11:24 1997 Jason Merrill - - * rtti.c (build_dynamic_cast): Handle template case here. - (build_dynamic_cast_1): Not here. - - * typeck2.c (digest_init): Make copies where appropriate. - - * decl2.c (delete_sanity): resolve_offset_ref. - - * except.c: Call terminate without caching so many bits. - - * except.c (expand_start_catch_block): Fix catching a reference - to pointer. - -Tue Nov 25 11:28:21 1997 Jason Merrill - - * init.c (build_new): Copy size to the saveable obstack. - - * init.c (build_new): Stick a CLEANUP_POINT_EXPR inside the - TRY_CATCH_EXPR for now. - -Mon Nov 24 12:15:55 1997 Jason Merrill - - * typeck.c (mark_addressable): Don't assume a FUNCTION_DECL - has DECL_LANG_SPECIFIC. - - * exception.cc (struct cp_eh_info): Add handlers field. - (__cp_push_exception): Initialize it. - (__cp_pop_exception): Decrement it. Don't pop unless it's 0. - (__throw_bad_exception): Remove. - * except.c (call_eh_info): Add handlers field. - (get_eh_handlers): New fn. - (push_eh_cleanup): Increment handlers. - -Fri Nov 21 12:22:07 1997 Jason Merrill - - * except.c (expand_start_eh_spec): Use the try/catch code. - (expand_end_eh_spec): Likewise. Call __check_eh_spec instead of - doing everything inline. - (init_exception_processing): throw_type_match now takes - const void pointers. - * exception.cc (__check_eh_spec): New fn. - * inc/exception: Neither terminate nor unexpected return. - * decl.c: Make const_ptr_type_node public. - * tinfo2.cc (__throw_type_match_rtti): Take the typeinfos constly. - - * except.c (expand_start_catch_block): We only need the rethrow - region for non-sjlj exceptions. - (expand_end_catch_block): Likewise. Use outer_context_label_stack. - -Thu Nov 20 14:40:17 1997 Jason Merrill - - * Make-lang.in (CXX_LIB2FUNCS): Add new op new and op delete objs. - (various.o): Likewise. - * inc/new: Add placement deletes. Add throw specs for default new. - * new.cc (set_new_handler): Move here from libgcc2. - * new1.cc (new (nothrow)): Catch a bad_alloc thrown from the handler. - (new): Move from libgcc2. Throw bad_alloc. - * new2.cc: Move the rest of the op news and op deletes from libgcc2. - * decl.c (init_decl_processing): Update exception specs on new and - delete. - - * method.c (build_decl_overload_real): Don't mess with global - placement delete. - - * init.c (build_new): Check for null throw spec, not nothrow_t. - - * decl.c (duplicate_decls): Don't complain about different exceptions - from an internal declaration. - - * call.c (build_op_delete_call): Fix check for member fns again. - - * decl2.c (import_export_decl): Interface hackery affects - virtual synthesized methods. - -Wed Nov 19 18:24:14 1997 Jason Merrill - - * decl.c (start_decl): Don't just complain about a mismatched - scope, fix it. - - * decl.c (make_implicit_typename): Handle case where t is not - actually from context. - * tree.c (get_type_decl): Lose identifier case. - * spew.c (yylex): Lose useless call to identifer_typedecl_value. - * parse.y (nonnested_type): Just use lookup_name. - (complex_type_name): Just use IDENTIFIER_GLOBAL_VALUE. - -Wed Nov 19 11:45:07 1997 Michael Tiemann - - * error.c (dump_function_name): Test DECL_LANG_SPECIFIC in case - T was built in C language context (for example, by - output_func_start_profiler). - -Wed Nov 19 10:39:27 1997 Jason Merrill - - * decl.c (make_implicit_typename): New fn. - (lookup_name_real): Use it. Use current_class_type as the context. - -Mon Nov 17 23:42:03 1997 Bruno Haible - - * pt.c (do_poplevel): Don't prohibit jumps into this contour. - -Mon Nov 17 02:01:28 1997 Jason Merrill - - * friend.c (do_friend): Warn about non-template friends in templates. - - * call.c (build_op_delete_call): Fix handling of inherited delete. - - * search.c (dfs_record_inheritance): Ignore template type parms. - -Sat Nov 15 00:30:51 1997 Jason Merrill - - * call.c (build_new_op): Fix copy error. - (build_op_new_call): New fn. - (build_op_delete_call): New fn. - * cp-tree.h: Declare them. - * init.c (build_new): Use them. Support placement delete. - (build_x_delete): Use build_op_delete_call. - (build_delete): Likewise. - * decl2.c (delete_sanity): Likewise. - (coerce_delete_type): Don't complain about placement delete. - -Thu Nov 13 01:52:36 1997 Jason Merrill - - * call.c (build_new_function_call): Remove unused 'obj' parm. - * cp-tree.h, typeck.c: Adjust. - - * init.c (build_new): Make the cleanup last longer. - (expand_vec_init): Call do_pending_stack_adjust. - -Wed Nov 12 11:04:33 1997 Jason Merrill - - * pt.c (do_type_instantiation): Fix typo. - (mark_class_instantiated): If we support one_only but not weak - symbols, don't mark this as known. - - * init.c (build_new): Handle vec delete in EH cleanup. - -Wed Nov 12 08:11:55 1997 Benjamin Kosnik - - * call.c (build_method_call): Call complete_type before checking - for destructor. - -Sun Nov 9 01:29:55 1997 Jim Wilson (wilson@cygnus.com) - - * decl.c (add_block_current_level): Delete. - * init.c (build_vec_delete_1): Delete build_block and - add_block_current_level calls. - -Wed Nov 12 00:48:16 1997 Jason Merrill - - * init.c (build_new): Handle freeing allocated memory when the - constructor throws. - - * call.c (build_new_method_call): Fix flags arg. - - * pt.c (do_type_instantiation): Don't try to instantiate - member templates. - (mark_decl_instantiated): If we support one_only but not - weak symbols, mark this one_only. - * decl2.c (import_export_vtable): Don't defer handling of vtables - if MULTIPLE_SYMBOL_SPACES. - -Tue Nov 11 12:02:12 1997 Jason Merrill - - * except.c (expand_end_catch_block): Lose call to __sjpopnthrow. - -Tue Nov 11 02:53:44 1997 Jason Merrill - - * except.c (do_pop_exception): Return a value. - -Mon Nov 10 20:25:31 1997 Jason Merrill - - * call.c (build_new_method_call): Handle getting a - TEMPLATE_ID_EXPR around a TEMPLATE_DECL. Don't look for a field - if we got template parms. - * typeck.c (build_x_function_call): Remember the TEMPLATE_ID_EXPR, - not just the args. - * decl2.c (build_expr_from_tree): Tweak last change. - * pt.c (tsubst_copy): Use get_first_fn instead of TREE_VALUE. - (maybe_fold_nontype_arg): Split out from tsubst_copy. - * tree.c (get_first_fn): Just return a TEMPLATE_ID_EXPR. - -Mon Nov 10 20:08:38 1997 Kriang Lerdsuwanakij - - * pt.c (tsubst_copy): Handle explicit template arguments in - function calls. - * typeck.c (build_x_function_call): Likewise. - * decl2.c (build_expr_from_tree): Lookup function name if it - hasn't been done. - - * pt.c (tsubst): Instantiate template functions properly when - template parameter does not appear in function arguments and return - type. - (comp_template_args): Handle member templates required by tsubst. - -Mon Nov 10 20:08:38 1997 Jason Merrill - - * decl.c (grokdeclarator): Tweak conditions for pedwarn in - previous change. - -Mon Nov 10 20:08:29 1997 Bruno Haible - - * pt.c (coerce_template_parms): Tweak error message. - - * decl.c (grokdeclarator): If -Wreturn-type, warn everytime a - return type defaults to `int', even if there are storage-class - specifiers. - -Mon Nov 10 03:04:20 1997 Jason Merrill - - Complete nested exception support. - * except.c (do_pop_exception): Split out... - (push_eh_cleanup): From here. Handle the EH region by hand. - (expand_start_catch_block): Add a new level for the catch parm. - Move the rethrow region outside the two cleanup regions. - Protect the initializer for the catch parm with terminate. - (expand_end_catch_block): Likewise. End the region for the eh_cleanup. - * exception.cc (__cp_pop_exception): Now takes two parms. Handle - popping off the middle of the stack. - * tree.c (lvalue_p, real_lvalue_p): Handle TRY_CATCH_EXPR, - WITH_CLEANUP_EXPR, and UNSAVE_EXPR. - (build_cplus_new): Only wrap CALL_EXPRs. - * init.c (expand_default_init): Handle a TRY_CATCH_EXPR around - the constructor call. - -Sun Nov 9 18:00:26 1997 Richard Kenner - - * Make-lang.in (c++.distdir): Make inc subdirectory. - -Fri Nov 7 11:57:28 1997 Jason Merrill - - * decl2.c (finish_file): Put back some code. - -Thu Nov 6 11:28:14 1997 Jason Merrill - - * decl2.c (finish_file): Remove redundant code. - * method.c (emit_thunk): Don't let the backend defer generic thunks. - -Wed Nov 5 23:52:50 1997 Jason Merrill - - * except.c (call_eh_info): Split out... - (push_eh_info): From here. - (expand_builtin_throw): Use it. - (expand_start_catch_block): Move region start back. - -Tue Nov 4 13:45:10 1997 Doug Evans - - * lex.c (MULTIBYTE_CHARS): #undef if cross compiling. - (real_yylex): Record wide strings using target endianness, not host. - -1997-11-03 Brendan Kehoe - - * repo.c (rindex): Add decl unconditionally. - (get_base_filename, open_repo_file): Don't cast rindex. - * xref.c (rindex): Add decl unconditionally. - (index): Remove unused decl. - (open_xref_file): Don't cast rindex. - -Sun Nov 2 15:04:12 1997 Jason Merrill - - * class.c (build_vbase_path): Propagate the result type properly. - -1997-11-01 Brendan Kehoe - - * except.c (expand_builtin_throw) [!DWARF2_UNWIND_INFO]: Replace - remaining use of saved_throw_type with a call to get_eh_type. - -1997-10-31 Brendan Kehoe - - * lex.c (FILE_NAME_NONDIRECTORY): Delete macro. - (file_name_nondirectory): New function, doing the same as the macro. - (set_typedecl_interface_info): Use it instead of the macro. - (check_newline): Likewise. - (handle_cp_pragma): Likewise. - - * repo.c (get_base_filename): Cast result of rindex to char*. - (open_repo_file): Likewise. - * xref.c (open_xref_file): Likewise. - * error.c (dump_char): Make its arg int, not char. - - * except.c (push_eh_info): Pass the number of fields - 1 down, not - the exact number of fields. - -Fri Oct 31 01:47:57 1997 Jason Merrill - - Support for nested exceptions. - * tinfo2.cc (__is_pointer): New fn. - * exception.cc (struct cp_eh_info): Define. - (__cp_exception_info, __uncatch_exception): New fns. - (__cp_push_exception, __cp_pop_exception): New fns. - * except.c: Lose saved_throw_{type,value,cleanup,in_catch}. - Lose empty_fndecl. - (init_exception_processing): Likewise. __eh_pc is now external. - (push_eh_info): New fn. - (get_eh_{info,value,type,caught}): New fns. - (push_eh_cleanup): Just call __cp_pop_exception. - (expand_start_catch_block): Use push_eh_info. Start the eh region - sooner. - (expand_end_eh_spec): Use push_eh_info. - (expand_throw): Call __cp_push_exception to set up the exception info. - Just pass the destructor or 0 as the cleanup. Call __uncatch_exception - when we rethrow. - (expand_builtin_throw): Don't refer to empty_fndecl. - -Thu Oct 23 02:01:30 1997 Jason Merrill - - * pt.c (instantiate_decl): SET_DECL_IMPLICIT_INSTANTIATION on new decl. - -1997-10-22 Brendan Kehoe - - * method.c (build_template_parm_names, build_decl_overload_real): - Add static to definitions. - * pt.c (add_to_template_args, note_template_header, - processing_explicit_specialization, type_unification_real): Likewise. - ({determine,check}_explicit_specialization): Use a single string for - error messages. - -Mon Oct 20 12:06:34 1997 Jason Merrill - - * except.c (expand_exception_blocks): Call do_pending_stack_adust. - (expand_end_catch_block): Likewise. - (expand_end_eh_spec): Likewise. - -Mon Oct 20 11:44:20 1997 Mark Mitchell - - * decl.c (duplicate_decls): Handle template specializations - correctly. - * error.c (dump_function_name): Fix printing of specializations of - member functions that are not member templates. - * cp-tree.h (processing_specialization): Make global. - * pt.c (processing_specialization): Likewise. - * lex.c (cons_up_default_function): Save and restore - processing_specialization to avoid confusion. - -Mon Oct 20 10:52:22 1997 Jason Merrill - - * decl.c (init_decl_processing): Give null_node unknown* type. - * typeck.c (comp_target_types): Handle UNKNOWN_TYPE. - (common_type): Likewise. - * error.c (args_as_string): Recognize null_node. - -Sun Oct 19 09:13:01 1997 Richard Kenner - - * typeck.c (rationalize_conditional_expr): Handle {MIN,MAX}_EXPR. - (unary_complex_lvalue): Call it for {MIN,MAX}_EXPR. - - * decl.c (init_decl_processing): Call using_eh_for_cleanups. - - * Make-lang.in (g++): Include prefix.o. - -Thu Oct 16 15:31:09 1997 Judy Goldberg - - * pt.c (determine_explicit_specialization): Initialize "dummy" - to keep Purify quiet. - -Thu Oct 16 00:14:48 1997 Jason Merrill - - * method.c (build_overload_value): Handle TEMPLATE_CONST_PARMs here. - (build_overload_int): Not here. - -Wed Oct 15 00:35:28 1997 Mike Stump - - * class.c (build_type_pathname): Remove. - (prepare_fresh_vtable): Fix problem with complex MI vtable names. - -1997-10-14 Brendan Kehoe - - * parse.y (unary_expr): Give a pedwarn if someone tries to use the - &&label GNU extension. - -Tue Oct 14 12:01:00 1997 Mark Mitchell - - * decl.c (pushtag): Unset DECL_ASSEMBLER_NAME before setting it, - so as to avoid incorrect manglings. - * method.c (build_decl_overload_real): Don't mangle return types - for constructors. - -Tue Oct 14 11:46:14 1997 Jason Merrill - - * cp-tree.h (scratchalloc, build_scratch_list, make_scratch_vec, - scratch_tree_cons): Define as macros for now. - * call.c, class.c, cvt.c, decl.c, decl2.c, except.c, expr.c, init.c, - lex.c, method.c, parse.y, pt.c, rtti.c, search.c, tree.c, typeck.c, - typeck2.c: Use them and the expression_obstack variants. - -Mon Oct 13 17:41:26 1997 Benjamin Kosnik - - * decl.c (store_return_init): Allow classes with explicit ctors to - be used with the named return values extension. - -Fri Oct 10 12:21:11 1997 Jason Merrill - - * pt.c (instantiate_decl): Fix previous change. - -Thu Oct 9 12:08:21 1997 Jason Merrill - - * pt.c (tsubst): Fix thinko. - (instantiate_decl): Really use the original template. - - * call.c (build_new_method_call): Use simple constructor_name for - error messages. - -Wed Oct 8 22:44:42 1997 Jeffrey A Law (law@cygnus.com) - - * method.c (build_underscore_int): Don't use ANSI specific - features. - -Wed Oct 8 00:18:22 1997 Jason Merrill - - * decl2.c (finish_prevtable_vardecl): Check DECL_REALLY_EXTERN - for our key method; it might have been inlined by -O3. - -Tue Oct 7 23:00:12 1997 Mark Mitchell - - * decl.c (make_typename_type): Do not try to call lookup_field for - non-aggregate types. - -Tue Oct 7 22:52:10 1997 Jason Merrill - - * typeck.c (build_reinterpret_cast): Tweak. - -Tue Oct 7 22:45:31 1997 Alexandre Oliva - - * typeck.c (build_reinterpret_cast): converting a void pointer - to function pointer with a reinterpret_cast produces a warning - if -pedantic is issued - -Tue Oct 7 22:43:43 1997 Bruno Haible - - * typeck.c (c_expand_return): Don't warn about returning a - reference-type variable as a reference. - -Tue Oct 7 21:11:22 1997 Jason Merrill - - * method.c (build_static_name): Fix typo. - -1997-10-07 Brendan Kehoe - - * decl.c (duplicate_decls): Make sure DECL_LANG_SPECIFIC is set on - OLDDECL before we try to do DECL_USE_TEMPLATE. - -Tue Oct 7 00:48:36 1997 Jason Merrill - - * decl.c (duplicate_decls): Don't warn about template instances. - - * typeck.c (mark_addressable): Lose ancient code that unsets - DECL_EXTERNAL. - - * pt.c (do_decl_instantiation): Lose support for instantiating - non-templates. - - * call.c (build_new_function_call): Fix handling of null explicit - template args. - (build_new_method_call): Likewise. - -Mon Oct 6 23:44:34 1997 Mark Mitchell - - * method.c (build_underscore_int): Fix typo. - -1997-10-06 Brendan Kehoe - - * tree.c (print_lang_statistics): #if 0 call to - print_inline_obstack_statistics until its definition is checked in. - -Mon Oct 6 09:27:29 1997 Jason Merrill - - * decl2.c (finish_file): Move dump_tree_statistics to end. - - * pt.c (instantiate_decl): Look for the original template. - (tsubst): Set DECL_IMPLICIT_INSTANTIATION on partial instantiations - of member templates. - -Wed Oct 1 08:41:38 1997 Jason Merrill - - * Makefile.in (g++FAQ.*): New rules. - (CONFLICTS): Update. - * g++FAQ.texi: Moved from libg++. - - * parse.y (PFUNCNAME): Only specify the type once. - -1997-10-01 Brendan Kehoe - - * lex.c (real_yylex): Clean up the code to fully behave the way - the c-lex.c parser does for complex and real numbers. - -Tue Sep 30 08:51:36 1997 Jason Merrill - - * method.c (build_decl_overload_real): Reformat. - -Tue Sep 30 00:18:26 1997 Jason Merrill - - * method.c (synthesize_method): If at_eof, determine our linkage. - -1997-09-29 Paul Eggert - - * lex.c (real_yylex): Treat `$' just like `_', except issue a - diagnostic if !dollars_in_ident or if pedantic. - - * lang-specs.h (@c++): -ansi no longer implies -$. - - * decl2.c (lang_decode_option): - -traditional and -ansi now do not mess with - dollars_in_ident. - -Mon Sep 29 19:57:51 1997 H.J. Lu (hjl@gnu.ai.mit.edu) - - * Makefile.in (parse.o, decl.o): Also depend on - $(srcdir)/../except.h $(srcdir)/../output.h. - (decl2.o): Also depend on $(srcdir)/../expr.h ../insn-codes.h - $(srcdir)/../except.h $(srcdir)/../output.h. - (typeck.o, init.o): Also depend on $(srcdir)/../expr.h - ../insn-codes.h. - - * call.c, cp-tree.h, decl.c, tree.c: Finish prototyping. - - * expr.c (cplus_expand_expr): Make it static. - - * decl2.c, init.c, typeck.c: Include "expr.h". - (expand_expr): Use proper values when calling the function. - -Mon Sep 29 11:05:54 1997 Alexandre Oliva - - * lang-options.h: new -Wold-style-cast flag. - * cp-tree.h (warn_old_style_cast): new variable. - * decl2.c (warn_old_style_cast): ditto. - (lang_decode_option): support -Wold-style-cast. - (reparse_absdcl_as_casts): produce old-style-cast warning. - -Mon Sep 29 09:20:53 1997 Benjamin Kosnik - - * decl.c (cp_finish_decl): Allow expand_aggr_init to set - TREE_USED, reset value based on already_used. - - * init.c (expand_member_init): Revert change. - -Mon Sep 29 08:57:53 1997 Jason Merrill - - * cp-tree.h, decl.c, decl2.c, pt.c: - Lose DECL_C_STATIC and DECL_PUBLIC. Don't pretend statics are public. - - * decl2.c (lang_decode_option): Add missing ;. - -Sat Sep 27 16:22:48 1997 Jason Merrill - - * friend.c (do_friend): Disable injection for all template-derived - decls. - * decl2.c (lang_decode_option): Handle -fguiding-decls. - * parse.y (notype_template_declarator): New nonterminal. - (direct_notype_declarator): Use it. - (complex_direct_notype_declarator): Likewise. - (object_template_id): Accept any kind of identifier after TEMPLATE. - (notype_qualified_id): Don't add template declarators here. - -Sat Sep 27 16:21:58 1997 Mark Mitchell - - * call.c (add_template_candidate): Add explicit_targs parameter. - (build_scoped_method_call): Use it. - (build_overload_call_real): Likewise. - (build_user_type_conversion_1): Likewise. - (build_new_function_call): Likewise. - (build_object_call): Likewise. - (build_new_op): Likewise. - (build_new_method_call): Likewise. - (build_new_function_call): Handle TEMPLATE_ID_EXPR. - (build_new_method_call): Likewise. - - * class.c (finish_struct_methods): Add specialization pass to - determine which methods were specializing which other methods. - (instantiate_type): Handle TEMPLATE_ID_EXPR. - - * cp-tree.def (TEMPLATE_ID_EXPR): New tree code. - - * cp-tree.h (name_mangling_version): New variable. - (flag_guiding_decls): Likewise. - (build_template_decl_overload): New function. - (begin_specialization): Likewise. - (reset_specialization): Likewise. - (end_specialization): Likewise. - (determine_explicit_specialization): Likewise. - (check_explicit_specialization): Likewise. - (lookup_template_function): Likewise. - (fn_type_unification): Add explicit_targs parameter. - (type_unification): Likewise. - - * decl.c (duplicate_decls): Add smarts for explicit - specializations. - (grokdeclarator): Handle TEMPLATE_ID_EXPR, and function - specializations. - (grokfndecl): Call check_explicit_specialization. - - * decl2.c (lang_decode_option): Handle -fname-mangling-version. - (build_expr_from_tree): Handle TEMPLATE_ID_EXPR. - (check_classfn): Handle specializations. - - * error.c (dump_function_name): Print specialization arguments. - - * friend.c (do_friend): Don't call pushdecl for template - instantiations. - - * init.c (build_member_call): Handle TEMPLATE_ID_EXPR. - - * lang-options.h: Add -fname-mangling-version, -fguiding-decls, - and -fno-guiding-decls. - - * lex.c (identifier_type): Return PFUNCNAME for template function - names. - - * method.c (build_decl_overload_real): New function. - (build_template_parm_names): New function. - (build_overload_identifier): Use it. - (build_underscore_int): New function. - (build_overload_int): Use it. Add levels for template - parameters. - (build_overload_name): Likewise. Also, handle TYPENAME_TYPEs. - (build_overload_nested_names): Handle template type parameters. - (build_template_decl_overload): New function. - - * parse.y (YYSTYPE): New ntype member. - (nested_name_specifier): Use it. - (nested_name_specifier_1): Likewise. - (PFUNCNAME): New token. - (template_id, object_template_id): New non-terminals. - (template_parm_list): Note specializations. - (template_def): Likewise. - (structsp): Likewise. - (fn.def2): Handle member template specializations. - (component_decl_1): Likewise. - (direct_notype_declarator): Handle template-ids. - (component_decl_1): Likewise. - (direct_notype_declarator): Handle template-ids. - (primary): Handle TEMPLATE_ID_EXPR, and template-ids. - - * pt.c (processing_specializations): New variable. - (template_header_count): Likewise. - (type_unification_real): New function. - (processing_explicit_specialization): Likewise. - (note_template_header): Likewise. - (is_member_template): Handle specializations. - (end_template_decl): Call reset_specialization. - (push_template_decl): Handle member template specializations. - (tsubst): Likewise. - (tsubst_copy): Handle TEMPLATE_ID_EXPR. - (instantiate_template): Handle specializations. - (instantiate_decl): Likewise. - (fn_type_unification): Handle explicit_targs. - (type_unification): Likewise. Allow incomplete unification - without an error message, if allow_incomplete. - (get_bindings): Use new calling sequence for fn_type_unification. - - * spew.c (yylex): Handle PFUNCNAME. - - * tree.c (is_overloaded_fn): Handle TEMPLATE_ID_EXPR. - (really_overloaded_fn): Likewise. - (get_first_fn): Handle function templates. - - * typeck.c (build_x_function_call): Use really_overloaded_fn. - Handle TEMPLATE_ID_EXPR. - (build_x_unary_op): Likewise. - (build_unary_op): Likewise. - (mark_addressable): Templates whose address is taken are marked - as used. - -1997-09-25 Andreas Schwab - - * decl.c (init_decl_processing): Declare __builtin_constant_p as - accepting any kind of type, not only int. - -Fri Sep 26 00:22:56 1997 Jason Merrill - - * search.c (get_matching_virtual): Notice virtual bases when sorrying - about covariant returns. - - * parse.y (member_init): Also imply typename here. Remove ancient - extension for initializing base members. - -Thu Sep 25 11:11:13 1997 Jason Merrill - - Handle multi-level typenames and implicit typename in base list. - * parse.y (typename_sub{,[0-2]}): New rules. - (structsp, rule TYPENAME_KEYWORD): Use typename_sub. - (nonnested_type): New rule. - (complete_type_name): Use it. - (base_class.1): Use typename_sub and nonnested_type. - (nested_name_specifier): Don't elide std:: here. - * decl.c (make_typename_type): Handle getting a type for NAME. - (lookup_name_real): Turn std:: into :: here. - - Rvalue conversions were removed in London. - * call.c (is_subseq): Don't consider lvalue transformations. - (build_conv): LVALUE_CONV and RVALUE_CONV get IDENTITY_RANK. - (joust): Reenable ?: kludge. - -1997-09-22 Brendan Kehoe - - * decl.c (start_function): Up warning of no return type to be a - pedwarn. - -Mon Sep 22 14:15:34 1997 Benjamin Kosnik - - * init.c (expand_member_init): Don't set TREE_USED. - * decl.c (cp_finish_decl): Mark decls used if type has TREE_USED - set,don't clear TREE_USED wholesale. - -Sat Sep 20 15:31:00 1997 Jason Merrill - - * call.c (build_over_call): Do require_complete_type before - build_cplus_new. - -Thu Sep 18 16:47:52 1997 Jason Merrill - - * search.c (lookup_field): Call complete_type in all cases. - - * decl.c (finish_function): Just warn about flowing off the end. - -Wed Sep 17 10:31:25 1997 Jason Merrill - - * decl.c (grokparms): Don't bash a permanent list node if we're - in a function. - -1997-09-17 Brendan Kehoe - - * Makefile.in (CONFLICTS): Fix s/r conflict count to 18. - -Tue Sep 16 14:06:56 1997 Jason Merrill - - * call.c (build_new_op): Give better error for syntactically - correct, but semantically invalid, use of undeclared template. - - * call.c (compare_qual): Handle pmfs. - - * decl.c (store_parm_decls): last_parm_cleanup_insn is the insn - after the exception spec. - -Mon Sep 15 11:52:13 1997 Jason Merrill - - * call.c (null_ptr_cst_p): Integer type, not integral type. - - * call.c (joust): Disable warnings until they can be moved to the - right place. - -Fri Sep 12 16:11:13 1997 Per Bothner - - * Makefile.in, config-lang.in: Convert to autoconf. - -Thu Sep 11 17:14:55 1997 Jason Merrill - - * decl.c (lookup_name_real): Add implicit 'typename' to types from - base classes. - - * pt.c (most_specialized_class): Fix typo. - (tsubst): Move constant folding to TREE_VEC case. - -Thu Sep 11 10:08:45 1997 Mark Mitchell - - * pt.c (do_poplevel): Don't warn about unused local variables - while processing_template_decl since we don't always know whether - or not they will need constructing/destructing. - - * pt.c (uses_template_parms): Check the values of an enumeration - type to make sure they don't depend on template parms. - - * decl.c (make_typename_type): Don't lookup the field if the - context uses template parms, even if we're not - processing_template_decl at the moment. - - * pt.c (coerce_template_parms): Avoid looking at the - TYPE_LANG_DECL portion of a typename type, since there won't be - one. - (tsubst): Do constant folding as necessary to make sure that - arguments passed to lookup_template_class really are constants. - -Wed Sep 10 11:21:55 1997 Jason Merrill - - * except.c (expand_builtin_throw): #ifndef DWARF2_UNWIND_INFO. - * decl2.c (finish_file): Only register exception tables if we - need to. - - * decl.c (init_decl_processing): Add __builtin_[fs]p. - -Tue Sep 9 19:49:38 1997 Jason Merrill - - * pt.c (unify): Just return 0 for a TYPENAME_TYPE. - -Tue Sep 9 17:57:25 1997 Mark Mitchell - - * error.c (dump_decl): Avoid crashing when presented with a - uninitialized constant, as can occur with a template parameter. - (dump_expr): Make sure that there are enough levels of - current_template_parms before we start diving through them. - -1997-09-09 Brendan Kehoe - - * typeck.c (build_indirect_ref): Heed FLAG_VOLATILE similar to - c-typeck.c. - -Tue Sep 9 09:36:39 1997 Benjamin Kosnik - - * except.c (expand_throw): Call build_delete for all - exception types, not just objects with destructors. - -Mon Sep 8 02:33:20 1997 Jody Goldberg - - * decl.c (current_local_enum): Remove static. - * pt.c (tsubst_enum): Save and restore value of current_local_enum - in case template is expanded in enum decl. - (instantiate_class_template) : Use new tsubst_enum signature. - (tsubst_expr): Likewise. - -Mon Sep 8 01:21:43 1997 Mark Mitchell - - * pt.c (begin_member_template_processing): Take a function as - argument, not a set of template arguments. Use the template - parameters, rather than the arguments. Handle non-type parameters - correctly. Push a binding level for the parameters so that multiple - member templates using the same parameter names can be declared. - (end_member_template_processing): Pop the binding level. - (push_template_decl): Mark member templates as static when - appropriate. - - * lex.c (do_pending_inlines): Pass the function, not its template - arguments, to begin_member_template_processing. - (process_next_inline): Likewise. - (do_pending_defargs): Likewise. - - * error.c (dump_expr): Obtain the correct declaration for a - TEMPLATE_CONST_PARM. - - * call.c (add_template_conv_candidate): New function. - (build_object_call): Handle member templates, as done in the other - build_ functions. - -Sat Sep 6 10:20:27 1997 Mark Mitchell - - * decl.c (replace_defag): Undo previous change. - * lex.c (do_pending_defargs): Deal with member templates. - - * pt.c (is_member_template): Avoid crashing when passed a - non-function argument. - -Fri Sep 5 17:27:38 1997 Jason Merrill - - * class.c (grow_method): Remove check for redeclaration. - -Fri Sep 5 01:37:17 1997 Mark Mitchell - - * cp-tree.h (INNERMOST_TEMPLATE_PARMS): New macro. - (DECL_INNERMOST_TEMPLATE_PARMS): Likewise. - (PRIMARY_TEMPLATE_P): Use it. - * call.c (build_overload_call_real): Use it. - * class.c (instantiate_type): Likewise. - * decl.c (decls_match): Likewise. - * method.c (build_overload_identifier): Likewise. - * pt.c (push_template_decl): Likewise. - (classtype_mangled_name): Likewise. - (lookup_template_class): Likewise. - - * cp-tree.h (DECL_NTPARMS): Change name from DECL_NT_PARMS to - DECL_NTPARMS to conform to usage elsewhere. - * call.c (add_template_candidate): Likewise. - * class.c (instantiate_type): Likewise. - * pt.c (instantiate_template): Likewise. - (get_bindings): Likewise. - - * class.c (grow_method): Use DECL_FUNCTION_TEMPLATE_P instead of - is_member_template. - - * pt.c (unify): Undo changes to allow multiple levels of template - parameters. - (type_unification): Likewise. - (fn_type_unification): Likewise. - (get_class_bindings): Likewise. - * cp-tree.h (Likewise). - - * decl.c (replace_defarg): Check that the type of the default - parameter does not invlove a template type before complaining - about the initialization. - - * error.c (dump_expr): Deal with template constant parameters in - member templates correctly. - - * pt.c (is_member_template): Deal with class specializations - correctly. - (tsubst): Handle "partial instantiation" of member templates - correctly. - -Wed Sep 3 12:30:24 1997 Mark Mitchell - - * pt.c (type_unification): Change calling squence to allow for - multiple levels of template parameters. - (tsubst_expr): Likewise. - (tsubst): Likewise. - (tsubst_copy): Likewise. - (instantiate_template): Likewise. - (unify): Likewise. - * call.c (build_overload_call_real): Use it. - (add_builtin_candidate): Use it. - (build_new_method_call): Use it. - * class.c (instantiate_type): Use it. - * decl.c (grokdeclarator): Use it. - * decl2.c (finish_file): Use it. - * method.c (build_overload_identifier): Use it. - - * call.c (add_template_candidate): Add additional parameter for - the function return type. Call fn_type_unification istead of - type_unification. - (build_user_type_conversion_1): Handle member templates. - (build_new_function_call): Likewise. - (build_new_op): Likewise. - (build_new_method_call): Likewise. - - * class.c (grow_method): Don't give an error message indicating - that two member templates with the same name are ambiguous. - (finish_struct): Treat member template functions just like member - functions. - - * cp-tree.h (check_member_template): Add declaration. - (begin_member_template_processing): Likewise. - (end_member_template_processing): Likewise. - (fn_type_unification): Likewise. - (is_member_template): Likewise. - (tsubst): Change prototype. - (tsubst_expr): Likewise. - (tsubst_copy): Likewise. - (instantiate_template): Likewise. - (get_bindings): Likewise. - - * decl.c (decls_match): Handle multiple levels of template - parameters. - (pushdecl): Handle template type params just like other type - declarations. - (push_class_level_binding): Return immediately if the - class_binding_level is NULL. - (grokfndecl): If check_classfn() returns a member_template, use - the result of the template, not the template itself. - - * decl2.c (check_member_template): New function. Check to see - that the entity declared to be a member template can be one. - (check_classfn): Allow redeclaration of member template functions - with different types; the new functions can be specializations or - explicit instantiations. - - * error.c (dump_decl): Handle multiple levels of template - parameters. - (dump_function_decl): Update to handle function templates. - - * lex.c (do_pending_inlines): Set up template parameter context - for member templates. - (process_next_inline): Likewise. - - * method. (build_overload_identifier): Adjust for multiple levels - of template parameters. - - * parse.y (fn.def2): Add member templates. - (component_decl_1): Likewise. - - * pt.c (begin_member_template_processing): New function. - (end_member_template_processing): Likewise. - (is_member_template): Likewise. - (fn_type_unification): Likewise. - (current_template_parms): Return a vector of all the template - parms, not just the innermost level of parms. - (push_template_decl): Deal with the possibility of member - templates. - (lookup_template_class): Likewise. - (uses_template_parms): Likewise. - (tsubst): Modify processing to TEMPLATE_TYPE_PARM and - TEMPLATE_CONST_PARM to deal with multiple levels of template - arguments. Add processing of TEMPLATE_DECL to produce new - TEMPLATE_DECLs from old ones. - (do_decl_instantiation): Handle member templates. - - * search.c (lookup_fnfields_1): Handle member template conversion - operators. - - * tree.c (cp_tree_equal): Check the levels, as well as the - indices, of TEMPLATE_CONST_PARMs. - - * typeck.c (comptypes): Check the levels, as well as the indices, - fo TEMPLATE_TYPE_PARMs. - (build_x_function_call): Treat member templates like member - functions. - -Wed Sep 3 11:09:25 1997 Jason Merrill - - * typeck.c (c_expand_return): Always convert_for_initialization - before checking for returning a pointer to local. - - * pt.c (type_unification): If strict and the function parm doesn't - use template parms, just compare types. - -Wed Sep 3 10:35:49 1997 Klaus Espenlaub - - * method.c (build_overloaded_value): Replace direct call - to the floating point emulator with REAL_VALUE_TO_DECIMAL macro. - -Wed Sep 3 00:02:53 1997 Jason Merrill - - * typeck.c (convert_arguments): Don't arbitrarily choose the first - of a set of overloaded functions. - -Tue Sep 2 12:09:13 1997 Jason Merrill - - * lex.c (real_yylex): Don't elide __FUNCTION__. - - * method.c (build_overload_value): Add in_template parm. - (build_overload_int): Likewise. - (build_overload_identifier): Pass it. - - * decl.c (duplicate_decls): Don't bash a previous template - definition with a redeclaration. - - * pt.c (unify): float doesn't match double. - - * pt.c (do_type_instantiation): Handle getting a _TYPE or a - TYPE_DECL. Handle getting non-template types. - * parse.y (explicit_instantiation): Use typespec instead of - aggr template_type. - -Tue Sep 2 10:27:08 1997 Richard Henderson - - * typeck.c (build_ptrmemfunc1): Clean up ptr->int cast warnings. - -Mon Sep 1 13:19:04 1997 Eugene Mamchits - - * call.c (add_builtin_candidate): Add missing TREE_TYPE. - (compare_ics): Likewise. - -Mon Sep 1 13:19:04 1997 Jason Merrill - - * call.c (joust): Warn about choosing one conversion op over - another because of 'this' argument when the other return type is - better. - (source_type): New fn. - - * call.c (build_new_op): Strip leading REF_BIND from first operand - to builtin operator. - - * decl2.c (mark_vtable_entries): Mark abort_fndecl as used when we - use its RTL. - -Thu Aug 28 09:45:23 1997 Jason Merrill - - * call.c (null_ptr_cst_p): Remove support for (void*)0. - -Wed Aug 27 02:03:34 1997 Jeffrey A Law (law@cygnus.com) - - * typeck.c (expand_target_expr): Make definition match declaration. - - * class.c (get_basefndecls): Make definition match declaration. - -Mon Aug 25 14:30:02 1997 Jason Merrill - - * input.c (sub_getch): Eventually give up and release the input file. - - * decl.c (cp_finish_decl): If #p i/i, put inline statics in the - right place. - - * call.c (joust): Tweak message. - -Sat Aug 23 18:02:59 1997 Mark Mitchell - - * error.c (type_as_string): Put const/volatile on template type - parameters where appropriate. - -Sat Aug 23 17:47:22 1997 Jeffrey A Law (law@cygnus.com) - - * call.c (strictly_better): Make arguments unsigned ints. - -Thu Aug 21 18:48:44 1997 Jason Merrill - - * lex.c (real_yylex): Refer to __complex instead of complex. - -Thu Aug 21 22:25:46 1997 J"orn Rennecke - - * lex.c (real_yylex): Don't use getc directly. - -Wed Aug 20 17:25:08 1997 Jason Merrill - - * call.c (is_subseq): Don't try to be clever. - -Wed Aug 20 03:13:36 1997 H.J. Lu (hjl@gnu.ai.mit.edu) - - * parse.y, pt.c: Include "except.h". - * call.c, class.c, class.h, cp-tree.h, cvt.c, decl.c, decl2.c, - error.c, except.c, expr.c, friend.c, g++spec.c, init.c, input.c, - lex.c, lex.h, method.c, parse.y, pt.c, repo.c, rtti.c, search.c, - sig.c, spew.c, tree.c, typeck.c, typeck2.c, xref.c: Finish - prototyping. - -Wed Aug 20 01:34:40 1997 Jason Merrill - - * decl2.c (mark_vtable_entries): Instead of replacing pure - virtuals with a reference to __pure_virtual, copy the decl and - change the RTL. - -Tue Aug 19 02:26:07 1997 Jason Merrill - - * pt.c (lookup_nested_type_by_name): Handle typedef wierdness. - - * typeck2.c (my_friendly_abort): Report bugs to egcs-bugs@cygnus.com. - - * pt.c (instantiate_class_template): Call repo_template_used - before finish_prevtable_vardecl. - - * call.c (is_subseq): New fn. - (compare_ics): Use it. - - * repo.c (finish_repo): Don't crash on no args. - - * parse.y (named_complex_class_head_sans_basetype): Handle - explicit global scope. - * decl2.c (handle_class_head): New fn. - - * pt.c (unify): Add CONST_DECL case. - -Thu Aug 14 10:05:13 1997 Brendan Kehoe - - * rtti.c (permanent_obstack): Fix decl to not be a pointer. - - * cp-tree.h (report_type_mismatch): Add prototype. - * call.c (build_overload_call_real): Remove erroneous fourth - argument to report_type_mismatch. - (build_user_type_conversion_1): Remove erroneous second arg to - tourney. - (build_new_function_call): Likewise. - (build_object_call): Likewise. - (build_new_op): Likewise. - (build_new_method_call): Likewise. - -Wed Aug 13 19:19:25 1997 Jason Merrill - - * error.c (dump_decl): Don't bother processing a function with no - DECL_LANG_SPECIFIC. - - * method.c (emit_thunk): Call init_function_start in the macro case. - -Wed Aug 13 10:46:19 1997 H.J. Lu (hjl@gnu.ai.mit.edu) - - * decl2.c (DEFAULT_VTABLE_THUNKS): Define to be 0 if not - defined and used to set flag_vtable_thunks. - -Tue Aug 12 20:13:57 1997 Jason Merrill - - * parse.y: Don't clear the inlines from their obstack until they've - all been processed. - - * decl.c (duplicate_decls): Don't complain about exception - specification mismatch if flag_exceptions is off. - -Mon Aug 11 15:01:56 1997 Marc Lehmann - - * Make-lang.in (c++.distclean): Remove g++.c on make distclean. - -Sun Aug 10 12:06:09 1997 Paul Eggert - - * cp-tree.h: Replace STDIO_PROTO with PROTO in include files. - * cvt.c, error.c, except.c, expr.c, friend.c, init.c, rtti.c: - Include before include files that formerly used STDIO_PROTO. - - * decl.c, g++spec.c, lex.c, method.c, repo.c: - Include "config.h" first, as per autoconf manual. - -Fri Aug 8 11:47:48 1997 Jason Merrill - - * decl.c (duplicate_decls): Tweak wording. - * lex.c (do_pending_defargs): Don't die if we see a default arg - that isn't a DEFAULT_ARG. - * error.c (dump_expr): Handle DEFAULT_ARG. - - * decl2.c (lang_decode_option): Handle -fhandle-exceptions. - * lang-options.h: Add -fhandle-exceptions. - - * class.c (build_vtable): vtables are artificial. - (prepare_fresh_vtable): Likewise. - -Wed Aug 6 11:02:36 1997 Jason Merrill - - * cvt.c (ocp_convert): After converting to the target type, set - LOOKUP_NO_CONVERSION. - - * call.c (joust): Warn about potentially confusing promotion rules - with -Wsign-promo. - * cp-tree.h, lang-options.h, decl2.c: Support -Wsign-promo. - -Tue Aug 5 15:15:07 1997 Michael Meissner - - * exception.cc: Declare __terminate_func with noreturn attribute. - -Fri Aug 1 03:18:15 1997 Jason Merrill - - * parse.y: Break out eat_saved_input, handle errors. - (function_try_block): Use compstmt instead of compstmt_or_error. - -Thu Jul 31 17:14:04 1997 Jason Merrill - - * tree.c (build_cplus_new): Don't set TREE_ADDRESSABLE. - -Fri Jul 4 01:45:16 1997 Andreas Schwab - - * Make-lang.in (cplib2.txt, cplib2.ready): Instead of checking for - existence of cc1plus check whether $(LANGUAGES) contains C++. - -Wed Jul 30 13:04:21 1997 Andreas Schwab - - * method.c (do_build_copy_constructor): When copying an anonymous - union member loop around to handle nested anonymous unions. Use - the offset of the member relative to the outer structure, not the - union. - -Tue Jul 29 21:17:29 1997 Jason Merrill - - * call.c (resolve_args): New fn. - (build_new_function_call): Use it. - (build_object_call): Likewise. - (build_new_method_call): Likewise. - -Mon Jul 28 16:02:36 1997 Jason Merrill - - * call.c (build_over_call): tsubst all default parms from templates. - -Wed Jul 23 13:36:25 1997 Jason Merrill - - * decl.c (struct cp_function): Add static_labelno. - (push_cp_function_context): Save it. - (pop_cp_function_context): Restore it. - -Tue Jul 22 14:43:29 1997 Jason Merrill - - * typeck.c (build_component_ref_1): Convert from reference. - -Tue Jul 22 11:06:23 1997 Brendan Kehoe - - * parse.y (current_declspecs, prefix_attributes): Initialize to - NULL_TREE. - - * parse.y (initdcl0): Make sure CURRENT_DECLSPECS is non-nil - before we try to force it to be a TREE_LIST. - (decl): Make sure $1.t is non-nil. - -Sun Jul 20 11:53:07 1997 Jason Merrill - - * pt.c (uses_template_parms): Handle template first-parse codes. - - * decl.c (cp_finish_decl): Only warn about user-defined statics. - -Fri Jul 18 17:56:08 1997 Jason Merrill - - * pt.c (unify): Handle BOOLEAN_TYPE. - - * cp-tree.h: Lose PARM_DEFAULT_FROM_TEMPLATE. - * pt.c (tsubst): Don't set it. - * call.c (build_over_call): Use uses_template_parms. - -Thu Jul 17 18:06:30 1997 Jason Merrill - - * method.c (build_overload_nested_name): Use static_labelno - instead of var_labelno. - (build_qualified_name): New fn. - (build_overload_name): Split out from here. - (build_static_name): Use build_qualified_name. - * decl.c (cp_finish_decl): Statics in extern inline functions - have comdat linkage. - (start_function): Initialize static_labelno. - -Thu Jul 17 11:20:17 1997 Benjamin Kosnik - - * class.c (finish_struct_methods): add check of warn_ctor_dtor_privacy - before "all member functions in class [] are private" - -Wed Jul 16 23:47:08 1997 Jason Merrill - - * lex.c (do_scoped_id): convert_from_reference. - * init.c (build_offset_ref): Likewise. - -Wed Jul 16 12:34:29 1997 Benjamin Kosnik - - * error.c (dump_expr): Check TREE_OPERAND before dump_expr_list. - -Mon Jul 14 03:23:46 1997 Jason Merrill - - * typeck.c (get_member_function_from_ptrfunc): Promote index - before saving it. - -Sun Jul 13 00:11:52 1997 Jason Merrill - - * tree.c (layout_basetypes): Move non-virtual destructor warning. - * decl.c (xref_basetypes): Remove non-virtual destructor warning. - -Sat Jul 12 12:47:12 1997 Jason Merrill - - * decl.c (grokdeclarator): Call add_defarg_fn for the function - type, too. - * lex.c (add_defarg_fn): Adjust. - (do_pending_defargs): Adjust. Don't skip the first parm. - -Fri Jul 11 01:39:50 1997 Jason Merrill - - * decl.c (build_enumerator): Global enumerators are also readonly. - - * rtti.c (build_dynamic_cast_1): Renamed from build_dynamic_cast. - (build_dynamic_cast): Call it and convert_from_reference. - - * lex.c (add_defarg_fn): New fn. - (snarf_defarg): Don't add to defarg_types. - (do_pending_defargs): Lose defarg_types. All fns we process now - have defargs. - * decl.c (grokfndecl): Call add_defarg_fn. - - * Makefile.in (CONFLICTS): Expect 18 s/r conflicts. - * cp-tree.def: Add DEFAULT_ARG. - * spew.c (yylex): Call snarf_defarg as appropriate. - * parse.y: New tokens DEFARG and DEFARG_MARKER. - (defarg_again, pending_defargs, defarg, defarg1): New rules. - (structsp): Use pending_defargs. - (parms, full_parm): Use defarg. - * lex.c (init_lex): Initialize inline_text_firstobj. - (do_pending_inlines): Never pass the obstack to feed_input. - (process_next_inline): Call end_input instead of restore_pending_input. - (clear_inline_text_obstack, reinit_parse_for_expr, do_pending_defargs, - finish_defarg, feed_defarg, snarf_defarg, maybe_snarf_defarg): New fns. - * input.c (end_input): New fn. - (sub_getch): At the end of some fed input, just keep returning EOF - until someone calls end_input. - Remove 'obstack' field from struct input_source. - * decl.c (grokparms): Handle DEFAULT_ARG. - (replace_defarg): New fn. - * cp-tree.h (DEFARG_LENGTH, DEFARG_POINTER): New macros. - -Wed Jul 9 13:44:12 1997 Jason Merrill - - * call.c (implicit_conversion): If nothing else works, try binding - an rvalue to a reference. - -Wed Jul 9 13:04:38 1997 Geoffrey Noer - - * decl.c (init_decl_processing): fix Jun 30 patch -- move - ifndef for Cygwin32 to include SIGSEGV. - -Thu Jul 3 01:44:05 1997 Jason Merrill - - * class.c (finish_struct_1): Only complain about pointers without - copy stuff if there are any constructors. - - * rtti.c (build_dynamic_cast): Call complete_type on the types. - - * decl.c (grokfndecl): If the function we chose doesn't actually - match, die. - - * decl2.c (grokclassfn): Don't specify 'const int' for the - artificial destructor parm. - - * pt.c (type_unification): If we are called recursively, nothing - decays. - -Mon Jun 30 17:53:21 1997 Geoffrey Noer - - * decl.c (init_decl_processing): Stop trying to catch signals - other than SIGABRT since the Cygwin32 library doesn't support - them correctly yet. This fixes a situation in which g++ causes - a hang on SIGSEGVs and other such signals in our Win32-hosted - tools. - -Mon Jun 30 14:50:01 1997 Jason Merrill - - * tree.c (mapcar, case CALL_EXPR): Handle all the parse node data. - -Fri Jun 27 15:18:49 1997 Jason Merrill - - * typeck2.c (store_init_value): Always return the value if our - type needs constructing. - - * method.c (hack_identifier): Convert class statics from - reference, too. - -Thu Jun 26 11:44:46 1997 Jason Merrill - - * Make-lang.in (cplib2.ready): Add $(LANGUAGES) dependency. - -Thu Jun 19 16:49:28 1997 Mike Stump - - * typeck.c (c_expand_return): Make sure we clean up temporaries at - the end of return x; - -Thu Jun 19 12:28:43 1997 Brendan Kehoe - - * lex.c (check_for_missing_semicolon): Also check for CV_QUALIFIER. - -Tue Jun 17 18:35:57 1997 Mike Stump - - * except.c (expand_builtin_throw): Add support - -fno-sjlj-exceptions -fPIC exception handling on the SPARC. - -Mon Jun 16 01:24:37 1997 Jason Merrill - - * repo.c (extract_string): Null-terminate. - - * cp-tree.h (TI_SPEC_INFO): New macro. - (CLASSTYPE_TI_SPEC_INFO): New macro. - * pt.c (push_template_decl): Correctly determine # of template parms - for partial specs. - - * call.c (compare_ics): Really fix 'this' conversions. - - * pt.c (do_decl_instantiation): Don't crash on explicit inst of - non-template fn. - - * pt.c (push_template_decl): Complain about mismatch in # of - template parms between a class template and a member template. - -Sun Jun 15 02:38:20 1997 Jason Merrill - - * method.c (synthesize_method): You can't call - function_cannot_inline_p after finish_function. - * decl.c (finish_function): Turn on flag_inline_functions and turn - off DECL_INLINE before handing a synthesized method to the - backend. - -Thu Jun 12 17:35:28 1997 Jason Merrill - - * method.c (synthesize_method): Remove July 30 change to never set - DECL_INLINE if at_eof. - -Thu Jun 12 15:25:08 1997 Mike Stump - - * xref.c (GNU_xref_member): Ensure that the node has a - decl_lang_specific part before checking DECL_FRIEND_P. - -Thu Jun 12 12:36:05 1997 Jason Merrill - - * pt.c (instantiate_class_template): Diagnose non-class types used - as bases. - -Wed Jun 11 17:33:40 1997 Jason Merrill - - * typeck.c (build_conditional_expr): Use convert_for_initialization - instead of convert_and_check. - -Wed Jun 11 12:31:33 1997 Brendan Kehoe - - * parse.y (typespec): Don't pedwarn for typeof. - -Tue Jun 10 00:22:09 1997 Jason Merrill - - * repo.c (finish_repo): Only check changes if we would write a - repo file. - - * call.c (compare_ics): Fix handling of 'this' conversions. - - * pt.c (do_decl_instantiation): Support static data too. Rename - from do_function_instantiation. - * cp-tree.h: Adjust. - * parse.y: Adjust. - - * repo.c (extract_string): New fn. - (get_base_filename): Use it. - (init_repo): Compare old args with current args. - -Mon Jun 9 14:25:30 1997 Mike Stump - - * Makefile.in, Make-lang.in: Protect C-ls with a comment - character, idea from Paul Eggert . - -Mon Jun 9 01:52:03 1997 Jason Merrill - - * typeck.c (c_expand_return): Be more persistent in looking for - returned temps. - - * cvt.c (build_up_reference): Use NOP_EXPR for switching from - pointer to reference. - - * class.c (build_vbase_path): Don't do anything if PATH has no steps. - -Sun Jun 8 03:07:05 1997 Jason Merrill - - * init.c (build_member_call, build_offset_ref): - Use do_scoped_id instead of do_identifier. - - * cvt.c (convert): Remove bogosity. - -Sat Jun 7 20:50:17 1997 Brendan Kehoe - - * cvt.c (build_up_reference): Do checks of ARGTYPE and - TARGET_TYPE before trying to use get_binfo. - -Fri Jun 6 17:36:39 1997 Jason Merrill - - * cvt.c (build_up_reference): Call get_binfo to get access control. - - * decl2.c (import_export_decl): If we don't support weaks, leave - statics undefined. - -Fri Jun 6 15:55:49 1997 Mike Stump - - * except.c (expand_builtin_throw): Add support for machines that - cannot access globals after throw's epilogue when - -fno-sjlj-exceptions is used. - -Thu Jun 5 16:28:43 1997 Jason Merrill - - * parse.y: 'std::' becomes '::'. - * lex.c (real_yylex): Remove 'namespace' warning. - * init.c (build_member_call): Ignore 'std::'. - (build_offset_ref): Likewise. - * decl2.c (do_using_directive): Ignore 'using namespace std;'. - (do_toplevel_using_decl): Ignore 'using std::whatever'. - * decl.c (push_namespace): Just sorry. - (pop_namespace): Nop. - (init_decl_processing): Declare std namespace. - -Tue Jun 3 18:08:23 1997 Jason Merrill - - * search.c (push_class_decls): A name which ambiguously refers to - several instantiations of the same template just refers to the - template. - -Tue Jun 3 12:30:40 1997 Benjamin Kosnik - - * decl.c (build_enumerator): fix problem with unsigned long - enumerated values being smashed to ints, causing overflow - when computing next enumerated value. (for enum values around - MAX_VAL). - -Mon Jun 2 17:40:56 1997 Jason Merrill - - * typeck.c (build_component_ref): Only call mark_used on a decl. - -Thu May 29 15:54:17 1997 Brendan Kehoe - - * typeck.c (build_c_cast): Make the check for a ptr to function - more specific before possible default_conversion call. - -Thu May 29 13:02:06 1997 Mike Stump - - * except.c (expand_exception_blocks): Simplify and fix and make - sure we don't end a region in a sequence, as expand_end_bindings - doesn't like it. - -Wed May 28 17:08:03 1997 Mike Stump - - * except.c (init_exception_processing): Mark terminate as not - returning so that the optimizer can optimize better. - -Tue May 27 19:49:19 1997 Mike Stump - - * cvt.c (convert): Don't do any extra work, if we can avoid it - easily. - -Tue May 27 18:21:47 1997 Mike Stump - - * *.[chy]: Change cp_convert to ocp_convert, change convert to - cp_convert. convert is now reserved for the backend, and doesn't - have the semantics a frontend person should ever want. - -Fri May 23 10:58:31 1997 Jason Merrill - - * lang-specs.h: Define __EXCEPTIONS if exceptions are enabled. - Lose -traditional support. - -Thu May 22 15:41:28 1997 Jason Merrill - - * rtti.c (get_tinfo_var): Use TYPE_PRECISION (sizetype). - - * parse.y (self_reference): Do it for templates, too. - * class.c (pushclass): Don't overload_template_name; the alias - generated by build_self_reference serves the same purpose. - - * tree.c (list_hash): Make static, take more args. - (list_hash_lookup): Likewise. - (list_hash_add): Make static. - (list_hash_canon): Lose. - (hash_tree_cons): Only build a new node if one isn't already in the - hashtable. - (hash_tree_chain): Use hash_tree_cons. - * cp-tree.h: Adjust. - * decl.c (grokfndecl): Just check IDENTIFIER_GLOBAL_VALUE instead - of calling lookup_name. - -Wed May 21 18:24:19 1997 Jason Merrill - - * pt.c (instantiate_class_template): TYPE_VALUES for an enum - doesn't refer to the CONST_DECLs. - -Tue May 20 21:09:32 1997 Bob Manson - - * rtti.c (get_tinfo_var): Either INT_TYPE_SIZE or 32, whichever - is bigger. - (expand_class_desc): Convert the last argument to a sizetype. - -Tue May 20 13:55:57 1997 Brendan Kehoe - - * gxx.gperf (__complex, __complex__, __imag, __imag__, __real, - __real__): Add reswords. - * hash.h: Regenerate. - * lex.h (rid): Add RID_COMPLEX. - (RID_LAST_MODIFIER): Set to RID_COMPLEX. - * lex.c (init_lex): Add building of RID_COMPLEX. - (real_yylex): General cleanup in line with what c-lex.c also has, - sans the cruft for traditional; add handling of SPEC_IMAG, complex - types, and imaginary numeric constants. - * parse.y (REALPART, IMAGPART): Add tokens. - (unary_expr): Add REALPART and IMAGPART rules. - * cp-tree.h (complex_{integer,float,double,long}_type_node): Declare. - * decl.c (complex_{integer,float,double,long}_type_node): Define - types. - (init_decl_processing): Set up the types. - (grokdeclarator): Add handling of RID_COMPLEX. Set and use - DEFAULTED_INT instead of EXPLICIT_INT when we default to int type. - * call.c (build_new_op): Add REALPART_EXPR and IMAGPART_EXPR cases. - * cvt.c (cp_convert): Handle COMPLEX_TYPE. - * error.c (dump_type_prefix, dump_type, dump_type_suffix): Add - COMPLEX_TYPE case. - * method.c (build_overload_name): Add handling of the different - COMPLEX_TYPEs, prefixing them with `J'. - * pt.c (process_template_parm): Don't let them use a COMPLEX_TYPE - as a template parm. - (uses_template_parms, tsubst, unify): Add COMPLEX_TYPE case. - * tree.c (lvalue_p): Add REALPART_EXPR and IMAGPART_EXPR cases. - (mapcar): Handle COMPLEX_CST. - * typeck.c (build_binary_op_nodefault): Handle COMPLEX_TYPE. - (common_type): Add code for complex types. - (build_unary_op): Add REALPART_EXPR and IMAGPART_EXPR cases. - (convert_for_assignment): Likewise. - (mark_addressable): Add REALPART_EXPR and IMAGPART_EXPR cases. - -Mon May 19 12:26:27 1997 Jason Merrill - - * pt.c (tsubst): Don't pass the MINUS_EXPR for an array domain to - tsubst_expr, as it might try to do overload resolution. - -Sat May 17 10:48:31 1997 Jason Merrill - - * pt.c (instantiate_class_template): Oops. - -Fri May 16 14:23:57 1997 Jason Merrill - - * cp-tree.def: Add TAG_DEFN. - * pt.c (tsubst_enum): New fn. - (instantiate_class_template): Use it. - (tsubst_expr): Support TAG_DEFN. - (tsubst): Support local enums. - (tsubst_copy): Likewise. - * decl.c (finish_enum): Likewise. - (start_enum): If this is a local enum, switch to permanent_obstack. - -Wed May 14 19:08:28 1997 Mike Stump - - * decl.c (store_parm_decls): Set last_parm_cleanup_insn here. - (finish_function): Put the base init code for constructors just - after the parm cleanup insns. - (struct cp_function): Add last_parm_cleanup_insn. - (push_cp_function_context): Likewise. - (pop_cp_function_context): Likewise. - -Tue May 13 15:51:20 1997 Jason Merrill - - * pt.c (tsubst_copy): Handle BIT_NOT_EXPR. - -Wed May 7 11:17:59 1997 Brendan Kehoe - - * method.c (emit_thunk) [ASM_OUTPUT_MI_THUNK]: Build up the RTL - for THUNK_FNDECL before we switch to temporary allocation. - -Mon May 5 14:46:53 1997 Jason Merrill - - * call.c (build_new_op): Handle null arg2 for ?:. - -Thu May 1 18:26:37 1997 Mike Stump - - * except.c (expand_exception_blocks): Ensure that we flow through - the end of the exception region for the exception specification. - Move exception region for the exception specification in, so that - it doesn't protect the parm cleanup. Remove some obsolete code. - * decl.c (store_parm_decls): Likewise. - (finish_function): Likewise. - -Tue Apr 29 15:38:54 1997 Jason Merrill - - * init.c (build_new): Fix nothrow handling. - -Tue Apr 29 14:29:50 1997 Brendan Kehoe - - * init.c (emit_base_init): Don't warn about the initialization - list for an artificial member. - -Fri Apr 25 17:47:59 1997 Brendan Kehoe - - * expr.c (do_case): Handle !START case for the error msg. - -Fri Apr 25 11:55:23 1997 Jason Merrill - - * decl2.c, lang-options.h: New option -Weffc++. - * class.c, decl.c, init.c, typeck.c: Move Effective C++ warnings - to -Weffc++. - - * decl2.c (finish_prevtable_vardecl): Change NO_LINKAGE_HEURISTICS - to MULTIPLE_SYMBOL_SPACES. - -Wed Apr 23 18:06:50 1997 Jason Merrill - - * method.c (emit_thunk, generic case): Set current_function_is_thunk. - - * method.c (emit_thunk, macro case): Set up DECL_RESULT. - - * typeck.c (c_expand_return): Don't complain about returning void - to void in an artificial function. - * method.c (make_thunk): Change settings of READONLY/VOLATILE, - don't set DECL_RESULT, set DECL_ARTIFICIAL. - (emit_thunk, generic code): Also set up DECL_LANG_SPECIFIC. - -Wed Apr 23 14:43:06 1997 Mike Stump - - * init.c (init_decl_processing): Add supoprt for setjmp/longjmp based - exception handling. - * except.c (init_exception_processing): Likewise. - (expand_end_catch_block): Likewise. - (expand_exception_blocks): Likewise. - (expand_throw): Likewise. - * exception.cc (__default_terminate): Likewise. - - * init.c (perform_member_init): Use new method of expr level - cleanups, instead of cleanups_this_call and friends. - (emit_base_init): Likewise. - (expand_aggr_vbase_init_1): Likewise. - (expand_vec_init): Likewise. - * decl.c (cp_finish_decl): Likewise. - (expand_static_init): Likewise. - (store_parm_decls): Likewise. - (cplus_expand_expr_stmt): Likewise. - * decl2.c (finish_file): Likewise. - - * Make-lang.in (exception.o): Ok to compile with -O now. - - * decl.c (maybe_build_cleanup_1): We no longer have to unsave, as - we know it will be done later by the backend. - - * decl2.c (lang_f_options): Remove support for short temps. - * lang-options.h: Likewise. - -Wed Apr 23 04:12:06 1997 Jason Merrill - - * tree.c (varargs_function_p): New fn. - * method.c (emit_thunk): Replace broken generic code with code to - generate a heavyweight thunk function. - -Tue Apr 22 02:45:18 1997 Jason Merrill - - * pt.c (process_template_parm): pedwarn about floating-point parms. - - * decl.c (grokdeclarator): inline no longer implies static. - - * spew.c (yylex): Always return the TYPE_DECL if we got a scope. - -Mon Apr 21 15:42:27 1997 Jason Merrill - - * class.c (check_for_override): The signature of an overriding - function is not changed. - - * call.c (build_over_call): Move setting of conv into the loop. - Note: this change, along with the related changes of the 18th thru - the 20th of April, fix an infinite loop problem in conversions. - -Sun Apr 20 16:24:29 1997 Jason Merrill - - * call.c (build_user_type_conversion_1): Really ignore rvalue - conversions when looking for a REFERENCE_TYPE. - - * cvt.c (build_up_reference): Eviscerate, use build_unary_op. - * cp-tree.h (TREE_REFERENCE_EXPR): #if 0. - * typeck.c (decay_conversion): Don't set TREE_REFERENCE_EXPR. - (build_unary_op): Likewise. - * call.c (build_over_call): See through a CONVERT_EXPR around the - ADDR_EXPR for on a temporary. - * typeck.c (c_expand_return): See through a CONVERT_EXPR around - the ADDR_EXPR for a local variable. - -Fri Apr 18 12:11:33 1997 Jason Merrill - - * call.c (build_user_type_conversion_1): If we're trying to - convert to a REFERENCE_TYPE, only consider lvalue conversions. - (build_new_function_call): Print candidates. - (implicit_conversion): Try a temp binding if the lvalue conv is BAD. - (reference_binding): Binding a temporary of a reference-related type - is BAD. - -Thu Apr 17 14:37:22 1997 Brendan Kehoe - - * inc/typeinfo (type_info::before): Add cv-qualifier-seq. - * tinfo2.cc (type_info::before): Likewise. - -Mon Apr 14 12:38:17 1997 Jason Merrill - - * call.c (implicit_conversion): Oops. - -Fri Apr 11 02:18:30 1997 Jason Merrill - - * call.c (implicit_conversion): Try to find a reference conversion - before binding a const reference to a temporary. - -Wed Apr 2 12:51:36 1997 Mike Stump - - * exception.cc (__default_unexpected): Call terminate by default, - so that if the user overrides terminate, the correct function will - be called. - -Wed Mar 19 14:14:45 1997 Mike Stump - - * parse.y (left_curly): Avoid trying to use any fields of - error_mark_node, as there aren't any. - -Thu Mar 13 16:33:22 1997 Jason Merrill - - * lex.c (do_identifier): Avoid breaking on overloaded methods - as default arguments. - -Wed Mar 12 13:55:10 1997 Hans-Peter Nilsson - - * call.c (add_template_candidate): Initialize the variable "dummy". - -Mon Mar 10 15:13:14 1997 Brendan Kehoe - - * decl.c (start_decl): Make sure TYPE isn't an error_mark_node - before we try to use TYPE_SIZE and TREE_CONSTANT on it. - -Fri Mar 7 13:19:36 1997 Brendan Kehoe - - * cp-tree.h (comp_ptr_ttypes, more_specialized): Add decl. - (debug_binfo): Delete decl, not needed. - - * tree.c (fnaddr_from_vtable_entry, function_arg_chain, - promotes_to_aggr_type): Delete fns. - * cp-tree.h (FNADDR_FROM_VTABLE_ENTRY, - SET_FNADDR_FROM_VTABLE_ENTRY, FUNCTION_ARG_CHAIN, - PROMOTES_TO_AGGR_TYPE): Delete alternates to #if 1. - - * decl.c (pending_invalid_xref{,_file,_line}): Delete unused vars. - - * friend.c (is_friend_type): Delete fn. - * cp-tree.h (is_friend_type): Delete decl. - - * decl.c (original_result_rtx, double_ftype_double, - double_ftype_double_double, int_ftype_int, long_ftype_long, - float_ftype_float, ldouble_ftype_ldouble, last_dtor_insn): Make static. - * typeck.c (original_result_rtx, warn_synth): Delete extern decls. - - * decl.c (push_overloaded_decl{,_top_level}): Make static, adding - fwd decls. - * cp-tree.h (push_overloaded_decl{,_top_level}): Delete decls. - - * decl.c (pushdecl_nonclass_level): #if 0, unused. - * cp-tree.h (pushdecl_nonclass_level): #if 0 decl. - - * lex.c (reinit_lang_specific): #if 0, unused. - * cp-tree.h (reinit_lang_specific): #if 0 decl. - - * decl.c (revert_static_member_fn): Make static, adding fwd decl. - * cp-tree.h (revert_static_member_fn): Delete decl. - - * class.c (root_lang_context_p): Delete fn. - * cp-tree.h (root_lang_context_p): Delete decl. - - * decl.c (set_current_level_tags_transparency): #if 0, unused. - * cp-tree.h (set_current_level_tags_transparency): #if 0 decl. - - * lex.c (set_vardecl_interface_info): Make static. - * cp-tree.h (set_vardecl_interface_info): Delete decl. - - * call.c (find_scoped_type): Make static. - * cp-tree.h (find_scoped_type): Delete decl. - - * search.c (convert_pointer_to_vbase): Make static. - * cp-tree.h (convert_pointer_to_vbase): Delete decl. - - * decl.c (const_ptr_type_node): Likewise. - * cp-tree.h (const_ptr_type_node): Delete decl. - - * typeck.c (common_base_type): Make static. - * cp-tree.h (common_base_types): Delete erroneous decl. - - * pt.c (classtype_mangled_name): Make static. - * cp-tree.h (classtype_mangled_name): Delete decl. - - * lex.c (check_newline): Make static. - * cp-tree.h (check_newline): Delete decl. - - * typeck.c (build_x_array_ref): Delete fn, same idea as - grok_array_decl. - * cp-tree.h (build_x_array_ref): Delete decl. - - * lex.c (copy_decl_lang_specific): Delete fn, same idea as - copy_lang_decl. - * cp-tree.h (copy_decl_lang_specific): #if 0 decl. - - * class.c (build_vtable_entry): Make static. - * cp-tree.h (build_vtable_entry): Delete decl. - - * class.c (build_vbase_pointer): Make static. - * cp-tree.h (build_vbase_pointer): Delete decl. - - * sig.c (build_sptr_ref): Add forward decl and make static. - * cp-tree.h (build_sptr_ref): Delete decl. - - * call.c (build_new_method_call): Add forward decl and make static. - * cp-tree.h (build_new_method_call): Delete decl. - - * call.c (build_object_call): Make static. - * class.c (check_for_override, complete_type_p, mark_overriders): - Likewise. - * decl.c (cp_function_chain): Likewise. - * lex.c (set_typedecl_interface_info, reinit_parse_for_block): - Likewise. - * pt.c (comp_template_args, get_class_bindings, push_tinst_level): - Likewise. - * tree.c (build_cplus_array_type_1): Likewise. - * typeck.c (comp_ptr_ttypes_{const,real,reinterpret}): Likewise. - (comp_target_parms): Likewise. - - * init.c (build_builtin_call): Make static. - * cp-tree.h (build_builtin_call): Delete decl. - - * typeck.c (binary_op_error): Delete decl. - * cp-tree.h (binary_op_error): Likewise. - -Thu Mar 6 16:13:52 1997 Brendan Kehoe - - * call.c (build_method_call): Compare against error_mark_node - directly, rather than the ERROR_MARK tree code. - * cvt.c (cp_convert): Likewise. - * decl.c (print_binding_level): Likewise. - (duplicate_decls): Likewise. - (grokdeclarator): Likewise. - (grokdeclarator): Likewise. - * init.c (expand_aggr_init_1): Likewise. - (decl_constant_value): Likewise. - * method.c (build_opfncall): Likewise. - (hack_identifier): Likewise. - * typeck.c (build_modify_expr): Likewise. - - * typeck.c (build_c_cast): Don't decl TYPE as register tree. - -Sun Mar 2 02:54:36 1997 Bruno Haible - - * pt.c (unify): Strip NOP_EXPR wrappers before unifying integer values. - - * pt.c (coerce_template_parms): Add new error message. - - * method.c (build_overload_value): Implement name mangling for - floating-point template arguments. - - * method.c (build_overload_int, icat, dicat): Fix mangling of template - arguments whose absolute value doesn't fit in a signed word. - -Mon Mar 3 12:14:54 1997 Brendan Kehoe - - * friend.c: New file; put all of the friend stuff in here. - * init.c: Instead of here. - * Makefile.in (CXX_OBJS): Add friend.o. - (friend.o): Add dependencies. - * Make-lang.in (CXX_SRCS): Add $(srcdir)/cp/friend.c. - -Sun Mar 2 11:04:43 1997 Jason Merrill - - * call.c (build_scoped_method_call): Complain if the scope isn't a - base. - -Wed Feb 26 11:31:06 1997 Jason Merrill - - * parse.y (left_curly): Don't crash on erroneous type. - - * init.c (build_delete): Fix type of ref. - -Tue Feb 25 12:41:48 1997 Jason Merrill - - * search.c (get_vbase_1): Renamed from get_vbase. - (get_vbase): Wrapper, now non-static. - (convert_pointer_to_vbase): Now static. - - * call.c (build_scoped_method_call): Accept a binfo for BASETYPE. - * init.c (build_delete): Pass one. - (build_partial_cleanup_for): Use build_scoped_method_call. - * decl.c (finish_function): Pass a binfo. - -Mon Feb 24 15:00:12 1997 Jason Merrill - - * call.c (build_over_call): Only synthesize non-trivial copy ctors. - - * typeck.c (build_c_cast): Lose other reference to flag. - - * call.c (build_field_call): Don't look for [cd]tor_identifier. - * decl2.c (delete_sanity): Remove meaningless use of - LOOKUP_HAS_IN_CHARGE. - * decl.c (finish_function): Use build_scoped_method_call instead - of build_delete for running vbase dtors. - * init.c (build_delete): Call overload resolution code instead of - duplicating it badly. - -Thu Feb 20 15:12:15 1997 Jason Merrill - - * call.c (build_over_call): Call mark_used before trying to elide - the call. - - * decl.c (implicitly_declare): Don't set DECL_ARTIFICIAL. - -Wed Feb 19 11:18:53 1997 Brendan Kehoe - - * typeck.c (build_modify_expr): Always pedwarn for a cast to - non-reference used as an lvalue. - -Wed Feb 19 10:35:37 1997 Jason Merrill - - * cvt.c (cp_convert_to_pointer): Convert from 0 to a pmf properly. - -Tue Feb 18 15:40:57 1997 Jason Merrill - - * parse.y (handler): Fix template typo. - -Sun Feb 16 02:12:28 1997 Jason Merrill - - * error.c (lang_decl_name): New fn. - * tree.c (lang_printable_name): Use it. - -Fri Feb 14 16:57:05 1997 Mike Stump - - * g++spec.c: Include config.h so that we can catch bzero #defines - from the config file. - -Tue Feb 11 13:50:48 1997 Mike Stump - - * new1.cc: Include a declaration for malloc, to avoid warning, and - avoid lossing on systems that require one (ones that define malloc - in xm.h). - -Mon Feb 10 22:51:13 1997 Bruno Haible - - * decl2.c (max_tinst_depth): New variable. - (lang_decode_option): Parse "-ftemplate-depth-NN" command line - option. - * pt.c (max_tinst_depth): Variable moved. - * lang-options.h: Declare "-ftemplate-depth-NN" command line option - as legal. - -Fri Feb 7 15:43:34 1997 Jason Merrill - - * decl.c (xref_basetypes): Allow a base class that depends on - template parms to be incomplete. - - * decl2.c (build_expr_from_tree): Support typeid(type). - * rtti.c (get_typeid): Support templates. - (expand_si_desc, expand_class_desc): Fix string length. - (expand_ptr_desc, expand_attr_desc, expand_generic_desc): Likewise. - -Tue Feb 4 11:28:24 1997 Jason Merrill - - * pt.c (unify, case TEMPLATE_CONST_PARM): Use cp_tree_equal. - - * pt.c (tsubst): Put it back for -fno-ansi-overloading. - -Mon Feb 3 18:41:12 1997 Jason Merrill - - * pt.c (tsubst, case FUNCTION_DECL): Lose obsolete code that - smashes together template and non-template decls of the same - signature. - -Thu Jan 30 19:18:00 1997 Jason Merrill - - * pt.c (tsubst): Don't recurse for the type of a TYPENAME_TYPE. - -Wed Jan 29 11:40:35 1997 Brendan Kehoe - - * decl.c (duplicate_decls): Next route, pedwarn about different - exceptions if -pedantic *or* olddecl !DECL_IN_SYSTEM_HEADER. - -Tue Jan 28 20:43:29 1997 Brendan Kehoe - - * cp-tree.h (HAS_DEFAULT_IMPLEMENTATION): Delete macro. - (struct lang_type): Delete has_default_implementation member. - Increase dummy to 21. - * decl.c (start_method): Delete usage. - - * cp-tree.h (build_call, null_ptr_cst_p, in_function_p, - store_after_parms, start_decl_1, auto_function): Add decls. - (get_arglist_len_in_bytes, declare_implicit_exception, - have_exceptions_p, make_type_decl, typedecl_for_tag, - store_in_parms, pop_implicit_try_blocks, push_exception_cleanup, - build_component_type_expr, cplus_exception_name, - {make,clear}_anon_parm_name, dont_see_typename): Removed decls. - * call.c (build_this): Make static. - (is_complete): Likewise. - (implicit_conversion): Likewise. - (reference_binding): Likewise. - (standard_conversion): Likewise. - (strip_top_quals): Likewise. - (non_reference): Likewise. - (build_conv): Likewise. - (user_harshness): Likewise. - (rank_for_ideal): Likewise. - * decl.c (start_decl_1): Delete forward decl. - (push_decl_level): Make static. - (resume_binding_level): Make static. - (namespace_bindings_p): Make static. - (declare_namespace_level): Make static. - (lookup_name_real): Make static. - (duplicate_decls): Make static. Take register off NEWDECL and - OLDDECL parm decls. - * decl2.c (get_sentry): Make static. - (temp_name_p): Delete fn. - * except.c (auto_function): Delete decl. - * lex.c (handle_{cp,sysv}_pragma): Make static. - (handle_sysv_pragma) [HANDLE_SYSV_PRAGMA]: Add forward decl. - * method.c (do_build_{copy_constructor,assign_ref}): Make static. - * pt.c (tsubst_expr_values): Make static. - * rtti.c (combine_strings): Delete decl. - -Tue Jan 28 16:40:40 1997 Jason Merrill - - * pt.c (push_template_decl): Handle getting a typedef. - - * call.c (build_new_function_call): Complain about void arg. - -Tue Jan 28 15:25:09 1997 Brendan Kehoe - - * decl.c (duplicate_decls): Give pedwarn of different exceptions - if -pedantic, instead of olddecl !DECL_IN_SYSTEM_HEADER. - -Mon Jan 27 19:21:29 1997 Mike Stump - - * except.c (expand_throw): Don't expand the cleanup tree here, - since we are not going to write the rtl out. Fixes problem with - -g -O on SPARC. - -Mon Jan 27 16:24:35 1997 Sean McNeil - - * Make-lang.in: Add $(exeext) as necessary. - -Mon Jan 27 13:20:39 1997 Mike Stump - - * parse.y (handler_seq): Must have at least one catch clause. - -Sat Jan 25 12:00:05 1997 Jason Merrill - - * call.c (add_builtin_candidate): Restore ?: hack. - - * decl.c (grok_op_properties): More warnings. - -Sat Jan 25 08:50:03 1997 Brendan Kehoe - - * decl.c (duplicate_decls): On second thought, do it as a pedwarn - still but only if !DECL_IN_SYSTEM_HEADER (olddecl). - - * decl.c (duplicate_decls): Scale back to a warning, and only do - 'em if -pedantic. - -Fri Jan 24 17:52:54 1997 Mike Stump - - * decl.c (duplicate_decls): pedwarn mismatched exception - specifications. - -Thu Jan 23 18:18:54 1997 Mike Stump - - * call.c (build_new_method_call): Don't display the invisible - argument for controlling virtual bases. - -Thu Jan 23 16:48:10 1997 Mike Stump - - * new: Add nothrow new and delete, bad_alloc and throw specifications - for delete. - * decl.c (init_decl_processing): Add throw specification for delete. - * new.cc (nothrow): Define. - * lex.c (real_yylex): Removing warning that throw and friends are - keywords. - * new1.cc (operator new (size_t sz, const nothrow_t&)): Define. - * new2.cc (operator new[] (size_t sz, const nothrow_t&): Define. - * Make-lang.in: Add new{1,2}.{cc,o}. - -Thu Jan 23 16:39:06 1997 Jason Merrill - - * lex.c (cons_up_default_function): Fix return type of synth op=. - - * init.c (emit_base_init): Add warnings for uninitialized members - and bases. - - * decl.c (xref_basetypes): Add warning for non-polymorphic type - with destructor used as base type. - - * decl.c (grok_op_properties): Add warning for op= returning void. - * typeck.c (c_expand_return): Add warning for op= returning anything - other than *this. - - * class.c (finish_struct_1): Add warning for class with pointers - but not copy ctor or copy op=. - - * cp-tree.h (TI_PENDING_TEMPLATE_FLAG): New macro. - * pt.c (add_pending_template): Use it instead of LANG_FLAG_0. - (instantiate_template): If -fexternal-templates, add this - instantiation to pending_templates. - - * decl2.c (copy_assignment_arg_p): Disable old hack to support - Booch components. - -Tue Jan 21 18:32:04 1997 Mike Stump - - * cvt.c (cp_convert): Pedwarn enum to pointer conversions. - -Mon Jan 20 17:59:51 1997 Jason Merrill - - * call.c (standard_conversion): Handle getting references. Tack - on RVALUE_CONV here. Do it for non-class types, too. - (reference_binding): Pass references to standard_conversion. - (implicit_conversion): Likewise. - (add_builtin_candidate): Disable one ?: kludge. - (convert_like): Handle RVALUE_CONVs for non-class types. - (joust): Disable the other ?: kludge. - -Mon Jan 20 14:53:13 1997 Brendan Kehoe - - * decl.c (init_decl_processing): Add code to build up common - function types beforehand, to avoid creation then removal of - things already in the hash table. - -Mon Jan 20 14:43:49 1997 Jason Merrill - - * decl.c (finish_function): Also zero out DECL_INCOMING_RTL for - the arguments. - - * error.c (dump_expr, TEMPLATE_CONST_PARM): Don't require - current_template_parms. - -Fri Jan 17 10:25:42 1997 Jason Merrill - - * search.c (lookup_field): Don't return a function, check want_type. - -Thu Jan 16 18:14:35 1997 Brendan Kehoe - - * init.c (build_new): Make sure PLACEMENT has a type. - -Thu Jan 16 17:40:28 1997 Jason Merrill - - * init.c (build_new): Support new (nothrow). - -Wed Jan 15 12:38:14 1997 Jason Merrill - - * pt.c (instantiate_decl): Also do push_to_top_level before setting - up DECL_INITIAL. - - * cp-tree.h (PARM_DEFAULT_FROM_TEMPLATE): New macro. - * pt.c (tsubst): Defer instantiation of default args. - * call.c (build_over_call): Until here. - -Wed Jan 15 10:08:10 1997 Brendan Kehoe - - * search.c (lookup_field): Make sure we have an - IDENTIFIER_CLASS_VALUE before we try to return it. - -Thu Jan 9 07:19:01 1997 Brendan Kehoe - - * call.c (build_method_call): Delete unused var PARM. - (build_overload_call_real): Likewise. - (build_object_call): Delete unused var P. - (build_new_op): Likewise. - * decl.c (builtin_type_tdescs_{arr, len, max}): #if 0 out static - var definitions, which are never used. - (shadow_tag): Delete unused var FN. - * expr.c (cplus_expand_expr): Delete unused var ORIGINAL_TARGET. - * init.c (build_new): Delete unused var ALLOC_TEMP. - * method.c (hack_identifier): Delete unused var CONTEXT. - (do_build_copy_constructor): Delete unused var NAME. - (synthesize_method): Delete unused var BASE. - * pt.c (lookup_template_class): Delete unused var CODE_TYPE_NODE. - * rtti.c (build_headof): Delete unused var VPTR. - (get_typeid): Delete unused var T. - * typeck.c (build_conditional_expr): Delete unused vars ORIG_OP1 - and ORIG_OP2. - (build_ptrmemfunc): Delete unused vars U and NINDEX. - * typeck2.c (build_functional_cast): Delete unused var BINFO. - -Wed Jan 8 13:09:54 1997 Jason Merrill - - * search.c (lookup_field): Use IDENTIFIER_CLASS_VALUE to look up - things in a type being defined. - * decl.c (finish_enum): Reverse the values so that they are in - the correct order. - - * pt.c (instantiate_class_template): Don't initialize - BINFO_BASETYPES until the vector is filled out. - (unify): Don't abort on conflicting bindings, just fail. - (instantiate_decl): Do push_tinst_level before any tsubsting. - - * method.c (build_overload_value): Handle getting a - TEMPLATE_CONST_PARM for a pointer. - -Tue Jan 7 14:00:58 1997 Jason Merrill - - * init.c (expand_member_init): Don't give 'not a base' error for - templates. - - * pt.c (instantiate_decl): Call import_export_decl later. - - * pt.c (instantiate_class_template): Return a value. - - * parse.y (extension): New rule for __extension__. - (extdef, unary_expr, decl, component_decl): Use it. - -Tue Jan 7 09:20:28 1997 Mike Stump - - * class.c (base_binfo): Remove unused base_has_virtual member. - (finish_base_struct): Likewise. - (finish_struct_1): Likewise. - -Tue Dec 31 20:25:50 1996 Mike Stump - - * search.c (expand_upcast_fixups): Fix bogus code generation - problem where the generated code uses the wrong index into the - runtime built vtable on the stack. Old code could clobber random - stack values. - -Tue Dec 31 15:16:56 1996 Mike Stump - - * init.c (perform_member_init): Make sure the partial EH cleanups - live on the function_obstack. - -Fri Dec 27 10:31:40 1996 Paul Eggert - - * Make-lang.in (g++spec.o): Don't use $< with an explicit target; - this isn't portable to some versions of `make' (e.g. Solaris 2.5.1). - -Tue Dec 24 10:24:03 1996 Jeffrey A Law (law@cygnus.com) - - * decl.c (grokvardecl): Avoid ANSI style initialization. - -Sun Dec 22 04:22:06 1996 Jason Merrill - - * pt.c (tsubst): Tweak arg types for a FUNCTION_TYPE. - -Fri Dec 20 17:09:25 1996 Jason Merrill - - * pt.c (instantiate_class_template): Call grok_{ctor,op}_properties. - -Fri Dec 20 12:17:12 1996 Brendan Kehoe - - * g++spec.c (lang_specific_driver): Put missing hyphen in front of - arguments we compare against. Start the count of I at 1, not 0, - since argv[0] is still the command. - -Thu Dec 19 11:53:57 1996 Stan Shebs - - * lang-specs.h: Accept .cp as an C++ extension. - -Mon Dec 16 22:43:31 1996 Brendan Kehoe - - * cp-tree.h (ptr_reasonably_similar): Add decl. - -Thu Dec 12 15:00:35 1996 Brendan Kehoe - - * decl.c (grokvardecl): Change SPECBITS parm to be the SPECBITS_IN - pointer. New local SPECBITS with the parm's value. - (grokdeclarator): Pass &specbits down. - - * parse.y (expr_no_commas): Make sure $$ is not an error_mark_node - before we try to do C_SET_EXP_ORIGINAL_CODE on it. - - * search.c (envelope_add_decl): Check that the CLASSTYPE_CID of - CONTEXT is not 0 before we try to use TYPE_DERIVES_FROM. - - * decl.c (cplus_expand_expr_stmt): Only expand the expr if EXP is - not an error_mark_node. - -Sat Dec 7 17:20:22 1996 Jason Merrill - - * cp-tree.h (TYPE_MAIN_DECL): Use TYPE_STUB_DECL. - * *.c: Use TYPE_MAIN_DECL instead of TYPE_NAME where appropriate. - -Fri Dec 6 14:40:09 1996 Jason Merrill - - * decl.c (grokdeclarator): When giving an anonymous struct a name, - replace TYPE_NAME instead of TYPE_IDENTIFIER (so TYPE_STUB_DECL is - not affected). - - * typeck2.c (build_m_component_ref): If component is a pointer - to data member, resolve the OFFSET_REF now. - - * call.c (convert_like): Don't go into infinite recursion. - - * pt.c (coerce_template_parms): Use tsubst_expr for non-type args. - - * class.c (finish_struct_1): Set DECL_ARTIFICIAL on the vptr. - * tree.c (layout_basetypes): And on the vbase ptr. - -Thu Dec 5 02:11:28 1996 Jason Merrill - - * decl.c (BOOL_TYPE_SIZE): Define in terms of POINTER_SIZE or - CHAR_TYPE_SIZE so bool is always the same size as another type. - - * decl.c (pushtag): Set DECL_IGNORED_P for DWARF, too. - -Tue Dec 3 23:18:37 1996 Jason Merrill - - * decl2.c (grok_x_components): Remove synthesized methods from - TYPE_METHODS of an anonymous union, complain about member - functions. - * decl.c (shadow_tag): Wipe out memory of synthesized methods in - anonymous unions. - (finish_function): Just clear the DECL_RTL of our arguments. - -Fri Nov 29 21:54:17 1996 Jason Merrill - - * decl2.c (finish_file): Emit DWARF debugging info for static data - members. - - * pt.c (tsubst): If t is a stub decl, return the stub decl for type. - -Wed Nov 27 14:47:15 1996 Bob Manson - - * typeck.c (build_component_ref): Don't die if COMPONENT isn't a - IDENTIFIER_NODE. - -Wed Nov 27 16:05:19 1996 Michael Meissner - - * Make-lang.in (g++-cross$(exeext)): Fix typo. - -Wed Nov 27 08:14:00 1996 Brendan Kehoe - - Make the g++ driver now be a standalone program, rather than one - that tries to run the gcc driver after munging up the options. - * Make-lang.in (g++.c, g++spec.o): New rules. - (g++.o): New rule, based on gcc.o with -DLANG_SPECIFIC_DRIVER - added. - (g++$(exeext)): New rule, based on xgcc rule. - (g++-cross$(exeext)): Now just copies g++$(exeext) over. - * g++spec.c: New file. - * g++.c: Removed file. - -Tue Nov 26 19:01:09 1996 Mike Stump - - * cvt.c (build_up_reference): Arrange for any temporary values - that have been keep in registers until now to be put into memory. - -Mon Nov 25 15:16:41 1996 Kaveh R. Ghazi - - * Make-lang.in (c++.stage[1234]): Depend upon stage[1-4]-start, so - that make -j3 bootstrap works better. - -Sun Nov 24 02:09:39 1996 Jason Merrill - - * decl.c (pushtag): Do pushdecl for anon tags. - -Thu Nov 21 16:30:24 1996 Jason Merrill - - * typeck.c (c_expand_return): Fix logic. - (unary_complex_lvalue): Avoid unused warning on address of INIT_EXPR. - -Wed Nov 20 18:47:31 1996 Bob Manson - - * g++.c (main): Make sure arglist has a final NULL entry. Add - PEXECUTE_LAST to the flags passed to pexecute, as otherwise - stdin/stdout of the invoked program are redirected to - nowheresville. - -Tue Nov 19 16:12:44 1996 Jason Merrill - - * decl.c (implicitly_declare): Set DECL_ARTIFICIAL. - -Tue Nov 19 15:48:19 1996 Mike Stump - - * init.c (resolve_offset_ref): Handle obj.vfn better. - * typeck.c (build_component_ref): Set TREE_TYPE on result from - build_vfn_ref. - -Tue Nov 19 13:14:33 1996 Mike Stump - - * typeck.c (convert_for_assignment): Also handle anachronistic - implicit conversions from (::*)() to cv void*. - * cvt.c (cp_convert_to_pointer): Likewise. - -Mon Nov 18 17:05:26 1996 Jason Merrill - - * lex.c (handle_cp_pragma): Fix bogus warning. - -Mon Nov 18 16:10:43 1996 Mike Stump - - * cvt.c (cp_convert_to_pointer): Avoid thinking a POINTER_TYPE - (METHOD_TYPE) is a TYPE_PTRMEMFUNC_P. - -Thu Nov 14 23:18:17 1996 Jason Merrill - - * class.c (finish_struct_1): Support DWARF2_DEBUG. - * search.c (dfs_debug_mark): Likewise. - * decl2.c (finish_vtable_vardecl): Likewise. - * decl.c (pushtag, finish_enum): Likewise. - * lex.c (check_newline): Use debug_* instead of calling *out - functions directly. - -Thu Nov 14 15:21:46 1996 Brendan Kehoe - - * Make-lang.in (cplib2.ready): Add else clause to avoid problems - on some picky hosts. - -Wed Nov 13 12:32:07 1996 Jason Merrill - - * class.c (finish_struct_1): A class has a non-trivial copy - constructor if it has virtual functions. - - * cvt.c (cp_convert): Always call a constructor. - - * call.c (reference_binding): Still tack on a REF_BIND - for bad conversions. - (build_user_type_conversion_1): Propagate ICS_BAD_FLAG. - - * typeck.c (convert_arguments): Pass LOOKUP_ONLYCONVERTING. - (c_expand_return): Likewise. - * typeck2.c (digest_init): Likewise for { }. - * init.c (expand_aggr_init_1): Keep the CONSTRUCTOR handling. - * cvt.c (cp_convert): Handle failure better. - -Wed Nov 13 11:51:20 1996 Brendan Kehoe - - * g++.c (main): Also set PEXECUTE_SEARCH, to make the invocation - of GCC be path-relative. - -Wed Nov 13 11:27:16 1996 Michael Meissner - - * Make-lang.in (g++-cross): G++-cross doesn't need version.o, but - it does need choose-temp.o and pexecute.o. - -Wed Nov 13 07:53:38 1996 Brendan Kehoe - - * g++.c (error) [!HAVE_VPRINTF]: Put error back for the only time - that we still use it. - (P_tmpdir, R_OK, W_OK, X_OK) [__MSDOS__]: Delete unnecessary macros. - -Wed Nov 13 02:00:26 1996 Jason Merrill - - * init.c (expand_default_init): Avoid calling constructors to - initialize reference temps. - - * cvt.c (convert_to_reference): Fix. - -Tue Nov 12 19:10:07 1996 Jason Merrill - - * cvt.c (cp_convert): Simplify for flag_ansi_overloading. - (convert_to_reference): Likewise. - * typeck.c (convert_for_initialization): Likewise. - * init.c (expand_default_init): Likewise. - (expand_aggr_init_1): Likewise. - * cp-tree.h (CONV_NONCONVERTING): Lose. - * typeck.c (build_c_cast): Lose allow_nonconverting parm. - * *.c: Adjust. - * call.c (build_user_type_conversion_1): Assume LOOKUP_ONLYCONVERTING. - -Tue Nov 12 16:29:04 1996 Brendan Kehoe - - * pt.c (tsubst_expr): Reverse args to expand_start_catch_block. - -Tue Nov 12 15:26:17 1996 Jason Merrill - - * init.c (expand_aggr_init_1): Don't crash on non-constructor - TARGET_EXPR. - -Tue Nov 12 14:00:50 1996 Brendan Kehoe - - * g++.c: Include gansidecl.h. - (VPROTO, PVPROTO, VA_START): Delete. - (choose_temp_base_try, choose_temp_base, perror_exec, - run_dos) [__MSDOS__]: Delete fns. - (pfatal_with_name): Delete fn. - (temp_filename): Declare like in gcc.c. - (pexecute, pwait, choose_temp_base): Declare from gcc.c. - (error_count, signal_count): Define. - (error): Delete both definitions. - (PEXECUTE_{FIRST,LAST,SEARCH,VERBOSE}): Define from gcc.c. - (pfatal_pexecute): Add fn from gcc.c. - (main): Rename local VERBOSE var to VERBOSE_FLAG. Rewrite the - code to use the pexecute stuff also used by gcc.c. - (MIN_FATAL_STATUS): Define. - * Make-lang.in (g++): Add dependency on and linking with - choose-temp.o and pexecute.o. - - * cp-tree.h: Include gansidecl.h. - (STDIO_PROTO): Delete #undef/#define. - * cvt.c (NULL): Delete #undef/#define. - * expr.c (NULL): Likewise. - * init.c (NULL): Likewise. - * rtti.c (NULL): Likewise. - * xref.c (NULL): Likewise. - - * cp-tree.h (build_user_type_conversion): Add prototype. - * call.c (build_user_type_conversion): Delete prototype. Correct - decl of FLAGS arg to be an int. - * cvt.c (build_user_type_conversion): Likewise. - -Tue Nov 12 12:16:20 1996 Jason Merrill - - * cp-tree.def: Add TRY_BLOCK and HANDLER. - * except.c (expand_start_catch_block): Support templates. - * parse.y (try_block, handler_seq): Likewise. - * pt.c (tsubst_expr): Support TRY_BLOCK and HANDLER. - -Mon Nov 11 13:57:31 1996 Jason Merrill - - * pt.c (current_template_args): New fn. - (push_template_decl): Use it. - * decl.c (grokdeclarator): Use it. - - * decl2.c (build_expr_from_tree): Dereference ref vars. - - * decl.c (grokdeclarator): Generalize handling of TYPENAME_TYPEs in - the decl-specifier-seq. - - * decl.c (grok_op_properties): Don't force the type of a conversion - op to be complete. Don't warn about converting to the same type - for template instantiations. - - * decl2.c (finish_file): Don't call instantiate_decl on synthesized - methods. - -Mon Nov 11 13:20:34 1996 Bob Manson - - * typeck.c (get_delta_difference): Remove previous bogusness. - Don't give errors if force is set. - -Fri Nov 8 17:38:44 1996 Jason Merrill - - * decl2.c (finish_file): Don't emit debug info. - * decl.c (pushdecl): Lose obsolete code. - (grokdeclarator): Still do the long long thing after complaining. - * search.c (note_debug_info_needed): Don't do anything if we're in a - template. - * method.c (synthesize_method): For non-local classes, - push_to_top_level first. - -Fri Nov 8 11:52:28 1996 Bob Manson - - * typeck.c (get_delta_difference): Add no_error parameter. - (build_ptrmemfunc): Call get_delta_difference with no_error set; - we don't want error messages when converting unrelated - pointer-to-member functions. - -Thu Nov 7 11:16:24 1996 Mike Stump - - * error.c (dump_expr): Improve the wording on error messages that - involve pointer to member functions. - -Tue Nov 5 17:12:05 1996 Mike Stump - - * cvt.c (cp_convert_to_pointer): Move code for conversions from - (::*)() to void* or (*)() up a bit, so that we can convert from - METHOD_TYPEs as well. - -Tue Nov 5 14:54:17 1996 Jason Merrill - - * rtti.c (get_tinfo_fn): Make sure 'type' is permanent. - There are no 'member' types. - (get_tinfo_fn_dynamic): Diagnose typeid of overloaded fn. - (build_x_typeid): Handle errors. - -Mon Nov 4 17:43:12 1996 Mike Stump - - * typeck.c (convert_for_assignment): Handle anachronistic implicit - conversions from (::*)() to void* or (*)(). - * cvt.c (cp_convert_to_pointer): Likewise. - (cp_convert_to_pointer_force): Remove cp_convert_to_pointer - conversions from here. - * decl2.c (lang_decode_option): Add -W{no-,}pmf-conversions. - * lang-options.h: Likewise. - * decl2.c (warn_pmf2ptr): Define. - * cp-tree.h: Declare it. - * typeck2.c (digest_init): Allow pmfs down into - convert_for_initialization. - -Sun Nov 3 09:43:00 1996 Jason Merrill - - * typeck.c (c_expand_return): Fix for returning overloaded fn. - -Fri Nov 1 08:53:17 1996 Jason Merrill - - * cp-tree.h (DIRECT_BIND): Change from INDIRECT_BIND. - * decl.c (grok_reference_init): Pass DIRECT_BIND. - * cvt.c (build_up_reference): Don't mark 'this' addressable. Use - DIRECT_BIND. - * call.c (convert_like): Don't pass INDIRECT_BIND. - * typeck.c (convert_arguments): Likewise. - * typeck.c (mark_addressable): Allow &this if flag_this_is_variable. - -Thu Oct 31 17:08:49 1996 Jason Merrill - - * typeck.c (mark_addressable): Support TARGET_EXPR, unify with - similar code in build_up_ref. - * cvt.c (build_up_reference): Drastically simplify. - -Mon Oct 28 12:45:05 1996 Jeffrey A Law (law@cygnus.com) - - * typeck.c (signed_or_unsigned_type): If the given type already - as the correct signedness, then just return it. - - * typeck.c ({un,}signed_type): If can't do anything, call - signed_or_unsigned_type. - -Thu Oct 24 14:21:59 1996 Bob Manson - - * decl2.c (copy_assignment_arg_p): Don't buy the farm if - current_class_type is NULL. - -Wed Oct 23 00:43:10 1996 Jason Merrill - - * class.c (finish_struct_1): Avoid empty structs by adding a field - so layout_type gets the mode right. - - * typeck.c (c_expand_return): Drastically simplify. - -Mon Oct 21 22:34:02 1996 Jason Merrill - - * typeck.c (decay_conversion): Handle overloaded methods. - -Fri Oct 18 16:03:48 1996 Jason Merrill - - * call.c (build_over_call): A TARGET_EXPR has side-effects. - -Thu Oct 17 11:31:59 1996 Mike Stump - - * cvt.c (convert_to_pointer_force): Add code to support pointer to - member function to pointer to function conversions. - * init.c (resolve_offset_ref): Add code to allow faked up objects, - ignoring them if they are not used, and giving an error, if they - are needed. - * typeck.c (get_member_function_from_ptrfunc): Fold e1 to improve - code, and so that we can give an error, if we needed an object, - and one was not provided. - (build_c_cast): Don't call default_conversion when we want to - convert to pointer to function from a METHOD_TYPE. - -Mon Oct 14 00:28:51 1996 Jason Merrill - - * Make-lang.in (cplib2.ready): Fix logic. - - * decl.c (shadow_tag): Only complain about non-artificial function - members. - - * class.c (finish_struct_1): Add synthesized methods to TYPE_METHODS. - -Fri Oct 11 16:12:40 1996 Jason Merrill - - * expr.c (cplus_expand_expr): Pre-tweak call_target like - expand_inline_function would. - - * pt.c (mark_decl_instantiated): If extern_p, call - mark_inline_for_output. - -Thu Oct 10 15:58:08 1996 Mike Stump - - * typeck.c (unary_complex_lvalue): Add code to handle intermediate - pmd conversions. - - * typeck.c (get_delta_difference): Fix wording, as we can be used - for pointer to data members. - -Tue Oct 8 12:43:51 1996 Bob Manson - - * pt.c (tsubst): If the function decl isn't a member of this - template, return a copy of the decl (including copying the - lang-specific part) so we don't hose ourselves later. - -Thu Oct 3 16:24:28 1996 Jason Merrill - - * class.c (finish_struct): Remove DWARF-specific tag handling. - * decl.c (pushtag): Likewise. - (finish_function): Always clear DECL_ARGUMENTS on function decls with - no saved RTX. - * decl2.c (finish_file): Emit DWARF debugging info for static data - members. - -Wed Oct 2 21:58:01 1996 Bob Manson - - * decl.c (duplicate_decls): Make sure the old DECL_LANG_SPECIFIC - isn't the same as the new one before we whack it. - -Mon Sep 30 13:38:24 1996 Jason Merrill - - * class.c, cp-tree.h, cvt.c, decl.c, decl2.c, gxx.gperf, hash.h, - lex.c, method.c, parse.y, typeck.c, typeck2.c: Remove - warn_traditional and warn_strict_prototypes; remove ancient - 'overload' code; remove references to flag_traditional. - -Mon Sep 30 12:58:40 1996 Mike Stump - - * input.c (sub_getch): Handle 8-bit characters in string literals. - -Sun Sep 29 03:12:01 1996 Jason Merrill - - * tree.c (mapcar): Handle CONSTRUCTORs. - (copy_to_permanent): Handle expression_obstack properly. - - * Make-lang.in (cplib2.txt): Also depend on the headers. - - * rtti.c (get_tinfo_var): Don't assume that POINTER_SIZE == - INT_TYPE_SIZE. - (expand_class_desc): Use USItype for offset field. - * tinfo.h (struct __class_type_info): Likewise. - - * method.c (build_overload_int): TYPE_PRECISION should be applied - to types. - -Sat Sep 28 14:44:50 1996 Jason Merrill - - * call.c (build_new_op): A COND_EXPR involving void must be a - builtin. - -Fri Sep 27 16:40:30 1996 Jason Merrill - - * typeck.c (build_x_component_ref): New fn. - (build_object_ref): Use it. - * parse.y (primary): Use it. - * decl2.c (build_expr_from_tree): Use it. - * cp-tree.h: Declare it. - - * decl.c (start_decl): variable-sized arrays cannot be initialized. - * error.c (dump_type_suffix): Handle variable arrays. - -Fri Sep 27 13:14:05 1996 Brendan Kehoe - - * Make-lang.in (exception.o): Put back compiling it with -fPIC. - -Fri Sep 27 03:00:09 1996 Jason Merrill - - * decl.c (lookup_name_real): Don't try to look up anything in a - TYPENAME_TYPE. - - * tinfo2.cc (__throw_type_match_rtti): Oops. - -Thu Sep 26 22:11:05 1996 Brendan Kehoe - - * Make-lang.in (exception.o): Use -fno-PIC for now. - -Thu Sep 26 10:59:00 1996 Jason Merrill - - * rtti.c (build_dynamic_cast): Pass tinfo fns rather than - calling them. - (get_tinfo_fn_dynamic): Extracted from build_typeid. - * tinfo2.cc (__dynamic_cast): Adjust. - - * rtti.c (build_typeid): Use resolves_to_fixed_type_p. - (build_x_typeid): Likewise. - - * parse.y: Call build_x_typeid instead of build_typeid. - * cp-tree.def: Add TYPEID_EXPR. - * pt.c (tsubst_copy): Handle typeid. - * decl2.c (build_expr_from_tree): Likewise. - * rtti.c (build_x_typeid): Throw bad_typeid from here. - (build_typeid): Not here. - * cp-tree.h: Declare build_x_typeid. - -Wed Sep 25 17:26:16 1996 Jason Merrill - - * call.c (convert_like): Pull out constant values. - - * tree.c (mapcar): Use build_cplus_array_type, not build_array_type. - -Wed Sep 25 17:28:53 1996 Michael Meissner - - * decl.c (init_decl_processing): Create short int types before - creating size_t in case a machine description needs to use - unsigned short for size_t. - -Tue Sep 24 18:18:44 1996 Jason Merrill - - * Make-lang.in (exception.o): Turn off pic. - - * tinfo2.cc (__throw_type_match_rtti): Fix cv-variants of the same - type, multi-level ptr conversions. - - * rtti.c (call_void_fn): Renamed and genericized from throw_bad_cast. - (throw_bad_cast): Use it. - (throw_bad_typeid): New fn. - (build_typeid): Throw bad_typeid as needed. - Use build_call. - (synthesize_tinfo_fn): Handle functions and arrays before checking - for cv-quals. - - * Remove .h from standard C++ headers, add new.h, move into inc - subdirectory. - - * exception*: Remove pointer from object, constructors. Add - default exception::what that uses type_info::name. Add - __throw_bad_typeid. - - * init.c (build_new): Don't add a cookie to new (void *) T[2]. - -Mon Sep 23 15:21:53 1996 Jason Merrill - - * Make-lang.in: Building C++ code depends on cc1plus. - -Mon Sep 23 12:38:40 1996 Brendan Kehoe - - * decl.c (struct saved_scope): Declare PROCESSING_TEMPLATE_DECL as - a HOST_WIDE_INT, not a tree. - -Mon Sep 23 12:36:02 1996 Jason Merrill - - * exception.cc: Don't include . - - * Make-lang.in (c++.clean): Remove cplib2.*. - -Mon Sep 23 09:42:19 1996 Doug Evans - - * parse.y (component_decl_1, component_costructor_declarator case): - Pass attributes/prefix_attributes in tree list. - -Mon Sep 23 01:18:50 1996 Jason Merrill - - * tinfo{,2}.cc: #include instead of . - -Sun Sep 22 05:31:22 1996 Jason Merrill - - * lex.c (do_identifier): Don't do deferred lookup in a template - header. - - * typeck2.c (store_init_value): Oops. - - * new.{h,cc}, exception.{h,cc}, typeinfo.h, tinfo{2.cc,.cc,.h}: - New files for C++ lang-support library. - * Make-lang.in (CXX_EXTRA_HEADERS): Define. - (CXX_LIB2FUNCS): Define. - And rules for building the C++ lang-support code. - * config-lang.in (headers): Define. - (lib2funcs): Define. - -Sat Sep 21 19:17:28 1996 Jason Merrill - - * decl2.c (build_expr_from_tree): If CONSTRUCTOR has a type, call - digest_init. - * pt.c (tsubst_copy): Compute type for CONSTRUCTOR. - * typeck2.c (store_init_value): Check for initializing pmf with { } - here. - (process_init_constructor): Not here. - -Thu Sep 19 16:41:07 1996 Jason Merrill - - * pt.c (begin_template_parm_list): Increment - processing_template_decl here. - (end_template_parm_list): Not here. - (process_template_parm): No need to add 1 to it now. - * *.c: Use processing_template_decl instead of current_template_parms - to check for being in a template. - - * pt.c (uses_template_parms): Handle SCOPE_REF. Fix CONSTRUCTOR. - (tsubst_copy): Handle CONSTRUCTOR. - (instantiate_decl): Set up context properly for variables. - * decl2.c (build_expr_from_tree): Handle CONSTRUCTOR. - * class.c (finish_struct): Reverse CLASSTYPE_TAGS. - -Wed Sep 18 13:30:20 1996 Brendan Kehoe - - * lex.c (enum tree_node_kind) [GATHER_STATISTICS]: Put the enum back. - -Wed Sep 18 04:24:07 1996 Jason Merrill - - * method.c (make_thunk): Call comdat_linkage before setting the - TREE_CODE. - - * decl2.c (comdat_linkage): Use make_decl_one_only. - (import_export_decl): Likewise. - * decl.c (init_decl_processing): Check supports_one_only instead of - SUPPORTS_WEAK. - -Sat Sep 14 08:34:41 1996 Jason Merrill - - * decl2.c (grokfield): Tighten checking for access decls. - - * decl.c (make_typename_type): Resolve references to - current_class_type. Set CLASSTYPE_GOT_SEMICOLON. - (lookup_name_real): Types that depend on a template parameter get - an implicit 'typename' unless they're in the current scope. - (start_decl_1): We don't care about incomplete types that depend - on a template parm. - (grokdeclarator): Resolve 'typename's in the type specifier that - refer to members of the current scope. - - * call.c (build_over_call): Remove 'inline called before - definition' diagnostic. - (build_method_call): Likewise. - * decl.c (duplicate_decls): Downgrade 'used before declared - inline' to a warning, only with -Winline. - -Fri Sep 13 17:31:40 1996 Stan Shebs - - * mpw-make.sed: Fix include paths, add @DASH_C_FLAG@ to compile. - -Wed Sep 11 22:38:13 1996 Gerald Baumgartner - - * call.c (build_method_call): When calling a signature - default implementation, as in other cases, let instance_ptr simply - be instance. - -Wed Sep 11 22:14:44 1996 Mike Stump - - * parse.y (simple_stmt): Cleanup and use do_poplevel (). - -Wed Sep 11 22:10:48 1996 Mike Stump - - * except.c (expand_start_catch_block): Add a pushlevel so that -g - works on hppa and SPARC. - -Wed Sep 11 10:18:06 1996 Brendan Kehoe - - * typeck.c (build_indirect_ref): Catch PTR being an error_mark_node. - -Mon Sep 9 19:51:14 1996 Gerald Baumgartner - - * call.c (build_over_call): Check first whether DECL_CONTEXT exists - before testing whether it's a signature. - -Sun Sep 8 16:06:57 1996 Gerald Baumgartner - - * call.c (build_new_method_call): Don't complain about signature - pointers and references not being an aggr type. - (build_this): If a signature pointer or reference was passed in, - just return it. - (build_new_method_call): If instance is a signature pointer, set - basetype to the signature type of instance. - * sig.c (build_signature_method_call): Deleted basetype and - instance parameters, they can be found as the DECL_CONTEXT of - function and as the first argument passed in. - * cp-tree.h: Changed declaration of build_signature_method_call. - * call.c (build_method_call): Deleted first two arguments in call - of build_signature_method_call. - (build_over_call): Added call to build_signature_method_call. - -Thu Sep 5 16:51:28 1996 Jason Merrill - - * typeck.c (build_c_cast): Don't tack a non_lvalue_expr onto a - target_expr. - -Thu Sep 5 10:05:38 1996 Brendan Kehoe - - * cvt.c (convert_to_reference): Use %#T, not %#D, for error. - -Wed Sep 4 17:16:09 1996 Bob Manson - - * except.c (expand_start_try_stmts): Move to except.c in the backend. - (expand_end_try_stmts): Remove. - - * init.c (perform_member_init): Use add_partial_entry () instead - of directly manipulating lists. - (emit_base_init): Ditto. - -Wed Sep 4 12:14:36 1996 Mike Stump - - * except.c (expand_exception_blocks): Always make sure USE and - CLOBBER insns that came at the end still do, the backend relies - upon this. - -Wed Sep 4 07:44:48 1996 Jason Merrill - - * call.c (build_over_call): We can only use a TARGET_EXPR of the - right type. - -Tue Sep 3 19:26:05 1996 Jason Merrill - - * cvt.c (convert_to_reference): Revert last change, don't complain - about temp without target decl. - -Tue Sep 3 10:22:56 1996 Mike Stump - - * decl.c (grokdeclarator): Don't core dump when void() is given. - -Tue Sep 3 02:38:56 1996 Jason Merrill - - * decl.c (copy_args_p): Don't crash. - -Fri Aug 30 14:26:57 1996 Mike Stump - - * pt.c (tsubst): And support template args inside the exception - specification. - - * pt.c (tsubst): Add support for exception specifications in - template functions. - -Fri Aug 30 10:01:55 1996 Mike Stump - - * cp-tree.def (DECL_STMT): Eliminate the throw spec field, only 3 - fields now. - * cp-tree.h (start_decl): Eliminate the throw spec parameter. - (start_function): Likewise. - (start_method): Likewise. - (grokfield): Likewise. - (make_call_declarator): Add throw spec parameter. - (set_quals_and_spec): Add routine. - * lex.c (set_quals_and_spec): Likewise. - * decl.h (grokdeclarator): Eliminate the throw spec parameter. - * decl.c (shadow_tag): Eliminate the throw spec parameter to - grokdeclarator. - (groktypename): Likewise. - (start_decl): Eliminate the throw spec parameter. Eliminate the - throw spec parameter to grokdeclarator. Eliminate the throw spec - field in DECL_STMT. - (cp_finish_decl): Eliminate the throw spec field in DECL_STMT. - (grokfndecl): Remove useless set of raises. - (grokdeclarator): Eliminate the throw spec parameter. Eliminate - the throw spec parameter to start_decl. Pull the throw spec out - of the call declarator. - (grokparms): Eliminate the throw spec parameter to grokdeclarator. - (start_function): Eliminate the throw spec parameter. Eliminate - the throw spec parameter to grokdeclarator. - (start_method): Likewise. - * decl2.c (grokfield): Likewise. - (grokbitfield): Eliminate the throw spec parameter to grokdeclarator. - (grokoptypename): Likewise. - (finish_file): Eliminate the throw spec parameter to - start_function. Add throw spec to make_call_declarator. - * except.c (init_exception_processing): Add throw spec to - make_call_declarator. Eliminate the throw spec parameter to - start_decl. - (expand_start_catch_block): Eliminate the throw spec parameter to - grokdeclarator. - (expand_builtin_throw): Add throw spec to make_call_declarator. - Eliminate the throw spec parameter to start_function. - (start_anon_func): Likewise. - * lex.c (make_call_declarator): Add throw spec parameter. - (set_quals_and_spec): New routine. - (cons_up_default_function): Add throw spec to make_call_declarator. - Eliminate the throw spec parameter to grokfield. - * method.c (synthesize_method): Eliminate the throw spec parameter - to start_function. - * pt.c (process_template_parm): Eliminate the throw spec parameter - to grokdeclarator. - (tsubst): Add throw spec to make_call_declarator. - (tsubst_expr): Eliminate the throw spec parameter to start_decl. - (do_function_instantiation): Eliminate the throw spec parameter to - grokdeclarator. Eliminate the throw spec parameter to - start_function. - * rtti.c (synthesize_tinfo_fn): Eliminate the throw spec parameter - to start_function. - * parse.y (datadef): Remove non-winning optimization. - (decl): Likewise. - (fndef): Remove ambiguous error productions uncovered by grammer - fixing. - (constructor_declarator): Add exception_specification_opt here. - (component_constructor_declarator): Likewise. - (direct_after_type_declarator): Likewise. - (complex_direct_notype_declarator): Likewise. - (direct_abstract_declarator): Likewise. - (fn.def1): Remove exception_specification_opt. - (fn.def2): Likewise. - (condition): Likewise. - (initdcl0): Likewise. - (initdcl): Likewise. - (notype_initdcl0): Likewise. - (nomods_initdcl0): Likewise. - (component_decl_1): Likewise. - (component_declarator): Likewise. - (after_type_component_declarator0): Likewise. - (after_type_component_declarator): Likewise. - (notype_component_declarator): Likewise. - -Wed Aug 28 01:40:30 1996 Jason Merrill - - * call.c (build_over_call): Also use an INIT_EXPR when - initializing anything from an rvalue. - - * call.c (build_over_call): Call stabilize_reference when building - an INIT_EXPR instead of calling the copy ctor. - - * call.c (joust): Extend the previous change to all comparisons. - - * decl2.c, method.c, lex.c: Use MAKE_DECL_ONE_ONLY and - NO_LINKAGE_HEURISTICS. - - * decl2.c (finish_file): Emit any statics that weren't already. - - * typeck.c (build_static_cast): Implement. - * tree.c (build_cplus_new): Handle getting a TARGET_EXPR. - * decl.c (grokparms): Use can_convert_arg instead of - implicit_conversion directly. - (copy_args_p): New fn. - * cvt.c (convert_to_reference): Don't complain about temp with - static_cast. - (build_up_reference): Handle TARGET_EXPRs. - * call.c (build_over_call): Elide unnecessary temps. - (can_convert*): Use new overloading code. - -Tue Aug 27 13:12:21 1996 Jason Merrill - - * call.c: Move TYPE_PTR*_MACROS ... - * cp-tree.h: To here. - * typeck.c (build_reinterpret_cast): Implement. - - * call.c (add_builtin_candidate): Use TYPE_PTROB_P instead of - ptr_complete_ob. - (joust): If we're comparing a function to a builtin and the worst - conversion for the builtin is worse than the worst conversion for the - function, take the function. - - * typeck.c (build_const_cast): Implement. - (comp_ptr_ttypes_const): Like comp_ptr_ttypes, for const_cast. - (comp_ptr_ttypes_reinterpret): Like cpt, for reinterpret_cast. - -Tue Aug 27 13:14:58 1996 Bob Manson - - * rtti.c (build_dynamic_cast): Don't try to dereference exprtype - too early. Make sure we explode if exprtype turns out to be a - NULL_TREE when it shouldn't be. - -Tue Aug 27 10:56:21 1996 Mike Stump - - * cp-tree.h: New routine make_call_declarator. - * lex.c (make_call_declarator): Define it. - * except.c (init_exception_processing): Use it. - (expand_builtin_throw): Likewise. - (start_anon_func): Likewise. - * decl2.c (finish_file): Likewise. - * lex.c (cons_up_default_function): Likewise. - * parse.y: Likewise. - * pt.c (tsubst): Likewise. - -Mon Aug 26 17:40:03 1996 Mike Stump - - * decl2.c (groktypefield): Remove unused code. - -Mon Aug 26 17:00:33 1996 Mike Stump - - * gxx.gperf: Change TYPE_QUAL into CV_QUALIFIER. - * parse.y: Likewise. Change maybe_type_qual into maybe_cv_qualifier. - Change type_quals into cv_qualifiers. Change nonempty_type_quals into - nonempty_cv_qualifiers. - * hash.h: Rebuild. - - * lex.c (make_pointer_declarator): Change type_quals into - cv_qualifiers. - (make_reference_declarator): Likewise. - -Thu Aug 22 01:09:22 1996 Jason Merrill - - * decl.c (start_function): Only check interface_* for templates - with flag_alt_external_templates. - - * call.c (build_new_op): Check for comparison of different enum types. - (build_over_call): Fix arg # output. - - * typeck.c (build_component_ref): Handle pre-found TYPE_DECL. - -Wed Aug 21 00:13:15 1996 Jason Merrill - - * call.c (build_new_op): Check for erroneous args. - - * call.c (build_new_method_call): Add missing args to cp_error. - - * tree.c (error_type): Dont print reference-to-array. - - * typeck.c (convert_for_assignment): Don't say contravariance for - removing const. - -Tue Aug 20 13:23:00 1996 Jason Merrill - - * call.c (build_over_call): Diagnose bad convs for `this'. - - * lex.c (cons_up_default_function): Set DECL_ARTIFICIAL - on _ctor_arg. - - * call.c (convert_like): Handle bad convs. - (build_over_call): Handle bad convs better. - - * decl2.c: -fansi-overloading is now the default. - - * call.c (build_new_method_call): Check for erroneous args. - - * pt.c (instantiate_class_template): Propagate - TYPE_USES_MULTIPLE_INHERITANCE. - -Tue Aug 20 13:09:57 1996 Mike Stump - - * call.c (enforce_access): Add static to routine. - -Sun Aug 18 14:35:54 1996 Jason Merrill - - * call.c (build_user_type_conversion_1): Fix bad handling. - (compare_ics): Likewise. - -Sat Aug 17 21:54:11 1996 Jason Merrill - - * call.c (standard_conversion): Oops. - -Sat Aug 17 16:28:11 1996 Geoffrey Noer - - * g++.c: Update test for win32 (&& ! cygwin32). - -Sat Aug 17 03:45:31 1996 Jason Merrill - - * typeck.c (comp_ptr_ttypes_real): Handle OFFSET_TYPEs properly. - (ptr_reasonably_similar): New fn. - * call.c (BAD_RANK): New rank. - (ICS_BAD_FLAG): New macro. - (standard_conversion): Handle almost-right pointer conversions. - (reference_binding): Handle bad rvalue bindings. - (add_*_candidate): Stuff. - (build_over_call): Pass bad conversions to convert_for_initialization. - (compare_ics): Handle bad convs. - (joust): Likewise. - -Fri Aug 16 15:02:19 1996 Bob Manson - - * init.c (expand_vec_init): Use ptrdiff_type_node instead of - integer_type_node when computing pointer offsets. - -Fri Aug 16 01:28:32 1996 Jason Merrill - - * tree.c (lvalue_type): New fn. - (error_type): New fn. - * call.c (op_error): Use error_type. - (add_conv_candidate): Use lvalue_type. - (add_builtin_candidates): Likewise. - * error.c (args_as_string): Use error_type. - -Thu Aug 15 17:27:13 1996 Jason Merrill - - * pt.c (instantiate_decl): Evaluate DECL_INITIAL of a VAR_DECL here. - (tsubst): Not here. - - * decl.c (init_decl_processing): With -ansi, __null's type is the - signed integral type with the same number of bits as a pointer. - Introduce a new variable null_node for it. - * cp-tree.h: Adjust. - * call.c (null_ptr_cst_p): Adjust. - -Thu Aug 15 17:09:54 1996 Mike Stump - - * except.c (do_unwind): Mark %i7 as used on the SPARC so we can - optimize. - -Thu Aug 15 01:36:49 1996 Jason Merrill - - * decl2.c (import_export_decl): Ignore #pragma interface for tinfo - fns of classes without virtual functions. - - * call.c (add_function_candidate): Handle `this' specially. - (compare_ics): Likewise. - -Tue Aug 13 12:16:10 1996 Jason Merrill - - * typeck.c (build_conditional_expr): Fix handling of __null. - - * decl2.c (comdat_linkage): New fn. - (import_export_vtable): Use it. - (import_export_decl): Use it. - * method.c (make_thunk): Use it. - -Mon Aug 12 00:09:18 1996 Jason Merrill - - * pt.c (end_template_decl): If we don't actually have parms, return. - * parse.y (template_header): Accept 'template <>'. - - * errfn.c: Allow 5 args. - -Sun Aug 11 15:20:58 1996 Jason Merrill - - * tree.c (make_temp_vec): New fn. - * pt.c (push_template_decl): Handle partial specs. - (instantiate_class_template): Likewise. - (more_specialized): Use get_bindings. - (more_specialized_class): New fn. - (get_class_bindings): New fn. - (most_specialized_class): New fn. - (do_function_instantiation): List candidates for ambiguous case. - * decl.c (duplicate_decls): Lose reference to DECL_TEMPLATE_MEMBERS. - (shadow_tag): Call push_template_decl for partial specializations. - * parse.y: Likewise. - * cp-tree.h (DECL_TEMPLATE_SPECIALIZATIONS): Replaces - DECL_TEMPLATE_MEMBERS. - * call.c (print_z_candidates): Reduce duplication. - -Fri Aug 9 14:36:08 1996 Jason Merrill - - * decl2.c (lang_decode_option): Allow -fansi-overloading. - -Thu Aug 8 17:04:18 1996 Jason Merrill - - * pt.c (get_bindings): New fn. - (most_specialized): Likewise. - (do_function_instantiation): Use them. - (add_maybe_template): New fn. - * cp-tree.h (DECL_MAYBE_TEMPLATE): New macro. - * call.c (build_new_op): Handle guiding decls. - (build_new_function_call): Likewise. - * decl2.c (finish_file): Likewise. - - * decl2.c (mark_used): Do synthesis here. - * call.c (build_method_call): Not here. - (build_over_call): Or here. - * typeck.c (build_function_call_real): Or here. - * tree.c (bot_manip): Call mark_used on functions used in default - args. - -Thu Aug 8 17:48:16 1996 Michael Meissner - - * decl2.c (import_export_vtable): Delete code that disabled vtable - heuristic on systems with ASM_OUTPUT_EXTERNAL. - -Wed Aug 7 12:44:11 1996 Jason Merrill - - * typeck.c (build_x_function_call): Handle static call context - better. - - * decl.c (finish_function): Set the DECL_CONTEXT of the result to - the function, not its outer block. - - * call.c (build_field_call): Pass fields on to build_opfncall - regardless of TYPE_OVERLOADS_CALL_EXPR. - (build_method_call): Pass on to build_new_method_call sooner. - - * typeck.c (build_ptrmemfunc): Just return what instantiate_type - gives us. - * class.c (instantiate_type): Don't put a POINTER_TYPE to - METHOD_TYPE on an expression. Also make a copy of rhs instead of - modifying it. - -Tue Aug 6 12:58:46 1996 Jason Merrill - - * call.c (compare_ics): Handle qual_conv after lvalue_conv. - (add_builtin_candidate): Don't take enums for ++. - (build_new_method_call): Handle non-aggregates and field calls. - Move new overloading code from... - * cvt.c: Here. - - * decl.c (grokparms): Don't check default args in templates. - -Mon Aug 5 17:17:06 1996 Jason Merrill - - * cvt.c (build_new_op): Fix args to build_unary_op. - (add_builtin_candidates): Don't call type_promotes_to on float. - - * decl.c (grokparms): Check the type of the default arg. - - * cvt.c (build_new_op): Pass non-overloaded cases on rather than - returning NULL_TREE. - - * typeck.c (build_x_binary_op): Avoid doing extra work. - (build_x_unary_op): Likewise. - (build_x_conditional_expr): Likewise. - * cvt.c (build_over_call): Return. - (add_builtin_candidate): Fix MEMBER_REF. - (build_new_op): Likewise. - -Mon Aug 5 17:07:47 1996 Mike Stump - - * method.c (build_overload_name): Put bug fix into code but leave - disabled for now so we can be bug compatible with older releases - that do repeats incorrectly. In the future, we can enable it. - -Mon Aug 5 13:46:28 1996 Jason Merrill - - * cvt.c (convert_like): Don't call build_cplus_new twice. - - * call.c, cp-tree.h, cvt.c, decl2.c, init.c, method.c, pt.c, typeck.c: - Control new overloading code with -fansi-overloading. - -Sun Aug 4 15:29:11 1996 Jason Merrill - - * cvt.c (build_over_call): Call build_cplus_new. - * call.c (build_method_call): Likewise. - * typeck.c (build_function_call_real): Likewise. - (build_conditional_expr): If both operands are TARGET_EXPRs, wrap - the COND_EXPR in a TARGET_EXPR so they use the same slot. - - * cvt.c (build_up_reference): Propagate INDIRECT_BIND to - recursive calls. - * typeck.c (complete_type): Propagate - TYPE_NEEDS_{CONSTRUCTING,DESTRUCTOR}. - -Sat Aug 3 14:05:07 1996 Jason Merrill - - * cvt.c (joust): More ?: kludging. Sigh. - (build_over_call): Don't try to synthesize global fns. - - * search.c (lookup_conversions): Use binfo marking. - -Sat Aug 3 12:33:42 1996 Bob Manson - - * search.c (build_mi_matrix): Use the correct value of cid - when determining the new mi_size. - -Sat Aug 3 01:27:41 1996 Jason Merrill - - * cvt.c (add_builtin_candidates): Do consider type conversion ops - for the first parms of += et al. - (strip_top_quals): New fn. - (reference_binding): Use it instead of TYPE_MAIN_VARIANT. - (implicit_conversion): Likewise. - (add_builtin_candidates): Be careful about arrays. - (build_new_method_call): Handle vtable optimization. - -Fri Aug 2 01:26:59 1996 Jason Merrill - - * cp-tree.h (LOOKUP_NO_TEMP_BIND): New flag. - * cvt.c (reference_binding): Use it. - (implicit_conversion): Use it. - (add_builtin_candidate, COND_EXPR): Use it. - - * cvt.c (build_new_function_call): Check for error args. - - * typeck.c (comptypes): Just check DERIVED_FROM_P, not UNIQUELY. - - * gxx.gperf: Add __null. - * hash.h: Regenerate. - * lex.h: Add RID_NULL. - * lex.c (init_lex): Create null_pointer_node here, stick it in - RID_NULL. - * decl.c (init_decl_processing): Still set its type here. - * cvt.c (cp_convert_to_pointer): Don't produce null_pointer_node. - (convert_to_pointer_force): Likewise. - (null_ptr_cst_p): Check for null_pointer_node; only accept (void*)0 - if (! pedantic). - * call.c (convert_harshness): Use null_ptr_cst_p. - * typeck.c (convert_for_assignment): Likewise. Don't produce - null_pointer_node. - - * error.c (args_as_string): Handle lists of actual args, too. - * cvt.c (null_ptr_cst): Support (void*)0 for now. - (build_user_type_conversion_1): Improve diagnostics. - (build_new_function_call): Likewise. - (build_object_call): Likewise. - (build_new_method_call): Likewise. Move call before def diagnostic... - (build_over_call): Here. - - * cvt.c (build_new_method_call): Don't complain about no match if - LOOKUP_SPECULATIVELY. - (build_over_call): Fix 'this' for virtual fn. - (build_new_method_call): Add diagnostic. - -Thu Aug 1 16:45:09 1996 Jason Merrill - - * cvt.c (add_function_candidate): Expect 'this' and 'in_chrg' for - constructors to be passed in. - (build_over_call): Likewise. - (build_user_type_conversion_1): Pass them in. - (convert_like): Likewise. - (build_object_call): Handle overloaded conversions. - (build_over_call): Pass the right args to build_vfn_ref. - (standard_conversion): Fix pmf convs. - (joust): Handle comparing statics and non-statics. - (build_new_method_call): New fn. - * call.c (build_method_call): Call it if NEW_OVER. - -Thu Aug 1 16:06:14 1996 Mike Stump - - * lex.c (do_identifier): Don't use %O on IDENTIFIER_OPNAME_Ps, use - %D instead. - -Thu Aug 1 15:24:02 1996 Mike Stump - - * except.c (expand_throw): Use maybe_build_cleanup_and_delete - instead of just maybe_build_cleanup so that we deallocate the - thrown object. - -Thu Aug 1 15:18:00 1996 Brendan Kehoe - - * decl2.c (finish_prevtable_vardecl): Make non-static for pt.c's use. - * cp-tree.h (finish_prevtable_vardecl): Add decl. - -Thu Aug 1 11:53:51 1996 Bob Manson - - * pt.c (instantiate_class_template): Call complete_type. Also, if - we're at the end of the file and we just instantiated a template - class with a vtable, call finish_prevtable_vardecl. - - * error.c (dump_decl): Don't explode (or explode more gracefully - as appropriate) if the object being dumped has a null type. - (dump_expr): Likewise. - - * search.c (build_mi_matrix): Ensure that mi_size is large enough, - by counting the number of nodes that we'll need before allocating - the array. - (lookup_fnfields): Fix comment. - (breadth_first_search): Fix comment. - -Wed Jul 31 09:57:05 1996 Jason Merrill - - * pt.c (instantiate_class_template): Propagate TYPE_PACKED and - TYPE_ALIGN. - * class.c (finish_struct): Call cplus_decl_attributes here. - (finish_struct_1): Not here. - * cp-tree.h: Adjust. - - * pt.c (type_unification): New parameter STRICT. - (unify): If STRICT, don't allow cv addition or base deduction. - * call.c, class.c, cvt.c, cp-tree.h: Adjust. - -Tue Jul 30 13:06:13 1996 Jason Merrill - - * search.c (get_template_base{_recursive}): New fns. - * pt.c (more_specialized): New fn. - (do_function_instantiation): Use it. - (unify): Handle base deduction. - * cvt.c (joust): Use more_specialized. - Don't arbitrarily choose between non-builtin candidates. - (build_over_call): Call require_complete_type. - - * decl.c (start_function): Statics are static even in a #pragma - interface file. - - * decl2.c (import_export_vtable): Disable vtable heuristic on - systems with ASM_OUTPUT_EXTERNAL. - - * cvt.c (compare_ics): Fix comparison of PMEM_CONV and BASE_CONV. - (standard_conversion): No std conv to enum type. - - * cvt.c (standard_conversion): Fix order of args to DERIVED_FROM_P - for ptm's. - - * cvt.c (reference_binding): Bind directly to a base subobject of - a class rvalue. - - * cvt.c (build_new_op): Enforce access control. - -Tue Jul 30 09:22:53 1996 Bob Manson - - * typeck2.c (process_init_constructor): When scanning the - union for a named field, skip things that aren't FIELD_DECLs. - - * method.c (synthesize_method): Don't scan fndecl's rtl if - we're at the end of the file; just assume the function can't - be inlined. - -Mon Jul 29 15:48:30 1996 Jason Merrill - - * cvt.c (build_builtin_candidate): Stick a dummy conversion in if - it failed. - - * cvt.c (build_user_type_conversion_1): Handle overloaded - conversion ops. - - * cvt.c (add_builtin_candidates): Don't consider type conversion - operators for the first parameter of operator=. - -Mon Jul 29 15:33:55 1996 Bob Manson - - * typeck.c (complete_type): Only call layout_type if we're not - expanding a template. - -Mon Jul 29 14:40:38 1996 Jason Merrill - - * cvt.c (compare_ics): Oops. - - * cvt.c (op_error): Oops. - - * cp-tree.def: Add RVALUE_CONV, rename EXACT_CONV to IDENTITY_CONV. - * cvt.c: Add IDENTITY_RANK before others. Use real_lvalue_p. - (build_conv): Use them. - (implicit_conversion): Use them. - (convert_like): Handle them. - (build_new_op): Handle builtin COND_EXPR again. - (add_builtin_candidates): Strip cv-quals. Fix oops. Include enums - in lists of types for COND_EXPR. - (add_builtin_candidate): Add enum candidates for COND_EXPR. - -Mon Jul 29 12:05:40 1996 Bob Manson - - * typeck.c (build_modify_expr): Always attempt to build a call to - the assignment operator, even if we're using a default one. - (convert_for_initialization): Call complete_type. - -Mon Jul 29 11:25:08 1996 Jason Merrill - - * cvt.c (reference_binding): A REF_BIND gets the reference type. - (implicit_conversion): Likewise. - (convert_like): Likewise. - (compare_ics): Likewise. - (compare_qual): Likewise. - (print_z_candidates): Handle no candidates. - (build_new_op): Don't handle builtin COND_EXPR for now. - -Sat Jul 27 11:27:47 1996 Stan Shebs - - * cvt.c (build_builtin_candidate): Init local var in an ANSI way. - -Fri Jul 26 01:07:22 1996 Jason Merrill - - * cvt.c (joust): If the candidates are the same, arbitrarily pick one. - - * cvt.c (build_builtin_candidate): Oops. - (build_new_op): Oops. - - * method.c (build_opfncall): Pass COND_EXPR on. - * cvt.c (build_builtin_candidate): Reorganize, support COND_EXPR. - (add_builtin_candidate{,s}): Likewise. - (add_builtin_candidates): Likewise. - (print_z_candidates, op_error, build_new_op): Likewise. - (type_decays_to): New fn. - * lex.c (init_lex): Just say ?: for COND_EXPR. - -Thu Jul 25 09:33:33 1996 Jason Merrill - - * typeck.c (complete_type): Call layout_type rather than building - a new array type. - - * cvt.c (add_builtin_candidate): Pointer arithmetic candidates - only use ptrdiff_t. - -Wed Jul 24 12:45:08 1996 Jason Merrill - - * cvt.c: Always compile the new overloading code (but don't use it). - (implicit_conversion): Add a BASE_CONV when converting to - the same class type. - (convert_like): Handle BASE_CONV. - -Tue Jul 23 12:46:30 1996 Jason Merrill - - * cvt.c (build_new_op): Support {MAX,MIN}_EXPR. - (add_builtin_candidate): Likewise. - - NEW_OVER changes: - * typeck.c (build_x_function_call): Try an operator function - whenever we call an object of class type. - * method.c (build_opfncall): Pass CALL_EXPRs through. - * cvt.c (implicit_conversion): Do const-ref case first. - (add_conv_candidate, build_object_call, op_error): New fns. - (ptr_complete_ob, TYPE_PTROB_P): void is not an object type. - ({add,build}_builtin_candidate{,s}, print_z_candidates): Display - builtin candidates. - (build_new_op): Handle CALL_EXPR. Don't try to decay void. - Fall back on preincrement handling. Use op_error. - Handle warn_synth. - (convert_like): Pass INDIRECT_BIND. Don't try to do anything with - an error_mark_node. - (build_over_call): Handle PROMOTE_PROTOTYPES and ellipsis promotions - properly. - -Mon Jul 22 16:21:55 1996 Bob Manson - - * pt.c (tsubst_expr): Handle CONTINUE_STMT. - -Mon Jul 22 15:38:58 1996 Mike Stump - - * typeck.c (build_component_ref_1): Use build_component_ref - instead of open coding it here. - -Mon Jul 22 12:18:54 1996 Jason Merrill - - * g++.c (main): Don't link with -lg++. - - NEW_OVER changes: - * cvt.c (convert_to_reference): Don't use convert_from_refeence on - result of build_type_conversion. - (cp_convert): Only call build_method_call for ctors if - build_type_conversion failed. - (ptr_complete_ob): New function. - (TYPE_PTR{,OB,MEM}_P): New macros. - ({add,build}_builtin_candidate{,s}): New functions. - (print_z_candidates): Handle builtins. - (build_user_type_conversion_1): Don't use conversion fns for - converting to a base type. - (build_user_type_conversion_1): Set ICS_USER_FLAG on AMBIG_CONVs. - (build_user_type_conversion): Use convert_from_reference. - (build_new_op): New function. - (build_over_call): Fix handling of methods. - (compare_ics): Handle AMBIG_CONV properly. - * typeck2.c: Increment abort count. - * method.c (build_opfncall): Forward most requests to build_new_op. - * cp-tree.h (IS_OVERLOAD_TYPE): Tweak. - -Fri Jul 19 17:59:29 1996 Brendan Kehoe - - * error.c (dump_expr, case CONSTRUCTOR, case CAST_EXPR): Take out - invalid second argument to dump_expr_list. - -Fri Jul 19 14:04:05 1996 Mike Stump - - * decl.c (lookup_name_real): Make sure we do obj->X::i correctly. - -Thu Jul 18 14:48:23 1996 Bob Manson - - * decl2.c (import_export_vtable): ASM_OUTPUT_EXTERNAL, not - ASSEMBLE_EXTERNAL. - -Mon Jul 15 17:48:43 1996 Mike Stump - - * typeck2.c (process_init_constructor): New pedwarn for using { } - to initialize a pointer to member function. - * typeck.c (build_ptrmemfunc1): Avoid use of digest_init so that - we can avoid the new error. - -Mon Jul 15 15:42:03 1996 Mike Stump - - * typeck.c (build_ptrmemfunc1): New function to hide details of - pointer to member functions better. - -Mon Jul 15 14:23:02 1996 Mike Stump - - * init.c (resolve_offset_ref): Resolve OFFSET_REFs that are - methods into the actual method, as we know the implied object is - not used. - -Mon Jul 15 13:08:29 1996 Brendan Kehoe - - * parse.y (maybecomma_warn): Only emit the pedwarn if we're not - inside a system header. - -Fri Jul 12 16:30:05 1996 Bob Manson - - * call.c (build_method_call): Call complete_type on the - instance type. - -Thu Jul 11 17:16:40 1996 Mike Stump - - * typeck.c (build_component_ref): Always build up an OFFSET_REF - for obj_ptr->func so that we can know which object to use in a - method call. - -Wed Jul 10 19:36:37 1996 Mike Stump - - * typeck.c (build_ptrmemfunc): Remove sorry, now we can cast - around things. Also improve maintainability. - -Wed Jul 10 18:20:11 1996 Bob Manson - - * decl.c (grokdeclarator): Check for overflow when evaluating an - array dimension. - -Wed Jul 10 17:26:19 1996 Jason Merrill - - * cvt.c (cp_convert): Don't check for ambiguity with constructor - if NEW_OVER. - - * typeck.c (build_x_function_call): Pass function overload - questions to new overloading code if NEW_OVER. - * init.c (expand_aggr_init_1): Only check for type conversion ops - if we're doing copy-initialization (i.e. LOOKUP_ONLYCONVERTING). - Don't check for ambiguity with constructor if NEW_OVER. - * cvt.c (convert_to_reference): Dereference the result of a type - conversion operator. - (build_conv): Propagate ICS_USER_FLAG. - (implicit_conversion): Call instantiate_type. - Pass LOOKUP_ONLYCONVERTING instead of LOOKUP_NORMAL. - (add_function_candidate): Fix cv-quals on argtype. - (print_z_candidates): New function. - (build_new_function_call): Call it. - (build_user_type_conversion_1): If LOOKUP_ONLYCONVERTING, don't - consider non-converting constructors. - Call print_z_candidates. - Return an AMBIG_CONV for an ambiguous conversion. - (build_user_type_conversion): Handle AMBIG_CONV. - (convert_like): Fix test for building TARGET_EXPR. - Call instantiate_type. - Handle AMBIG_CONV and LVALUE_CONV. - (build_over_call): Handle 0 args and ellipsis. - * cp-tree.def: Add AMBIG_CONV. - -Tue Jul 9 17:48:48 1996 Mike Stump - - * decl.c (lookup_name_real): If we find mem in obj when parsing - `obj->mem', make sure we return the right value. - -Tue Jul 9 16:11:28 1996 Bob Manson - - * search.c (get_base_distance): Call complete_type. - -Tue Jul 9 12:46:34 1996 Mike Stump - - * decl.c (store_bindings): Make static. - -Mon Jul 8 16:42:31 1996 Jason Merrill - - * init.c (expand_aggr_init_1): Don't check type conversions if - NEW_OVER. - - * cvt.c (z_candidate): Put back template field. - (add_function_candidate): Set it. - (add_template_candidate): Likewise. - (joust): Use it. - (compare_qual): Handle references and pointers to members. - (compare_ics): Handle reference bindings. - - * decl.c (duplicate_decls): Propagate DECL_ONE_ONLY. - -Mon Jul 8 16:18:56 1996 Bob Manson - - * call.c (compute_conversion_costs): Call complete_type. - - * tree.c (vec_binfo_member): Use comptypes instead of comparing - pointers, so we can handle template parameters. - -Fri Jul 5 16:51:53 1996 Bob Manson - - * cvt.c (cp_convert_to_pointer): We have to call complete_type - here; let's make it explicit instead of a side effect of an - error check. - -Wed Jul 3 16:29:51 1996 Jason Merrill - - * cvt.c (z_candidate): Remove template field. - (reference_binding): Handle binding to temporary. - (implicit_conversion): Likewise. - (add_function_candidate): Handle artificial constructor parms. - Handle functions with too few parms. - (add_template_candidate): New function. - (build_user_type_conversion_1): Handle constructors. - (convert_like): Likewise. - (build_over_call): Likewise. - (build_new_function_call): Support templates. - (compare_ics): Fix reference, inheritance handling. - -Mon Jul 1 22:58:18 1996 Bob Manson - - * decl.c: Add signed_size_zero_node. - (init_decl_processing): Build it. - * class.c (prepare_fresh_vtable): Use it instead of size_zero_node - when we're trying to make a negative delta. - -Mon Jul 1 17:56:19 1996 Brendan Kehoe - - Stop doing this damn index==strchr variable name confusion. - * class.c (add_virtual_function): Change local var INDEX to be - named IDX. - (add_method): Likewise. - * lex.c (print_parse_statistics): Likewise. - * search.c (make_memoized_table_entry): Likewise. - (lookup_fnfields_here): Likewise. - (lookup_field): Likewise. - (lookup_fnfields): Likewise. - (get_baselinks): Likewise. - * sig.c (build_signature_table_constructor): Likewise. - (build_signature_method_call): Likewise. - * typeck.c (build_x_array_ref): Change INDEX parm to be named IDX. - (get_member_function_from_ptrfunc): Likewise. - (build_ptrmemfunc): Change local var INDEX to be IDX. - (c_expand_start_case): Likewise. - -Sat Jun 29 14:05:46 1996 Jason Merrill - - * cvt.c (cp_convert_to_pointer): Move user-defined type conversion - handling to before extraction of TYPE_PTRMEMFUNC_FN_TYPE. - (convert_to_reference): Use build_type_conversion to convert to - the reference type directly. - (standard_conversion): Fix void* case, non-conversions. - (reference_binding): Fix expr == 0 case, non-conversions. - (convert_like): Support REF_BIND. - (compare_qual): Split out from compare_ics. - (compare_ics): Use it, handle icses with only a qual_conv. - - * init.c (expand_vec_init): Don't crash if decl is NULL. - -Fri Jun 28 11:52:51 1996 Stan Shebs - - * mpw-config.in: New file, configury for Mac MPW. - * mpw-make.sed: New file, makefile editing for MPW. - -Thu Jun 27 15:18:30 1996 Jason Merrill - - * pt.c (instantiate_class_template): Call repo_template_used. - - * search.c (lookup_conversions): Only lookup conversions in - complete types. - -Thu Jun 27 12:59:53 1996 Brendan Kehoe - - * cp-tree.def: Renamed from tree.def, to avoid confusion with - gcc's tree.def. - * cp-tree.h, lex.c: Include cp-tree.def. - * Makefile.in (CXX_TREE_H): Reference cp-tree.def. - -Wed Jun 26 18:29:47 1996 Bob Manson - - * init.c (build_vec_delete_1): Call complete_type. - -Mon Jun 24 17:17:32 1996 Mike Stump - - * except.c (start_anon_func): Make sure anonymous functions are - never external. - -Fri Jun 21 15:10:58 1996 Jason Merrill - - * decl.c (finish_function): If function_depth > 1, set nested. - - * decl2.c (grokbitfield): Revert Bob's change. - * class.c (finish_struct_1): Fix handling of named bitfield widths. - -Thu Jun 20 23:35:38 1996 Jason Merrill - - * pt.c (add_pending_template): Handle types. - (lookup_template_class): With -fexternal-templates, just add the class - to pending_templates instead of instantiating it now. - * decl2.c (finish_file): Handle types in pending_templates. - -Thu Jun 20 14:08:40 1996 Bob Manson - - * decl2.c (grokbitfield): Handle constant decls appropriately. - Give an appropriate error message now instead of spewing core - later. - -Thu Jun 20 13:01:51 1996 Jason Merrill - - * decl2.c: Don't turn on thunks by default for now. - -Wed Jun 19 11:37:04 1996 Jason Merrill - - * typeck.c (complete_type): Handle error_mark_node. - (common_type, OFFSET_TYPE): Handle template_type_parms. - -Tue Jun 18 10:02:15 1996 Jason Merrill - - * pt.c (instantiate_decl): If at_eof, call import_export_decl - regardless of DECL_INLINE. - - * typeck.c (mark_addressable): Set TREE_ADDRESSABLE on CONSTRUCTORs. - - * class.c (finish_struct_bits): Copy TYPE_SIZE. - - * rtti.c (build_dynamic_cast): Support templates. - * tree.def: Support DYNAMIC_CAST_EXPR. - * pt.c (tsubst_copy): Likewise. - * decl2.c (build_expr_from_tree): Likewise. - -Mon Jun 17 15:23:36 1996 Jason Merrill - - * typeck.c (build_static_cast): Support templates. - (build_const_cast): Likewise. - * tree.def: Support CONST/STATIC_CAST_EXPR. - * pt.c (tsubst_copy): Likewise. - * decl2.c (build_expr_from_tree): Likewise. - -Sun Jun 16 12:33:57 1996 Jason Merrill - - * decl2.c (finish_vtable_vardecl): Don't trust - TREE_SYMBOL_REFERENCED for vtables of local classes. - -Fri Jun 14 18:13:36 1996 Jason Merrill - - * pt.c (tsubst_copy): Handle operator T. - -Wed Jun 12 17:52:40 1996 Brendan Kehoe - - * init.c (build_delete): Move creation of PARMS inside test of - TYPE_HAS_DESTRUCTOR, since it's never used outside of that block. - -Tue Jun 11 15:09:18 1996 Bob Manson - - * typeck.c (build_conditional_expr): Don't assume that - the arguments to ?: are always pointers or records. - -Tue Jun 11 13:56:23 1996 Jason Merrill - - * decl2.c (import_export_decl): Still emit static/weak/comdat - copies of inline template functions with -fno-implicit-templates. - -Tue Jun 11 11:42:13 1996 Bob Manson - - * init.c (build_delete): Determine the complete basetype - path to the destructor we're calling. - -Fri Jun 7 15:30:10 1996 Bob Manson - - * decl.c (build_enumerator): Always copy the INTEGER_CST used to - initialize the enum, because we really and truly don't know where - it came from. - (start_enum): Don't copy integer_zero_node because - build_enumerator will do it. - -Fri Jun 7 11:11:09 1996 Jason Merrill - - * decl.c (finish_function): Do access control on base destructors. - - * pt.c (tsubst, case FUNCTION_DECL): Set up - IDENTIFIER_GLOBAL_VALUE for member functions so pushdecl doesn't - hose us. - -Fri Jun 7 10:37:33 1996 Mike Stump - - * cvt.c (build_up_reference): If we have already extended the - lifetime of the temporary, don't try it again. - * typeck.c (c_expand_return): Don't try and convert the return - value twice when we want a reference, once is enough. - -Tue Jun 4 15:41:45 1996 Jason Merrill - - * pt.c (tsubst_expr, case DECL_STMT): Don't pass - LOOKUP_ONLYCONVERTING at all for now. - - * search.c (add_conversions): Put the conversion function in - TREE_VALUE, the basetype in TREE_PURPOSE. - * cvt.c (build_type_conversion): Adjust. - * cvt.c (build_expr_type_conversion): Adjust. - * call.c (user_harshness): Adjust. - -Mon Jun 3 15:30:52 1996 Jason Merrill - - * method.c (emit_thunk): Pretend this is a FUNCTION_DECL for the - backend's benefit. - -Mon Jun 10 18:58:19 1996 Mike Stump - - * except.c (expand_start_catch_block): Add a dummy region, if we - get an error, so that we can avoid core dumping later. - -Fri May 31 14:56:13 1996 Mike Stump - - * cp-tree.h (OFFSET_REF): Remove. - * tree.def (CP_OFFSET_REF): Rename to OFFSET_REF. - * expr.c (cplus_expand_expr): Cleanup callers of expand_expr. - * init.c (expand_aggr_init_1): Likewise. - (build_new): Likewise. - * typeck.c (expand_target_expr): Likewise. - -Fri May 31 14:22:08 1996 Jason Merrill - - * typeck.c (build_modify_expr): Don't use TREE_VALUE on a - TARGET_EXPR. - -Wed May 29 17:04:33 1996 Mike Stump - - * cvt.c (build_up_reference): Redo how and when temporaries are - created. - * decl.c (grok_reference_init): Don't try and be smart about - running cleanups. - -Wed May 29 16:02:08 1996 Mike Stump - - * cvt.c (build_up_reference): Add NULL_TREE to all calls to build - (TARGET_EXPR...), now that it has 4 arguments. - * tree.c (build_cplus_new): Likewise. - -Thu May 23 16:40:30 1996 Jason Merrill - - * error.c (dump_expr, case CAST_EXPR): Handle T() properly. - - * pt.c (instantiate_decl): Don't call push/pop_cp_function_context. - * decl.c (struct saved_scope): Remove named_labels, - {base,member}_init_list. - (maybe_push_to_top_level): Don't set them. Call - push_cp_function_context if appropriate. - (pop_from_top_level): Likewise. - - * method.c (do_build_assign_ref): Remove obsolete check of - TYPE_HAS_ASSIGN_REF (basetype). - - * decl.c (grokfndecl): Diagnose user definition of - implicitly-declared methods. - -Thu May 23 12:13:08 1996 Bob Manson - - * method.c (do_build_copy_constructor): Add code to give - meaningful error messages instead of crashing. - (do_build_assign_ref): Don't synthesize assignment operators for - classes containing reference or const members. - - * class.c (struct base_info): Remove cant_synth_copy_ctor - and cant_synth_asn_ref. - (finish_base_struct): Remove the code that tries to conditionalize - synthesis of copy constructors & assignment operators based on - access permissions. Instead, let it fail when it tries to - synthesize the copy constructor. This will give meaningful error - messages instead of silently generating code to perform a bitcopy. - -Wed May 22 11:45:19 1996 Bob Manson - - * lex.c (real_yylex): Remove old-n-crufty #if 0 code for - determining types for constant values. - - * decl.c (struct named_label_list): Use instead of stuffing - random items into a TREE_LIST node. - (named_label_uses): Use the new struct. - (poplevel): Likewise. - (lookup_label): Likewise. - (define_label): Add an error message to tell the user the line - where the goto is located in addition to the destination of the - goto. - (init_decl_processing): Use NULL instead of NULL_TREE to initialize - named_label_uses. - (finish_function): Likewise. - - (start_decl): Complain about defining a static data member - in a different type from which it was declared. - -Wed May 22 09:33:23 1996 Jason Merrill - - * cvt.c (build_expr_type_conversion): Adjust. - -Tue May 21 11:21:56 1996 Jason Merrill - - * call.c (build_method_call): Always convert 'this' to the - appropriate type. - - * search.c (add_conversions): Put the conversion function in - TREE_VALUE, the type in TREE_PURPOSE. - * cvt.c (build_type_conversion): Adjust. - * call.c (user_harshness): Adjust. - - * method.c (emit_thunk): Call temporary_allocation and - permanent_allocation around the ASM_OUTPUT_MI_THUNK case, too. - - * tree.c (build_cplus_array_type): Handle tweaking of - TYPE_MAIN_VARIANT here. - * typeck.c (common_type): Not here. - - * typeck.c (complete_type): Only try to complete an array type if - it has a domain. - -Mon May 20 14:55:59 1996 Jason Merrill - - * decl.c (grokvardecl): Call complete_type. - (grokdeclarator): Call complete_type for PARM_DECLs. - -Fri May 17 16:41:17 1996 Jason Merrill - - * pt.c (instantiate_class_template): Re-set - CLASSTYPE_GOT_SEMICOLON after calling finish_struct_1. - -Fri May 17 14:56:55 1996 Mike Stump - - * cp-tree.h (cp_expand_decl_cleanup): Remove, the backend is now - smart enough to do it right. - * tree.c (cp_expand_decl_cleanup): Likewise. - * decl.c (cp_finish_decl): Use expand_decl_cleanup instead of - cp_expand_decl_cleanup. - (store_parm_decls): Likewise. - (hack_incomplete_structures): Likewise. - * except.c (push_eh_cleanup): Likewise. - -Fri May 17 13:13:51 1996 Mike Stump - - * expr.c (expand_expr, cond UNSAVE_EXPR): Move from the C++ - frontend to the backend where it belongs. - * tree.c (unsave_expr): Likewise. - (unsave_expr_now): Likewise. - * tree.def (UNSAVE_EXPR): Likewise. - * cp-tree.h (unsave_expr): Likewise. - (unsave_expr_now): Likewise. - -Fri May 17 11:02:41 1996 Mike Stump - - * init.c (emit_base_init): Make sure the partial EH cleanups live - on the function_obstack. - -Thu May 16 15:29:33 1996 Bob Manson - - * expr.c (do_case): Don't try to dereference null TREE_TYPEs - when checking for pointer types. - -Thu May 16 13:38:58 1996 Jason Merrill - - * pt.c (instantiate_class_template): Remove obsolete check for - access declarations. - -Thu May 16 13:34:15 1996 Mike Stump - - * call.c (build_overload_call): Simplify calls to - build_overload_call by removing last parameter. - (build_method_call): Likewise. - * cp-tree.h: Likewise. - * method.c (build_opfncall): Likewise. - * typeck.c (build_x_function_call): Likewise. - -Thu May 16 13:15:43 1996 Mike Stump - - * call.c (default_parm_conversions): Factor out common code. - (build_method_call): Use it. - (build_overload_call_real): Use it. - -Wed May 15 14:46:14 1996 Mike Stump - - * call.c (build_method_call): Allow implicit & on METHOD_TYPEs, - but pedwarn as the code is bogus. - * typeck.c (decay_conversion): Likewise. - (build_function_call_real): Use build_addr_func instead of - default_conversion. Don't allow pointer-to-method functions down - here. - (build_unary_op): Use real pointer-to-member functions instead of - fake ones. - (build_ptrmemfunc): Use build_addr_func instead of build_unary_op. - (convert_for_assignment): Removed some obsolete code. - * decl2.c (reparse_absdcl_as_expr): Pass current_class_ref to - build_x_function_call instead of current_class_ptr. Only call - digest_init once on an initializer, we do this just checking - TREE_TYPE. - (build_expr_from_tree): Pass current_class_ref to - build_x_function_call instead of current_class_ptr. - * init.c (build_member_call): Likewise. - * pase.y: Likewise. - * error.c (dump_expr): Handle OFFSET_REFs better. - * pt.c (unify): Handle pointer-to-member functions better. - * decl.c (finish_function): Clear out current_class_ref just like - we do for current_class_ptr. - - * typeck.c (get_delta_difference): Handle virtual bases better. - -Tue May 14 16:37:37 1996 Jason Merrill - - * sig.c (build_signature_table_constructor): Use the delta for - the original basetype for this virtual function with thunks. - (build_signature_method_call): We still need to adjust 'this' - with thunks. - -Tue May 14 16:27:25 1996 Mike Stump - - * call.c (build_addr_func): New routine. Used to get the `real' - address of a function or a method. Needed to avoid getting a - pointer-to-member function. - (build_call): New routine to build CALL_EXPRs. - (build_method_call): Use it. - * cvt.c (convert_to_aggr): Likewise. - * typeck.c (build_function_call_real): Likewise. - * sig.c (build_signature_table_constructor): Use build_addr_func. - * cp-tree.h (build_call, build_addr_func): Declare them. - -Tue May 14 12:47:47 1996 Mike Stump - - * cp-tree.h (LOOKUP_AGGR): Remove, unused. - * parse.y: Remove uses of LOOKUP_AGGR. - -Tue May 14 12:07:51 1996 Mike Stump - - * *.[chy]: Rename current_class_decl to current_class_ptr, and - C_C_D to current_class_ref. - -Mon May 13 16:55:23 1996 Jason Merrill - - * call.c (convert_harshness): Tighten up pointer conversions. - -Sat May 11 04:33:50 1996 Doug Evans - - * decl2.c (finish_vtable_vardecl): Surround DECL_ONE_ONLY with ifdef. - (finish_file): Likewise. - -Fri May 10 11:09:57 1996 Jason Merrill - - * cvt.c (convert_fn_ptr): We don't use thunks for pmfs. - - * method.c (emit_thunk): Set flag_omit_frame_pointer in default - code. - -Thu May 9 18:18:30 1996 Jason Merrill - - * decl2.c: Turn on thunks by default where supported. - -Tue May 7 20:39:57 1996 Mike Stump - - * cp-tree.h (build_overload_call_maybe): Removed. - * call.c (build_overload_call_real): Invert meaning of last arg to - be require_complete. - (build_overload_call): Likewise. - * typeck.c (build_x_function_call): Use build_overload_call_real - instead of build_overload_call_maybe. - -Mon May 6 01:23:32 1996 Jason Merrill - - * decl2.c (finish_file): Don't try to emit functions that haven't - been compiled. - -Fri May 3 09:30:13 1996 Jason Merrill - - * decl2.c (finish_vtable_vardecl): Oops. - - * decl.c (maybe_push_to_top_level): Do save previous_class_*. - Also store the bindings from previous_class_values. - (pop_from_top_level): Restore them. - -Thu May 2 21:56:49 1996 Jason Merrill - - * decl2.c (finish_vtable_vardecl): Only write out vtable if its - symbol has been referenced. - (finish_file): Re-join synthesis/vtable loop with inline emission - loop, disable inlining when an inline is output. - -Thu May 2 17:20:02 1996 Mike Stump - - * except.c (init_exception_processing): Setup saved_in_catch. - (push_eh_cleanup): Reset __eh_in_catch. - (expand_start_catch_block): Set __eh_in_catch. - -Thu May 2 16:21:17 1996 Mike Stump - - * except.c (push_eh_cleanup): Add tracking for whether or not we - have an active exception object. - (expand_builtin_throw): Use it to make sure a rethrow without an - exception object is caught. - -Thu May 2 11:26:41 1996 Jason Merrill - - * decl.c (maybe_push_to_top_level): Clear out class-level bindings - cache. - -Wed May 1 11:26:52 1996 Jason Merrill - - * decl2.c (finish_file): Also use sentries for vars with - DECL_ONE_ONLY or DECL_WEAK set (should any such happen to be - created). - - * lex.c (handle_cp_pragma): Disable #pragma - interface/implementation if SUPPORTS_ONE_ONLY > 1. - -Tue Apr 30 11:25:46 1996 Jason Merrill - - * method.c (emit_thunk): Wrap default case in - temporary/permanent_allocation. - - * method.c (make_thunk): Use DECL_ONE_ONLY. - (emit_thunk): Call assemble_end_function. - -Mon Apr 29 15:38:29 1996 Jason Merrill - - * decl2.c (import_export_vtable): Use DECL_ONE_ONLY. - (import_export_decl): Likewise. - (finish_prevtable_vardecl): Disable vtable hack if - SUPPORTS_ONE_ONLY > 1. - -Mon Apr 29 14:32:47 1996 Mike Stump - - * typeck.c (build_modify_expr): PREINCREMENT_EXPR and - PREDECREMENT_EXPRs take two arguments, not one. - -Mon Apr 29 00:27:53 1996 Jason Merrill - - * class.c (build_vtable_entry): Don't build thunks for abstract - virtuals. - - * lex.c (real_yylex): Fix handling of __PRETTY_FUNCTION__ like C - frontend. - -Sat Apr 27 16:45:35 1996 Jason Merrill - - * class.c (set_rtti_entry): Use size_zero_node. - (build_vtable): Likewise. - -Sat Apr 27 14:48:57 1996 Jason Merrill - - * class.c (finish_struct_1): Pass size_zero_node to set_rtti_entry. - (prepare_fresh_vtable): Likewise. - -Fri Apr 26 13:14:14 1996 Jason Merrill - - * method.c (emit_thunk): Call mark_used on the target function. - - * call.c (build_method_call): Don't warn about pending templates. - -Thu Apr 25 14:55:44 1996 Jason Merrill - - * decl2.c (finish_file): Fix list walking logic. - - * typeck2.c (check_for_new_type): Only warn if -pedantic. - -Wed Apr 24 15:41:15 1996 Bob Manson - - * class.c (finish_struct_1): Remove old code for - dont_allow_type_definitions. - * cp-tree.h: Likewise. - * spew.c: Make sure cp-tree.h is included before parse.h, so the - definition of flagged_type_tree is found before it is used. - * lex.c: Likewise. - * parse.y: Added the ftype member to the type union, and changed a - number of rules to use it instead of ttype. Added calls to - check_for_new_type() as appropriate. - * typeck2.c (check_for_new_type): New function for checking - if a newly defined type appears in the specified tree. - * cp-tree.h: Add new type flagged_type_tree. Add a prototype - for check_for_new_type(). - -Wed Apr 24 00:36:21 1996 Jason Merrill - - * decl2.c (finish_file): Only use a sentry if the decl is public. - - * pt.c (tsubst_expr, DECL_STMT): If we don't have an initializer, - don't pass LOOKUP_ONLYCONVERTING. - -Tue Apr 23 17:18:47 1996 Bob Manson - - * typeck.c (common_type): Fix the ARRAY_TYPE case so it - properly keeps track of const and volatile type modifiers. - -Tue Apr 23 10:52:56 1996 Jason Merrill - - * tree.c (cp_tree_equal): C++ version of simple_cst_equal. - * pt.c (comp_template_args): Use it. - - * rtti.c (get_tinfo_fn, build_dynamic_cast, expand_*_desc): Call - assemble_external for artificial function decls. - - * decl.c (cp_finish_decl): Oops. - -Mon Apr 22 17:28:27 1996 Jason Merrill - - * decl2.c (import_export_decl): Put static data member templates - into common storage, or make them weak, depending on whether they - are dynamically or statically initialized. - (get_sentry): New function. - (finish_file): Do import_export_decl for static data members before - building the init/fini functions. Don't init/fini a variable that's - EXTERNAL. Use a sentry for variables in common. Fix mismatching - push/pop_temp_slots. - * decl.c (cp_finish_decl): If DECL_NOT_REALLY_EXTERN, do the - expand_static_init thang. - * method.c (get_id_2): New function. - -Mon Apr 22 15:32:45 1996 Bob Manson - - * parse.y (empty_parms): Make sure we use C++-style prototypes - when we're declaring member functions. - -Sun Apr 21 10:08:22 1996 Jason Merrill - - * Makefile.in (CONFLICTS): 16 s/r conflicts. - * parse.y (self_template_type): New nonterminal. - -Thu Apr 18 08:56:54 1996 Jason Merrill - - * decl.c (make_typename_type): Handle getting a TYPE_DECL for a - name. - * parse.y (base_class.1): Allow 'typename foo::bar'. - - * lex.c (check_newline): Remove #pragma code that plays with the - input stream, since we now deal with tokens. Clear nextchar when - we're done. - (handle_cp_pragma): Use real_yylex. - (handle_sysv_pragma): Don't do skipline here. Only call real_yylex - in one place. - - * lex.c (check_for_missing_semicolon): Handle SELFNAME. - - * lex.c (handle_cp_pragma): Fix "#pragma implementation". - -Wed Apr 17 16:51:33 1996 Jason Merrill - - * parse.y: New token SELFNAME for potential constructor. - * spew.c (yylex): Handle it. - * lex.c (identifier_type): Produce it. - - * parse.y (complete_type_name): In :: case, don't push class binding. - (complex_type_name): Likewise. - -Wed Apr 17 15:02:40 1996 Mike Stump - - * typeck.c (build_reinterpret_cast): Handle pointer to member - functions. - -Wed Apr 17 12:28:26 1996 Brendan Kehoe - - * lex.c (handle_cp_pragma): New function, with decl, doing the cc1plus - pragmas. - (check_newline): Put the vtable/unit/implementation/interface pragma - code into handle_cp_pragma, replacing it with a call. - (handle_sysv_pragma): Give int return type, and take FINPUT and TOKEN - args. Get the next token after handling the pragma token. - -Wed Apr 17 10:28:34 1996 Jason Merrill - - * cvt.c (cp_convert_to_pointer): Avoid doing base analysis on pmfs. - (convert_to_pointer_force): Likewise. - - * init.c (build_new): Fix array new without -fcheck-new. - -Tue Apr 16 13:44:58 1996 Jason Merrill - - * cp-tree.h, call.c, class.c, decl.c, parse.y, pt.c, rtti.c, - tree.c: Lose TYPE_NESTED_NAME. - - * parse.y (nested_name_specifier_1): Don't treat non-identifiers - as identifiers. - - * tree.def: Add VEC_INIT_EXPR. - * expr.c (cplus_expand_expr): Handle it. - * init.c (build_new): Use it instead of the RTL_EXPR nastiness and - the extra file-scope symbol nastiness. - -Mon Apr 15 16:21:29 1996 Jason Merrill - - * method.c (make_thunk): Thunks are static. - (emit_thunk): Use ASM_OUTPUT_MI_THUNK if it's defined. - - * decl2.c (mark_vtable_entries): Emit thunks as needed. - (finish_file): Don't emit them here. - -Sun Apr 14 11:34:39 1996 Jason Merrill - - * rtti.c (build_dynamic_cast): Handle null pointers. - (ifnonnull): New function. - -Fri Apr 12 09:08:27 1996 Bob Manson - - * call.c (build_method_call): Remember the original basetype we - were called with. Give an error message instead of trying - (incorrectly) to call a non-static member function through a - non-inherited class. - - * search.c (expand_upcast_fixups): Mark the new fixup as - DECL_ARTIFICIAL. - -Thu Apr 11 03:57:09 1996 Jason Merrill - - * init.c (build_new): Use a TARGET_EXPR for alloc_expr. - - * class.c (set_rtti_entry): Fix for thunks. - - * decl2.c (import_export_decl): Still emit typeinfo fns for - cv-variants of builtin types. - - * rtti.c (expand_class_desc): Set up base_info_type_node here. - (init_rtti_processing): Instead of here. - -Wed Apr 10 14:17:13 1996 Jason Merrill - - * rtti.c (init_rtti_processing): Do init regardless of -frtti. - (build_typeid): Only complain about taking dynamic typeid without - -frtti. - - * decl2.c: flag_rtti defaults to 1. - - * rtti.c (get_tinfo_var): The general class case is now smaller. - (init_rtti_processing): Pack the latter three fields of base_info - into 32 bits. - -Wed Apr 10 13:50:14 1996 Mike Stump - - * init.c (expand_member_init): Don't dump if name is NULL_TREE. - -Wed Apr 10 12:56:02 1996 Mike Stump - - * search.c (make_memoized_table_entry): Undefer the pop, if necessary. - (push_memoized_context): Split out code to undefer pop_type_level to - (clear_memoized_cache): here. - (pop_memoized_context): We can only handle one layer of deferral of - pop_type_level so clear the cache, if there was a previous level. - -Tue Apr 9 23:06:09 1996 Jason Merrill - - * rtti.c (init_rtti_processing): Build up base_info_type_node. - (expand_class_desc): Use one pointer to an array of base_info - structs, passed using a CONSTRUCTOR. - -Tue Apr 9 14:20:57 1996 Mike Stump - - * class.c (build_vbase_path): Remove block extern for - flag_assume_nonnull_objects here. - (build_vfn_ref): Split out functionality into build_vtbl_ref. - (build_vtbl_ref): New routine. - (build_vtable): Set up rtti info here. - (add_virtual_function): Note in CLASSTYPE_RTTI the best - place where we can get the rtti pointers from to avoid having to - search around for a place. - (finish_base_struct): Likewise. - (finish_struct_1): Likewise. Never create totally new vtables - with totally new vtable pointers for rtti. Disable code to layout - vtable pointers better until we want to break binary - compatibility. - * rtti.c (build_headof_sub): New routine to convert down to a - sub-object that has an rtti pointer in the vtable. - (build_headof): Use it. Also, use build_vtbl_ref now to be more - maintainable. - (build_dynamic_cast): Make sure we have saved it, if we need to. - * search.c (dfs_init_vbase_pointers): Disable code that deals with - a more efficient vtable layout, enable later. - * call.c (flag_assume_nonnull_objects): Moved declaration to - * cp-tree.h: here. Declare build_vtbl_ref. - * pt.c (instantiate_class_template): Use NULL_TREE instead of 0 in - function calls that want a tree. - -Tue Apr 9 12:10:26 1996 Jason Merrill - - * rtti.c (build_dynamic_cast): Handle downcasting to X* given - other X subobjects in the most derived type. Ack. - - * rtti.c (build_dynamic_cast): No need to strip cv-quals here, - get_typeid will do it for us. - (get_typeid_1): Break out call-building for expand_*_desc to use. - (get_typeid): Call it. - (expand_*_desc): Likewise. - * decl.c (init_decl_processing): Don't set TYPE_BUILT_IN on char * - and void *. - (init_decl_processing): Lose builtin_type_tdescs lossage. - * decl2.c (finish_vtable_vardecl): Remove obsolete code. - -Mon Apr 8 17:23:23 1996 Bob Manson - - * pt.c (tsubst): When calling set_nested_typename, use - TYPE_NESTED_NAME (current_class_type) instead of - current_class_name. - - * decl.c (pushdecl): Likewise. - (pushdecl_class_level): Likewise. - (grokdeclarator): Use NULL_TREE instead of 0 in the call to - set_nested_typename. - -Sun Apr 7 10:44:31 1996 Jason Merrill - - * rtti.c (synthesize_tinfo_fn): Handle arrays. - - * cp-tree.h (DECL_REALLY_EXTERN): New macro. - -Sat Apr 6 13:56:27 1996 Jason Merrill - - * rtti.c (throw_bad_cast): Use entry point __throw_bad_cast. - (init_rtti_processing): Lose bad_cast_type. - (build_dynamic_cast): Use throw_bad_cast. - - * rtti.c (synthesize_tinfo_fn): Handle enums and pmfs. - - * decl2.c (finish_file): Don't synthesize artificial functions - that are external and not inline. - - * rtti.c (get_tinfo_fn): If at_eof, call import_export_decl. - - * decl2.c (finish_file): Handle having new inlines added to - saved_inlines by synthesis. - - * rtti.c (get_bad_cast_node): Don't require . - -Fri Apr 5 17:02:09 1996 Jason Merrill - - RTTI rewrite to initialize nodes as needed, not require that - users #include , complete functionality and reduce wasted - space. - * rtti.c (init_rtti_processing): New fn. - (build_typeid): The vtable entry is now a function. - (get_tinfo_var): New fn. - (get_tinfo_fn): Likewise. - (get_typeid): Use it. - (build_dynamic_cast): Declare and use entry point __dynamic_cast. - (build_*_desc): Rename to expand_*_desc and rewrite to use entry - points __rtti_*. - (add_uninstantiated_desc, get_def_to_follow, build_t_desc): Lose. - (synthesize_tinfo_fn): New fn. - * method.c (build_t_desc_overload): Lose. - (build_overload_with_type): More generic. - * decl.c (init_decl_processing): Call init_rtti_processing. - * class.c (set_rtti_entry): Use get_tinfo_fn. - * decl2.c (mark_vtable_entries): Mark the rtti function. - (finish_prevtable_vardecl): Don't build_t_desc. - (import_export_decl): Handle tinfo functions. - (finish_file): Likewise. - * typeck.c (inline_conversion): New fn. - (build_function_call_real): Use it. - * cp-tree.h: Add decls. - - * method.c (hack_identifier): Also convert component_refs from - references. - - * lex.c (cons_up_default_function): Use the type, not the name, in - declspecs. - - * decl2.c (import_export_vtable): Fix weak vtables. - -Fri Apr 5 13:30:17 1996 Bob Manson - - * search.c (get_base_distance_recursive): Fix access checks for - protected bases. - -Fri Apr 5 11:02:06 1996 Brendan Kehoe - - * call.c (unary_complex_lvalue): Delete unneeded decl, it's in - cp-tree.h. - (convert_harshness): Add prototypes wrapped by PROTO. - * decl2.c (grok_function_init): Likewise. - (do_toplevel_using_decl): Change to void return type. - * class.c (build_vtable_entry): Remove decl of make_thunk. - (merge_overrides): Fix order of arg definitions. - (finish_vtbls): Likewise. - (fixup_vtable_deltas): Likewise. - (modify_all_direct_vtables): Likewise. - (modify_all_indirect_vtables): Likewise. - * search.c (get_base_distance_recursive): Likewise. - (get_abstract_virtuals_1): Likewise. - (fixup_virtual_upcast_offsets): Likewise. - (lookup_fnfields_1): Add prototypes wrapped by PROTO. - * init.c (perform_member_init): Fix order of arg definitions. - (expand_aggr_init_1): Add prototypes wrapped by PROTO. - * cp-tree.h (make_thunk): Add decl. - (overload_template_name, push_template_decl): Add decls. - (do_toplevel_using_decl): Change to void return type. - (vec_binfo_member): Add decl. - -Thu Apr 4 13:33:10 1996 Brendan Kehoe - - * typeck.c (mark_addressable, convert_for_assignment, - convert_for_initialization, pointer_int_sum, pointer_diff, - unary_complex_lvalue): Add prototypes wrapped by PROTO. - (convert_sequence): #if 0 fn decl, since definition also is. - -Thu Apr 4 11:00:53 1996 Mike Stump - - * rtti.c (build_dynamic_cast): Make sure we strip qualifiers on - cast to pointer types for type searching. - -Wed Apr 3 17:10:57 1996 Brendan Kehoe - - * typeck.c (get_delta_difference): Use cp_error, not error, in the - case where BINFO == 0. - -Wed Apr 3 12:01:02 1996 Mike Stump - - * call.c (build_method_call): Fix wording of error messages so - constructors come out right. - -Tue Apr 2 16:06:59 1996 Bob Manson - - * decl.c (push_overloaded_decl): Don't warn about hidden - constructors when both the type and the function are declared - in a system header file. - -Mon Apr 1 09:03:13 1996 Bob Manson - - * class.c (finish_struct_1): Propagate the TYPE_PACKED - flag for the type to the type's fields. - -Sat Mar 30 12:14:33 1996 Brendan Kehoe - - * parse.y (complex_parmlist, ELLIPSES): Take out ARM-based warning. - -Fri Mar 29 15:51:36 1996 Bob Manson - - * class.c (base_info, finish_base_struct): Replace - needs_virtual_dtor with base_has_virtual. - - (finish_struct_1): Remove the old code that tried to make default - destructors virtual. Use base_has_virtual when checking if we need - to add a vtable entry for the rtti code. - -Fri Mar 29 14:02:36 1996 Jason Merrill - - * pt.c (push_template_decl): Complain about template decl with - inappropriate declaration. - -Fri Mar 29 12:15:35 1996 Bob Manson - - * typeck.c (build_x_unary_op): Remove bogus check for taking - the address of a member function. - -Fri Mar 29 11:56:02 1996 Jason Merrill - - * parse.y (constructor_declarator): Only push the class if - we are not already in the class. - -Fri Mar 29 09:41:02 1996 Jeffrey A. Law - - * method.c (emit_thunk): Remove current_call_is_indirect nonsense. - Add additional argument to INIT_CUMULATIVE_ARGS. - -Thu Mar 28 16:41:39 1996 Jason Merrill - - * decl.c (shadow_tag): Fix error about anon union with methods. - - * parse.y (self_reference): Only generate a self-reference if this - is a non-template class. - (opt.component_decl_list): Only use it if it was generated. - - * parse.y (component_decl_1): Use constructor_declarator. - (fn.def2): Likewise. - (notype_component_declarator0): Likewise. - -Thu Mar 28 15:11:35 1996 Bob Manson - - * typeck.c (build_x_unary_op): Add checks for taking the address - of a TARGET_EXPR or of a member function, and give appropriate - warnings. - -Thu Mar 28 14:49:26 1996 Jason Merrill - - * pt.c (process_template_parm): Allow template type parms to be - used as types for template const parms. - -Wed Mar 27 15:51:19 1996 Mike Stump - - * init.c (expand_vec_init): Ensure the eh cleanups are on the - function_obstack. - -Wed Mar 27 10:14:30 1996 Jason Merrill - - * decl.c (lookup_name_real): Be even more picky about the - ambiguous lookup warning. - (grokdeclarator): Tweak SCOPE_REF constructor declarators here. - * parse.y (constructor_declarator): Rather than here. - - * parse.y (constructor_declarator): New nonterminal. - (fn.def1): Use it. - (explicit_instantiation): Likewise. - -Tue Mar 26 13:41:33 1996 Jason Merrill - - Add implicit declaration of class name at class scope. - * decl.c (lookup_name_real): Restrict pedwarn about ambiguous lookup. - * parse.y (self_reference): New nonterminal. - (opt.component_decl_list): Use it. - (fn.def1): Add nested_name_specifier type_name cases. - * class.c (build_self_reference): New function. - (finish_struct): Handle access_default later, move self-reference - decl to the end. - * pt.c (lookup_template_class): Handle getting a TYPE_DECL. - * cp-tree.h: Adjust. - - * pt.c (do_function_instantiation): Separate handling of member - functions and non-member functions properly. - -Mon Mar 25 14:23:22 1996 Jason Merrill - - * pt.c (process_template_parm): Improve error for 'volatile class K'. - - * class.c (finish_struct_1): Check the right slot for destructors. - - * decl.c (start_enum): Complain about enum templates. - -Mon Mar 25 13:25:31 1996 Mike Stump - - * init.c (resolve_offset_ref): Offset pointers to member data by one. - * typeck.c (unary_complex_lvalue): Likewise. - -Mon Mar 25 13:30:42 1996 Bob Manson - - * typeck.c (c_expand_return): Check for a returned local - array name, similar to the check for an ADDR_EXPR. - -Mon Mar 25 13:07:19 1996 Jason Merrill - - * decl.c (cp_finish_decl): Don't build cleanups for static - variables here. - -Fri Mar 22 17:57:55 1996 Mike Stump - - * typeck.c (build_modify_expr): Fix error messages to be more - accurate. - * cp-tree.h (assop_as_string): Parallel to op_as_string, but for - assignment operators. - * error.c (assop_as_string): Likewise. Add support for `%Q' for - assignment operators. - -Fri Mar 22 13:48:29 1996 Jason Merrill - - * decl.c (grokdeclarator): Call bad_specifiers for typedefs. Also - give an error if initialized. Pedwarn about nested type with the - same name as its enclosing class. - - * pt.c (tsubst, case TYPE_DECL): Set DECL_CONTEXT. - - * typeck.c (require_complete_type): Be sure to instantiate the - MAIN_VARIANT of the type. - - * decl2.c (finish_file): Instantiate pending templates before - processing static constructors and destructors. - - * pt.c (instantiate_decl): Don't instantiate functions at toplevel - unless at_eof. - -Fri Mar 22 09:30:17 1996 Bob Manson - - * decl2.c (delete_sanity): If error_mark_node is passed - in as an expression, quit while we're ahead. - - * decl.c (grokdeclarator): Give an error message if `friend' - is combined with any storage class specifiers. - -Wed Mar 20 14:51:55 1996 Jason Merrill - - * parse.y (named_complex_class_head_sans_basetype): Don't crash on - definition of nonexistent nested type. - - * error.c (dump_decl, case TYPE_DECL): Fix decision for whether or - not to say 'typedef'. - -Wed Mar 20 00:11:47 1996 Brendan Kehoe - - * cp-tree.h (struct lang_type): Make search_slot a tree, not a char*. - * search.c (dfs_walk, dfs_init_vbase_pointers, - expand_upcast_fixups): Remove cast of CLASSTYPE_SEARCH_SLOT. - (dfs_find_vbases): Remove cast for CLASSTYPE_SEARCH_SLOT init. - -Tue Mar 19 17:56:03 1996 Jason Merrill - - * except.c (build_throw): Support minimal parse. - * pt.c (tsubst_copy): Support THROW_EXPR. - * decl2.c (build_expr_from_tree): Likewise. - - * pt.c (mangle_class_name_for_template): Always allocate - scratch_firstobj. - -Tue Mar 19 16:34:31 1996 Bob Manson - - * cvt.c (cp_convert_to_pointer): Give an appropriate error - when trying to cast from an incomplete type. - -Tue Mar 19 16:00:33 1996 Jason Merrill - - * pt.c (instantiate_class_template): Don't bother setting up - CLASSTYPE_TAGS explicitly, as the nested types will add - themselves. - -Tue Mar 19 15:48:43 1996 Bob Manson - - * decl.c (shadow_tag): Remove old error check for usage of - an enum without a previous declaration. - (xref_tag): Add error message about usage of enums without a - previous declaration. - -Tue Mar 19 09:21:35 1996 Jason Merrill - - * lex.c (do_identifier): Only do name consistency check if we're - parsing. - - * pt.c (push_template_decl): Don't crash if we get a member defn - that doesn't match. - - * decl.c (xref_tag_from_type): New function to do an xref without - always having to figure out code_type_node. - * cp-tree.h: Declare it. - * pt.c (instantiate_class_template): Use it for friend classes. - (lookup_template_class): Use it. - - * typeck2.c (build_functional_cast): Pull out a single parm before - passing it to build_c_cast. - -Tue Mar 19 09:07:15 1996 Bob Manson - - * expr.c (do_case): Give an error message if a pointer is - given as a case value. - -Mon Mar 18 21:57:54 1996 Jason Merrill - - * typeck.c (build_c_cast): Don't pull single TEMPLATE_DECL out of - an overload list. - - * lex.c (cons_up_default_function): Really, now, interface hackery - does not apply to synthesized methods. - -Mon Mar 18 18:20:57 1996 Mike Stump - - * call.c (build_method_call): Ctors and dtors now have special names - with respect to lookups. - * class.c (add_method): Likewise. - (grow_method): Likewise. - (finish_struct_methods): Likewise. - (warn_hidden): Likewise. - (finish_struct_1): Likewise. - * cvt.c (convert_to_reference): Likewise. - (convert_to_aggr): Likewise. - (cp_convert): Likewise. - * decl2.c (check_classfn): Likewise. - * init.c (expand_member_init): Likewise. - (expand_default_init): Likewise. - (expand_aggr_init_1): Likewise. - (build_offset_ref): Likewise. - (build_new): Likewise. - (build_delete): Likewise. - * lex.c (do_inline_function_hair): Likewise. - * search.c (lookup_field_1): Likewise. - (lookup_fnfields_here): Likewise. - (lookup_field): Likewise. - (lookup_fnfields): Likewise. - (get_virtual_destructor): Likewise. - (dfs_debug_mark): Likewise. - (dfs_pushdecls): Likewise. - (dfs_compress_decls): Likewise. - * tree.c (layout_basetypes): Likewise. - * typeck.c (build_component_ref): Likewise. - (build_x_function_call): Likewise. - (build_modify_expr): Likewise. - (convert_for_initialization): Likewise. - (build_functional_cast): Likewise. - * cp-tree.h (CLASSTYPE_FIRST_CONVERSION): Likewise. - (CTOR_NAME): New. - (DTOR_NAME): New. - * decl.c (ctor_identifier): New. - (dtor_identifier): New. - (init_decl_processing): Set them. - -Mon Mar 18 18:00:51 1996 Mike Stump - - * typeck.c (build_component_ref): Don't get confused by fields whose - context has no type name, like pointer to member functions. - -Mon Mar 18 13:19:03 1996 Jason Merrill - - * decl.c (grokdeclarator): Handle typedef without declarator. - - * pt.c (tsubst): Handle SCOPE_REF in declarator. - - * parse.y (bad_parm): Catch another case of missing `typename'. - - * lex.c (yyprint): Handle TYPE_DECLs. - - * decl.c (start_function): Don't try to be clever. - - * lex.c: Lose compiler_error_with_decl. - * typeck2.c: Lose error_with_aggr_type. - (incomplete_type_error): Use cp_* instead of old functions. - (readonly_error): Likewise. - * typeck.c (convert_arguments): Likewise. - * search.c (lookup_nested_field): Likewise. - * method.c (make_thunk): Likewise. - * decl.c (grokparms): Likewise. - * cp-tree.h: Update. - - * tree.c (min_tree_cons): Call copy_to_permanent for the purpose - and value. - -Mon Mar 18 11:25:52 1996 Bob Manson - - * method.c (build_opfncall): When deleting a pointer to an - array, build a new pointer to the tree past any ARRAY_TYPE - nodes. - -Mon Mar 18 10:11:46 1996 Brendan Kehoe - - * decl.c (lookup_name_real): Initialize local var TYPE to NULL_TREE. - -Fri Mar 15 11:03:57 1996 Jason Merrill - - * pt.c (instantiate_decl): Only call import_export_decl if at_eof - and ! DECL_INLINE. - - * decl.c (finish_function): Don't set nested based on - hack_decl_function_context. - * parse.y (function_try_block): Check for nested function. - (pending_inlines): Likewise. - - * decl2.c (build_expr_from_tree): If a unary op already has a - type, just return it. - - * decl2.c (finish_prevtable_vardecl): Use ADJUST_VTABLE_LINKAGE. - - * decl2.c (walk_vtables): vardecl_fn returns int; return 1 if it does. - (finish_file): Check the return value of walk_vtables. - (finish_prevtable_vardecl): Return int. - (finish_vtable_vardecl): Likewise. - (prune_vtable_vardecl): Likewise. - * lex.c (set_vardecl_interface_info): Likewise. - * cp-tree.h: Adjust return types. - - * class.c (delete_duplicate_fields_1): Don't complain about - duplicate nested types if they're the same type. - (finish_struct): Remove check for duplicate. - * decl2.c (grokfield): Don't check for typedef of anonymous type. - -Thu Mar 14 10:00:19 1996 Jason Merrill - - * cp-tree.h: Lose SIGNATURE_GROKKING_TYPEDEF. - - * decl.c (grokdeclarator): Lose special handling of class-level - typedef. Lose SIGNATURE_GROKKING_TYPEDEF. Set - SIGNATURE_HAS_OPAQUE_TYPEDECLS later. - - * cvt.c (convert_pointer_to_real): Retain cv-quals in conversion. - - * pt.c (tsubst_copy): Strip cv-quals from destructor name types. - - * search.c (compute_access): Fix handling of anonymous union - members. - * class.c (finish_struct_anon): Propagate TREE_{PRIVATE,PROTECTED} - from anonymous unions to their members. - - * typeck.c (build_x_function_call): For static member functions, - hand off to build_member_call. - -Wed Mar 13 14:03:34 1996 Jason Merrill - - * typeck.c (build_component_ref): Handle OFFSET_REFs. - - * init.c (expand_vec_init): Fix init == 0 case. - -Tue Mar 12 14:36:02 1996 Jason Merrill - - * init.c (build_new): Pedwarn about init and array new. - (expand_vec_init): Handle lists, use convert_for_initialization. - - * typeck.c (convert_for_initialization): Pass LOOKUP_NO_CONVERSION - when converting to an aggregate type. - * cvt.c (cp_convert): Pass it through. - - * typeck.c (build_conditional_expr): Handle user-defined - conversions to slightly different types. - - * decl.c (grokdeclarator): Force an array type in a parm to be - permanent. - - * decl2.c (do_using_directive): Sorry. - (do_namespace_alias): Likewise. - * lex.c (real_yylex): Warn about using the `namespace' keyword. - -Sun Mar 10 22:26:09 1996 Jason Merrill - - * parse.y (datadef): Move call to note_list_got_semicolon up. - -Fri Mar 8 11:47:26 1996 Mike Stump - - * tree.c (unsave_expr): Don't unsave, UNSAVE_EXPRs. - -Fri Mar 8 11:29:06 1996 Mike Stump - - * decl.c (cp_finish_decl): The exception regions have to be - nested, not overlapping. We start the exception region for a - decl, after it has been fully built, and all temporaries for it - have been cleaned up. - -Thu Mar 7 17:46:06 1996 Mike Stump - - * tree.c (vec_binfo_member): Don't core dump if we have no bases. - -Thu Mar 7 14:11:49 1996 Jason Merrill - - * tree.def: Add RETURN_INIT. - * pt.c (instantiate_decl): Handle RETURN_INIT. - * decl.c (store_return_init): Handle minimal_parse_mode. - - * tree.c (cp_build_type_variant): Just return an error_mark_node. - * decl.c (make_typename_type): Don't try to get the file and line - of an identifier. - * typeck.c (comptypes): Handle TYPENAME_TYPE. - -Wed Mar 6 18:47:50 1996 Per Bothner - - * decl.c (poplevel): Make sure we clear out and restore old local - non-VAR_DECL values by default when they go out of scope. - -Wed Mar 6 09:57:36 1996 Jason Merrill - - * method.c (build_overload_value): Use DECL_ASSEMBLER_NAME in - referring to addresses of variables and functions. - - * error.c (dump_expr): Support SIZEOF_EXPR. - - * init.c (do_friend): Use the return value of check_classfn. - - * typeck.c (convert_arguments): Call complete_type. - - * method.c (hack_identifier): After giving an error, set value to - error_mark_node. - -Tue Mar 5 16:00:15 1996 Jason Merrill - - * tree.c (hack_decl_function_context): Kludge around DECL_CONTEXT - lossage for local classes. - * cp-tree.h: Declare it. - * decl.c (lookup_name_real): Evil, painful hack for local classes. - (grokfndecl): Set DECL_CLASS_CONTEXT and DECL_NO_STATIC_CHAIN here. - Use hack_decl_function_context. - (grokdeclarator): Don't set DECL_NO_STATIC_CHAIN here. - (start_function): Use hack_decl_function_context. - (finish_function): Likewise. - * method.c (synthesize_method): Likewise. - * lex.c (process_next_inline): Likewise. - (do_pending_inlines): Likewise. - * decl2.c (finish_file): Unset DECL_STATIC_FUNCTION_P when we're - done with it. - -Mon Mar 4 22:38:39 1996 Gerald Baumgartner - - * sig.c (build_signature_pointer_or_reference_type): Align - signature pointers/references on 8-byte boundaries so they can be - grabbed 2 words at a time on a Sparc. - -Tue Mar 5 10:21:01 1996 Jason Merrill - - * method.c (hack_identifier): Requiring a static chain is now a - hard error. - * decl.c (grokdeclarator): Set DECL_NO_STATIC_CHAIN on nested - functions. - -Mon Mar 4 20:03:33 1996 Jason Merrill - - * init.c (build_offset_ref): Call complete_type. - - * decl.c (pop_from_top_level): Always pop previous_class_type. - - * parse.y: Handle multiple decls in a for-init-statement. - * pt.c (tsubst_expr): Likewise. - - * pt.c (tsubst): Use tsubst_expr for the second operand of an - ARRAY_REF. - - * decl.c (maybe_push_to_top_level): Don't save previous_class_type. - (poplevel_class): Set it here. - (pop_from_top_level): Pop it here if we're returning to class scope. - * class.c (pushclass): Don't set it here. - - * decl.c (maybe_push_to_top_level): Save current_template_parms, - and clear it if !pseudo. - (pop_from_top_level): Restore it. - - * decl2.c (finish_file): Push the dummy each time we walk the list - of vtables. - - * error.c (dump_expr): Support LOOKUP_EXPR and actually do - something for CAST_EXPR. - -Mon Feb 19 14:49:18 1996 Rusty Russell - - * cvt.c (cp_convert): Warn about implicit conversion of the - address of a function to bool, as it is always true. - -Fri Feb 23 23:06:01 1996 Rusty Russell - - * typeck.c (c_expand_return): Fix warning for local externs returned. - -Mon Mar 4 15:03:11 1996 Jason Merrill - - * tree.c (mapcar): Propagate const and volatile properly. - - * typeck.c (complete_type): Be sure to instantiate the - MAIN_VARIANT of the type. - - * method.c (synthesize_method): Class interface hackery does not - apply to synthesized methods. - -Mon Mar 4 14:05:23 1996 Jason Merrill - - * pt.c (comp_template_args): Use comptypes rather than just - checking for TEMPLATE_TYPE_PARM equivalence. - - * typeck.c (build_x_function_call): Call complete_type before - checking TYPE_OVERLOADS_CALL_EXPR. - -Mon Mar 4 18:48:30 1996 Manfred Hollstein - - * g++.c (main): Check also for new define ALT_LIBM. - -Fri Mar 1 13:09:33 1996 Jason Merrill - - * pt.c (instantiate_class_template): If we don't have a pattern - yet, that's OK. - (coerce_template_parms): If we see a local class, bail. - - * decl.c (grok_reference_init): Make sure there's a type before - checking its code. - - * pt.c (do_function_instantiation): Avoid crashing on invalid decls. - (push_template_decl): Likewise. - - * parse.y (named_class_head): Set - CLASSTYPE_TEMPLATE_SPECIALIZATION here if we have basetypes. - - * decl.c (xref_tag): Diagnose redeclaration of template - type-parameter name. - - * error.c (dump_type): Handle anonymous template type parms. - - * pt.c (instantiate_template): Use TYPE_MAIN_DECL instead of - TYPE_STUB_DECL. - (coerce_template_parms): Likewise. - -Thu Feb 29 16:26:01 1996 Mike Stump - - * class.c (instantiate_type, case {ARRAY,INDIRECT}_REF, - case ADDR_EXPR): Don't modify rhs if a subinstantiation fails. - -Thu Feb 29 08:20:25 1996 Jason Merrill - - * pt.c (instantiate_template): Take the MAIN_VARIANT of the type - before trying to get its STUB_DECL. - (coerce_template_parms): Likewise. - - * parse.y (template_type_parm): If they didn't use 'class', - pretend they did after giving an error. - - * pt.c (coerce_template_parms): Diagnose use of local class. - - * decl.c (grok_reference_init): Use instantiate_type. - - * error.c (dump_expr): Handle TEMPLATE_DECLs. - - * parse.y (named_class_head): Diagnose mismatching types and tags. - - * decl.c (pushdecl): Type decls and class templates clash with - artificial type decls, not hide them. - - * decl.c (redeclaration_error_message): Diagnose redefinition of - templates properly. - (duplicate_decls): Diagnose disallowed overloads for template - functions, too. - - * decl.c (start_decl): Call complete_type before checking for a - destructor. - - * pt.c (tsubst): Use tsubst_expr on the elts of a VEC. - - * decl.c (xref_tag): A TEMPLATE_TYPE_PARM is a match. - -Wed Feb 28 09:28:44 1996 Jason Merrill - - * decl.c (grok_op_properties): Don't check for operator++(int) in - a template. - - * tree.c (perm_manip): Return a copy of variable and function - decls with external linkage. - - * tree.def: Change some of the min tree codes to type "1". - * pt.c (uses_template_parms): Handle 'e's, return 1 for LOOKUP_EXPRs. - * method.c (build_overload_int): Emit something arbitrary for - anything but an INTEGER_CST if we're in a template. - - * decl.c (cp_finish_decl): Call complete_type before deciding - whether or not to lay out the decl. - - * lex.c (do_identifier): Check for DECL_INITIAL before using it. - -Tue Feb 27 16:35:32 1996 Jason Merrill - - * typeck2.c (build_x_arrow): Call complete_type. - - * pt.c (add_pending_template): Broken out. - (lookup_template_class): If -fexternal-templates, call it for all - the methods of implemented types. - (instantiate_class_template): Instead of instantiating them here. - (instantiate_decl): Handle -fexternal-templates earlier. - -Tue Feb 27 15:51:32 1996 Brendan Kehoe - - * search.c, lex.c, decl.c, class.c, cp-tree.h: Don't wrap the - memoized lookup stuff inside GATHER_STATISTICS. - -Tue Feb 27 10:38:08 1996 Jason Merrill - - * decl.c (start_decl): Complain about array of incomplete type - here. - (grokdeclarator): Not here. - - * parse.y (template_parm): Expand full_parm inline so we can set - the rule's precedence. - - * pt.c (tsubst_expr): If we're in a template, just do tsubst_copy. - (tsubst): tsubst_expr the DECL_INITIAL of FIELD_DECLs. - * decl2.c (grokbitfield): Don't check for integer constant here. - * class.c (finish_struct_1): Check here. - - * decl.c (define_label): Make the min decl go on permanent_obstack. - - * pt.c (unify): Don't handle CONST_DECLs. - (uses_template_parms): Don't check DECL_INITIAL on a CONST_DECL. - (tsubst_copy): Likewise. - - * lex.c (do_identifier): Do pull the DECL_INITIAL out of a - CONST_DECL for a template parm. - -Mon Feb 26 12:48:18 1996 Jason Merrill - - * decl.c (grokdeclarator): Complain about array of incomplete type - here. - (start_decl_1): Not here. - - * pt.c (tsubst): Handle pointer-to-function declarators. - - * method.c (hack_identifier): If pedantic, diagnose local class - methods that require a static chain. - - * decl.c (grok_op_properties): No longer static. - * cp-tree.h: Declare it. - * pt.c (tsubst): Call it for operators. - Use tsubst_copy for TREE_VECs. - - * parse.y (template_arg): The expr has precedence like '>'. - -Fri Feb 23 14:51:52 1996 Jason Merrill - - * pt.c (coerce_template_parms): Don't coerce an expression using - template parms. - (uses_template_parms): Also check DECL_INITIAL in CONST_DECLs. - (tsubst): Don't use build_index_2_type if the max_value uses template - parms. - * method.c (build_overload_int): Emit something arbitrary for an - expression using template parms. - - * parse.y (template_close_bracket): New non-terminal to catch use - of '>>' instead of '> >' in template class names. - (template_type): Use it. - * Makefile.in (CONFLICTS): Causes one more r/r conflict. - - * tree.def: Add CAST_EXPR. - * typeck2.c (build_functional_cast): Use CAST_EXPR instead of - CONVERT_EXPR for minimal_parse_mode. - * typeck.c (build_c_cast): Likewise. - * pt.c (tsubst_copy): Likewise. - * decl2.c (build_expr_from_tree): Likewise. - * error.c (dump_expr): Likewise. - -Fri Feb 23 10:36:46 1996 Brendan Kehoe - - * except.c (SetTerminate, SetUnexpected): Put back global vars. - (init_exception_processing): Put back decl/init of - set_unexpected_fndecl and set_terminate_fndecl, needed to get the - fns from libstdc++. - - * decl.c (struct binding_level): Delete ACCEPT_ANY bitfield. - (declare_uninstantiated_type_level, uninstantiated_type_level_p): - Delete unused fns. - * cp-tree.h (declare_uninstantiated_type_level, - uninstantiated_type_level_p): Delete prototypes. - -Thu Feb 22 19:36:15 1996 Jason Merrill - - * pt.c (tsubst_expr): Add default return. - -Thu Feb 22 16:47:24 1996 Brendan Kehoe - - * error.c (fndecl_as_string): Delete unused arg CNAME. - * sig.c (build_signature_table_constructor, - build_signature_method_call): Fix calls. - - * class.c (the_null_vtable_entry): Delete var definition. - (init_class_processing): Delete tree the_null_vtable_entry init. - * decl.c (no_print_{functions, builtins}): Declare as static. - (__tp_desc_type_node): #if 0 var definition. - (init_type_desc): #if 0 init of __tp_desc_type_node. - (vb_off_identifier): Move var decl into init_decl_processing. - (current_function_assigns_this): Declare as static. - (int_ftype_ptr_ptr_int, void_ftype_ptr_int_int): Delete var decls. - (init_decl_processing): Delete init of void_ftype_ptr_ptr_int. - Move decls of string_ftype_ptr_ptr and int_ftype_string_string here. - * decl2.c (delete_sanity): Delete definition/mod of local var ELT_SIZE. - * init.c (BI_header_type, BI_header_size): Declare as static. - * pt.c (template_classes): Delete unused var. - (add_pending_template): Delete decl for non-existent fn. - (lookup_template_class): Delete vars CODE and TAG_CODE. - (instantiate_template): Delete unused var TARGS. - * cp-tree.h (vb_off_identifier, current_function_assigns_this): - Delete decls. - (__tp_desc_type_node): #if 0 var decl. - (fndecl_as_string): Fix prototype. - -Thu Feb 22 15:56:19 1996 Jason Merrill - - * tree.def: Add GOTO_STMT. - * pt.c (tsubst_expr): Support goto and labels. - * decl.c (define_label): Support minimal parsing. - * parse.y (simple_stmt): Likewise. - -Thu Feb 22 15:30:12 1996 Brendan Kehoe - - * xref.c (GNU_xref_member): Only define/set var I if - XREF_SHORT_MEMBER_NAMES is defined, to match when it's actually - used. - (GNU_xref_end_scope): Delete unused fifth arg TRNS. - (GNU_xref_end): Fix call. - * decl.c (poplevel, poplevel_class, finish_method): Fix calls. - * cp-tree.h (GNU_xref_end_scope): Fix prototype. - - * tree.c (build_exception_variant): Delete unused vars I, A, T, - T2, and CNAME. - (layout_vbasetypes): Delete unused var NONVIRTUAL_VAR_SIZE. - (mapcar): Delete unused var CODE. - (build_cplus_new): Delete unused arg WITH_CLEANUP_P. - (break_out_cleanups): Fix call. - (bot_manip): Likewise. - * call.c (build_method_call): Likewise. - * cvt.c (build_up_reference, convert_to_reference, cp_convert): - Likewise. - * typeck.c (unary_complex_lvalue, build_modify_expr, - convert_for_initialization): Likewise. - * typeck2.c (build_functional_cast): Likewise. - * cp-tree.h (build_cplus_new): Fix prototype. - - * repo.c (open_repo_file): Delete unused var Q. - (repo_compile_flags, repo_template_declared, - repo_template_defined, repo_class_defined, repo_inline_used, - repo_vtable_used, repo_tinfo_used): #if 0 unused fns. - (repo_get_id, repo_vtable_used): Declare as static. - * cp-tree.h (mark_{decl,class}_instantiated, finish_repo): Add - prototypes. - -Thu Feb 22 14:53:35 1996 Jason Merrill - - * parse.y (pending_inlines): Add function_try_block case. - - * pt.c (unify): Fix for template const parms. - -Thu Feb 22 13:24:15 1996 Brendan Kehoe - - * lex.c (extract_interface_info): Delete forward decl. - (default_copy_constructor_body, default_assign_ref_body): Delete - decls for non-existent functions. - (synth_firstobj, inline_text_firstobjs): Delete unused vars. - (init_lex): Delete setting them. - (cons_up_default_function): Delete unused vars FUNC_BUF, - FUNC_LEN, and COMPLEX. Delete code setting COMPLEX. Delete old - #if 0'd synth code. - (toplevel, expression_obstack): Delete unused extern decls. - (tree_node_kind): Delete unused enum. - (tree_node_counts, tree_node_sizes): Wrap with #ifdef - GATHER_STATISTICS. - (tree_node_kind_names): Delete unused extern decl. - (synth_obstack): Delete unused var. - (init_lex): Don't set it. - (init_parse): Add decl before use. - (reduce_count): Only define #ifdef GATHER_STATISTICS && REDUCE_LENGTH. - (current_unit_{name, language}): Delete unused vars. - (check_newline): Don't bother setting them, just accept the #pragma. - * cp-tree.h (init_repo, peek_yylex): Add prototypes. - (current_unit_{name, language}): Delete decls. - - * search.c: Wrap all of the memoized functions, macros, and - variables inside #ifdef GATHER_STATISTICS. - (lookup_field, lookup_fnfields): Likewise. - (init_search_processing): Likewise. - (reinit_search_statistics): Wrap whole function. - * lex.c (reinit_lang_specific): Wrap call to reinit_search_statistics. - - * decl.c (finish_function): Only call pop_memoized_context if - GATHER_STATISTICS is defined. - (start_function): Likewise for push_memoized_context. - * class.c (pushclass, popclass): Likewise. - - * cp-tree.h (CLASSTYPE_MTABLE_ENTRY): Move definition from here... - * search.c (CLASSTYPE_MTABLE_ENTRY): ... to here. - - * cvt.c (cp_convert): Delete unused local var FORM. - * cp-tree.h (can_convert, can_convert_arg, real_lvalue_p): Add - prototypes. - -Thu Feb 22 13:19:44 1996 Jason Merrill - - * pt.c (do_poplevel): Oops; really return what we get from - poplevel this time. - -Thu Feb 22 11:41:44 1996 Brendan Kehoe - - * cp-tree.h (is_aggr_type): Add prototype. - - * cp-tree.h ({push,pop}_cp_function_context): Add decls. - * method.c ({push,pop}_cp_function_context): Delete decls. - * except.c (start_eh_unwinder, end_eh_unwinder): Declare as void. - (SetUnexpected, SetTerminate): Delete unused vars. - (init_exception_processing): Don't set SetUnexpected or - SetTerminate. Don't set SET_UNEXPECTED_FNDECL or SET_TERMINATE_FNDECL. - (output_exception_table_entry): Delete unused array LABEL. - (expand_internal_throw): Delete unused var PARAMS. - (expand_start_catch_block): Delete unused var CLEANUP. - (emit_exception_table): Delete unused var EH_NODE_DECL. - (expand_builtin_throw): Delete unused vars UNWIND_AND_THROW and - GOTO_UNWIND_AND_THROW. Don't set them. - (end_eh_unwinder): Add top decl. - (pop_rtl_from_perm): Delete unused decl of PERMANENT_OBSTACK. - (exception_section, push_rtl_perm, do_function_call, - lang_interim_eh, push_eh_cleanup, eh_outer_context, - expand_end_eh_spec, end_eh_unwinder): Declare as static. - (saved_pc, saved_throw_type, saved_throw_value, saved_cleanup, - throw_used): Likewise. - * cp-tree.h (expand_end_eh_spec): Delete prototype. - - * search.c (dfs_mark, dfs_mark_vtable_path, - dfs_unmark_vtable_path, dfs_mark_new_vtable, - dfs_unmark_new_vtable, dfs_clear_search_slot, - dfs_search_slot_nonempty_p, bfs_markedp, bfs_unmarkedp, - bfs_marked_vtable_pathp, bfs_unmarked_vtable_pathp, - bfs_marked_new_vtablep, bfs_unmarked_new_vtablep): #if 0 unused - functions. - (n_fields_searched, n_calls_lookup_field, n_calls_lookup_field_1, - n_calls_lookup_fnfields, n_calls_lookup_fnfields_1, - n_calls_get_base_type, n_outer_fields_searched, n_contexts_saved): - Only define #ifdef GATHER_STATISTICS. - (reinit_search_statistics): Only init some vars if GATHER_STATISTICS - is defined. - (vbase_decl): Delete var definition. - (init_search): Delete old decl. - (init_vbase_pointers): Delete building of VBASE_DECL, since it's - never actually used. - (expand_indirect_vtbls_init): Delete init of VBASE_DECL. - (get_base_distance_recursive): Delete unused fourth arg - BASETYPE_PATH. Fix call . - (get_base_distance): Fix call. - (push_class_decls): Delete unused var ID. - (make_memoized_table_entry): Declare as static. - (breadth_first_search): Declare as static. - (tree_has_any_destructor_p): Declare as static. - (pop_class_decls): Delete unused arg pop_class_decls. - * class.c (popclass): Fix call to pop_class_decls. - * cp-tree.h (make_memoized_table_entry, breadth_first_search, - tree_has_any_destructor_p): Delete prototypes. - - * rtti.c (build_ptmf_desc): Delete unused arg TYPE. - (build_t_desc): Fix call. Delete unused vars ELEMS and TT. - (build_dynamic_cast): Delete unused local vars TMP1 and RETVAL. - (build_user_desc): Delete unused var T. - (build_class_desc): Delete unused vars T and OFF. - (build_t_desc): Delete unused var NAME_STRING. - (build_headof): Make static. - (get_bad_cast_node): Likewise. - (get_def_to_follow): Likewise. - * cp-tree.h (init_type_desc): Add prototype. - (build_headof): Remove prototype. - -Thu Feb 22 00:54:22 1996 Jason Merrill - - * pt.c (tsubst): Only look for matching decls at file scope for - non-member functions. - - * call.c (build_scoped_method_call): Handle scoped destructor - calls in templates. - - * decl.c (*_top_level): Also save previous_class_values. - - * pt.c (tsubst_expr): Support do {} while loops. - * parse.y (simple_stmt): Likewise. - * tree.def: Likewise. - - * method.c (build_overload_identifier): For a class nested in a - template class, don't mangle in the template parms from our - context. - - * lex.c, cp-tree.h: Remove support for template instantiations in - the pending_inlines code. - * pt.c: Remove dead functions and unused arguments. - (uses_template_parms): TYPENAME_TYPEs always use template parms. - * parse.y: Stop passing anything to end_template_decl. - * tree.c (print_lang_statistics): Only print tinst info #ifdef - GATHER_STATISTICS. - -Wed Feb 21 16:57:33 1996 Brendan Kehoe - - * init.c (expand_recursive_init{,_1}): Delete decls. - (sort_member_init): Delete unused var INIT. - (emit_base_init): Delete unused var X. - (build_offset_ref): Delete unused var CNAME. - (sort_member_init): Delete unused var FIELDS_TO_UNMARK. - (emit_base_init): Delete unused local var BASE. Delete extern - decl of IN_CHARGE_IDENTIFIER. - (build_delete): Delete unused local var VIRTUAL_SIZE. - - * init.c (build_vec_delete): Delete unused third arg ELT_SIZE. - (build_delete): Fix call. - * decl2.c (delete_sanity): Likewise. - * cp-tree.h (build_vec_delete): Update prototype. - - * typeck.c (common_base_type): Delete unused var TMP. - (build_binary_op): Delete local var ARGS_SAVE. - (build_array_ref): Delete unused var ITYPE. - (c_expand_return): Delete unused var USE_TEMP. - - * typeck.c (compexcepttypes): Delete unused arg STRICT. - (comptypes): Fix calls. - * decl.c (duplicate_decls): Likewise. - * cp-tree.h (compexcepttypes): Delete extra arg. - - * decl2.c (check_classfn): Delete unused second arg CNAME. - * decl.c (start_decl, grokfndecl): Fix calls. - * init.c (do_friend): Likewise. - * cp-tree.h (check_classfn): Update prototype. - - * cp-tree.h (signature_error, import_export_vtable, - append_signature_fields, id_in_current_class, mark_used, - copy_assignment_arg_p): Add decls. - * decl2.c (mark_used): Delete decl. - - * class.c (n_*): Wrap with #ifdef GATHER_STATISTICS. - - * class.c (get_vtable_entry): Diable unused function. - (doing_hard_virtuals): Delete unused static global var. - (finish_struct_1): Don't init DOING_HARD_VIRTUALS. - (prepare_fresh_vtable): Delete unused vars PATH and RESULT. - (overrides): Delete unused vars RETTYPE and BASE_RETTYPE. - (modify_one_vtable): Delete unused var OLD_RTTI. - (finish_struct_anon): Delete unused vars OFFSET and X. - (finish_struct_bits): Delete unused var METHOD_VEC. - (get_basefndecls): Delete unused var PURPOSE. Delete unused - for-scope local variable METHODS. - - * call.c (user_harshness): Delete unused/unneeded arg PARM. - (ideal_candidate): Delete unused args BASETYPE and PARMS. - (build_method_call): Delete unused args passed into ideal_candidate. - (build_overload_call_real): Likewise. Delete unused var OVERLOAD_NAME. - * cp-tree.h (synthesize_method): Add decl. - - * decl.c (note_level_for_for): Give void return type. - (pushdecl_nonclass_level): Likewise. - (finish_function): Delete unused vars VFIELDS and ALLOCATED_THIS. - (poplevel): Delete unused var IMPLICIT_TRY_BLOCK. - (suspend_binding_level): Delete unused var LEVEL. - (duplicate_decls): Delete unused var CTYPE. - (duplicate_decls): Delete unused var PREVIOUS_C_DECL. - (init_decl_processing): Delete unused vars FLOAT_ENDLINK and - PTR_ENDLINK. - (grokdeclarator): Delete unused var C. - (grokdeclarator): Delete unused var SIZE_VARIES. - (grokparms): Delete unused var SAW_VOID. - (start_function): Delete unused var OLDDECL. - (cplus_expand_expr_stmt): Delete unused var - REMOVE_IMPLICIT_IMMEDIATELY. - - * cp-tree.h (pushdecl_nonclass_level): Fix prototype. - - * Makefile.in (CONFLICTS): Update to 12 shift/reduce. - -Wed Feb 21 00:06:17 1996 Jason Merrill - - * tree.c (build_min): Set TREE_COMPLEXITY to lineno. - (build_min_nt): Likewise. - * pt.c (do_pushlevel): Emit line note. - (do_poplevel): Return what we get from poplevel. - (tsubst_expr): Set lineno from TREE_COMPLEXITY in stmt nodes. - * parse.y: Use do_pushlevel and do_poplevel. - * cp-tree.h: Declare do_poplevel. - - * cp-tree.h: Declare at_eof. - * decl.c (cp_finish_decl): Pass it to rest_of_decl_compilation. - * decl2.c (import_export_decl): Renamed from import_export_inline. - (finish_file): Call it to do interface handling for statics. - * pt.c (tsubst_copy): Call mark_used on variables and functions - used here. - - * decl2.c (finish_file): Don't emit statics we can't generate. - * pt.c (instantiate_decl): Don't set interface on instantiations - we can't generate. - - * cp-tree.h (struct tinst_level): Change 'classname' to 'decl'. - * tree.c (print_lang_statistics): Print max template depth. - * pt.c (push_tinst_level): Dump entire instantiation context. - (instantiate_class_template): Use it and pop_tinst_level. - (instantiate_decl): Likewise. - - * call.c class.c cp-tree.h decl.c decl2.c error.c lex.c method.c - pt.c ptree.c tree.def: Remove all traces of UNINSTANTIATED_P_TYPE. - -Tue Feb 20 18:21:51 1996 Jason Merrill - - * call.c class.c cp-tree.h cvt.c decl.c decl2.c error.c expr.c - init.c lex.c method.c parse.y pt.c repo.c search.c spew.c tree.c - tree.def typeck.c typeck2.c xref.c: Massive, systemic changes for - the new template implementation. - -Tue Feb 20 17:14:29 1996 Brendan Kehoe - - * decl2.c (check_cp_case_value): Use STRIP_TYPE_NOPS. - -Thu Feb 15 18:44:42 1996 Mike Stump - - * decl.c (cp_finish_decl): Delay emitting the debug information for - a typedef that has been installed as the canonical typedef, if the - type has not yet been defined. - -Thu Feb 15 09:39:08 1996 Jason Merrill - - * decl2.c (grokfield): Still call pop_nested_class for access decls. - -Wed Feb 14 17:30:04 1996 Brendan Kehoe - - * decl.c (lookup_label): Call label_rtx. - - * decl.c (make_binding_level): New function. - (pushlevel, pushlevel_class): Call it instead of explicit - duplicate calls to xmalloc. - - * decl.c (init_decl_processing): Delete useless build_pointer_type - call. - - * decl.c (float_ftype_float, ldouble_ftype_ldouble): Add definitions. - (sizet_ftype_string): Delete variable. - (init_decl_processing): Add built-in functions fabsf, fabsl, - sqrtf, sqrtl, sinf, sin, sinl, cosf, cos, cosl. New local - variable strlen_ftype, used for strlen. - -Wed Feb 14 16:21:25 1996 Jason Merrill - - * decl.c (push_to_top_level): Start from current_binding_level - again for now; the stl hacks depend on g++ being broken in this - way, and it'll be fixed in the template rewrite. - - * tree.def: Add USING_DECL. - * decl2.c (do_class_using_decl): Implement. - (grokfield): Pass access decls off to do_class_using_decl instead of - grokdeclarator. - * error.c (dump_decl): Handle USING_DECLs. - * decl.c (grokdeclarator): Remove code for handling access decls. - * class.c (finish_struct_1): Adjust accordingly, treat using-decls - as access decls for now. - (finish_struct): Don't check USING_DECLs for other uses of the name. - - * search.c (get_matching_virtual): Use cp_error_at. - -Wed Feb 14 10:36:58 1996 Brendan Kehoe - - * typeck.c (comptypes): Default COMP_TYPE_ATTRIBUTES to 1, to - match c-typeck.c. - (self_promoting_args_p): Move the check that TYPE is non-nil - before trying to look at its main variant. - (unsigned_type, signed_type): Add checking of DI/SI/HI/QI nodes. - - * cp-tree.h (DECL_WAITING_FRIENDS, SET_DECL_WAITING_FRIENDS): - Delete macros. - * init.c (xref_friend, embrace_waiting_friends): Delete functions. - (do_friend): Delete call to xref_friend. - * class.c (finish_struct_1): Delete call to embrace_waiting_friends. - - * typeck.c (convert_sequence): #if 0 unused function. - - * cp-tree.h (DECL_IN_MEMORY_P): New macro w/ the check that used to - be in decl_in_memory_p. - (decl_in_memory_p): Delete decl. - * expr.c (decl_in_memory_p): Delete fn. - * typeck.c (mark_addressable): Use DECL_IN_MEMORY_P. - - * decl.c (cp_finish_decl): Use DECL_IN_MEMORY_P. - -Tue Feb 13 12:51:21 1996 Jason Merrill - - * class.c (finish_struct_1): Check for a pure-specifier on a - non-virtual function here. - - * decl2.c (grok_function_init): Don't check whether the function - is virtual here. - (grokfield): Don't call check_for_override here. - - * decl.c (push_to_top_level): Start from inner_binding_level, - check class_shadowed in class levels. - -Mon Feb 12 17:46:59 1996 Mike Stump - - * decl.c (resume_level): Ignore things that don't have names, instead - of core dumping. - -Mon Feb 12 15:47:44 1996 Brendan Kehoe - - * decl2.c (grokfield): Set DECL_VINDEX properly for FUNCTION_DECLs. - -Sat Feb 10 17:59:45 1996 Jason Merrill - - * class.c (finish_struct_1): Set DECL_VINDEX properly on a - synthesized dtor. - - * parse.y (complete_type_name): Bind global_scope earlier. - (complex_type_name): Likewise. - (qualified_type_name): Remove. - -Thu Feb 8 15:15:14 1996 Jason Merrill - - * decl.c (grokfndecl): Move code that looks for virtuals in base - classes... - * class.c (check_for_override): ... to a new function. - (finish_struct_1): Call it. - - * cp-tree.h: Declare warn_sign_compare. - - * typeck.c (build_binary_op_nodefault): Check warn_sign_compare - rather than extra_warnings to decide whether to warn about - comparison of signed and unsigned. - - * decl2.c (lang_decode_option): Handle warn_sign_compare. -Wall - implies -Wsign-compare. -Wall doesn't imply -W. - -Wed Feb 7 15:27:57 1996 Mike Stump - - * typeck.c (build_component_ref): Fix to handle anon unions in base - classes as well. - -Wed Feb 7 14:29:12 1996 Brendan Kehoe - - * class.c (resolves_to_fixed_type_p): Delete code dealing with - a WITH_CLEANUP_EXPR, since we don't generate them any more. - * cvt.c (build_up_reference): Likewise. - * decl.c (grok_reference_init): Likewise. - (cp_finish_decl): Likewise. - * error.c (dump_expr): Likewise. - * tree.c (real_lvalue_p): Likewise. - (lvalue_p): Likewise. - (build_cplus_new): Likewise. - (unsave_expr_now): Likewise. - * typeck.c (unary_complex_lvalue, build_modify_expr, - c_expand_return): Likewise. - -Tue Feb 6 13:39:22 1996 Brendan Kehoe - - Make the C++ front-end pay attention to attributes for structures. - * class.c (finish_struct): New argument ATTRIBUTES, passed down into - finish_struct_1. - (finish_struct_1): New argument ATTRIBUTES; call cplus_decl_attributes. - Take out old round_up_size use and setting the DECL_ALIGN possibly - using it. Take out setting of TYPE_ALIGN to round_up_size, which - can override what the attribute set. - * cp-tree.h (finish_struct): Update prototype. - * parse.y (template_instantiate_once): Pass a NULL_TREE for the - attributes to finish_struct. - (structsp): For a CLASS decl, add maybe_attribute to rule and pass that - value down into finish_struct. - * Makefile.in (CONFLICTS): Switch to 7 shift/reduce conflicts. - -Tue Feb 6 13:12:15 1996 Per Bothner - - * decl.c (poplevel): Re-word dead for local handling. - (pushdecl): Remove useless DECL_DEAD_FOR_LOCAL test. - (cp_finish_decl): If is_for_scope, check for duplicates so - we can disable is_for_scope. Otherwise, preserve_temp_slots. - - * lex.c (do_identifier): Use global binding in preference of - dead for local variable. - -Mon Feb 5 17:46:46 1996 Mike Stump - - * init.c (initializing_context): Handle anon union changes, the - context where fields of anon unions can be initialized now has to be - found by walking up the TYPE_CONTEXT chain. - -Fri Feb 2 14:54:04 1996 Doug Evans - - * decl.c (start_decl): #ifdef out code to set DECL_COMMON - if ASM_OUTPUT{,_ALIGNED}_BSS is defined. - (obscure_complex_init): If bss is supported, always set - DECL_INITIAL to error_mark_node. - -Thu Feb 1 16:19:56 1996 Brendan Kehoe - - * init.c (is_friend): Make sure there's a context before we see if - it's an aggr type. - -Thu Feb 1 15:44:53 1996 Mike Stump - - * init.c (is_friend): Classes are not friendly with nested classes. - -Thu Feb 1 15:27:37 1996 Doug Evans - - * lex.c (check_newline): Pass last character read to HANDLE_PRAGMA, - and record its result. - -Thu Feb 1 09:27:01 1996 Mike Stump - - * class.c (finish_struct_anon): Switch around code to not move anon - union elements around, nor mess up their contexts, nor offsets, - instead we now build up the right number of COMPONENT_REFs for all - the anon unions that may be present at build_component_ref time. - * typeck.c (lookup_anon_field): New routine to handle field lookup - on fields without names. We find them, based upon their unique type - instead. - * typeck.c (build_component_ref): Allow FIELD_DECL components. - Handle finding components in anonymous unions, and ensure that a - COMPONENT_REF is built for each level as necessary. - -Tue Jan 30 18:18:23 1996 Mike Stump - - * cvt.c (build_up_reference): Make the INDIRECT_BIND case come after - code that ensures that copy ctors are used if appropriate. - -Tue Jan 30 17:35:14 1996 Brendan Kehoe - - * init.c (build_vec_delete): Only give an error if base isn't an - error_mark_node. - -Mon Jan 29 17:09:06 1996 Mike Stump - - * spew.c (do_aggr): `new struct S;' isn't a forward declaration. - (yylex): If we see `new', keep slurping. - -Thu Jan 25 18:31:36 1996 Mike Stump - - * class.c (finish_struct_1): Move code for handling anon unions... - (finish_struct_anon): to here. Fixup so that we do the offset - calculations right, and so that the fields are physically moved to - the containers's chain. - -Thu Jan 25 18:27:37 1996 Brendan Kehoe - - * decl.c (grokdeclarator): Avoid trying to get an operand off an - identifier node. - -Wed Jan 24 11:25:30 1996 Jim Wilson - - * typeck.c (pointer_int_sum): Use TYPE_PRECISION (sizetype) not - POINTER_SIZE to agree with expr.c. - -Thu Jan 25 13:01:23 1996 Mike Stump - - * search.c (lookup_field): Don't report ambiguities if protect is 0, - instead return NULL_TREE. - -Wed Jan 24 13:01:26 1996 Mike Stump - - * class.c (finish_struct_1): Call warn_hidden if we want warnings - about overloaded virtual functions. - (warn_hidden): New routine to warn of virtual functions that are - hidden by other virtual functions, that are not overridden. - (get_basefndecls): New routine, used by warn_hidden. - (mark_overriders): New routine, used by warn_hidden. - * search.c (get_matching_virtual): Remove old warning that just - isn't very useful. - -Tue Jan 23 12:26:10 1996 Brendan Kehoe - - * decl.c (output_builtin_tdesc_entries): #if 0 the function definition. - - * typeck.c (null_ptr_cst_p): Delete unused fn. - (build_function_call_maybe): Delete unused fn. - - * expr.c (extract_init): #if 0 the code after unconditional return 0 - for now. - - Delete old cadillac code. - * edsel.c: Remove file. - * Make-lang.in (CXX_SRCS): Take edsel.c off the list. - * Makefile.in (CXX_OBJS): Delete edsel.o. - (edsel.o): Delete rule. - * cp-tree.h (flag_cadillac): Delete var decl. - * lang-options.h: Delete "-fcadillac" and "-fno-cadillac". - * decl2.c (flag_cadillac): Delete var definition. - (lang_decode_option): Delete handling of -fcadillac and -fno-cadillac. - (grokfield): Delete code depending on flag_cadillac. - (finish_anon_union): Likewise. - * class.c (finish_struct_1): Likewise. - (pushclass): Likewise. - (popclass): Likewise. - (push_lang_context): Likewise. - (pop_lang_context): Likewise. - * decl.c (init_decl_processing): Likewise. - (start_decl): Likewise. - (cp_finish_decl): Likewise. - (xref_tag): Likewise. - (finish_enum): Likewise. - (start_function): Likewise. - (finish_function): Likewise. - (finish_stmt): Likewise. - * lex.c (lang_init): Likewise. - (check_newline): Likewise. - - * lex.c (do_pending_inlines): Delete synthesized method kludge. - - Delete defunct, ancient garbage collection implementation. - * rtti.c: New file with the RTTI stuff from gc.c. - * gc.c: Removed file (moved the remaining stuff into rtti.c). - * Makefile.in (CXX_OBJS): Replace gc.o with rtti.o. - (rtti.o): New rule, replacing gc.o. - * Make-lang.in (CXX_SRCS): Replace gc.c with rtti.c. - * cp-tree.h: Delete gc-related fn decls. - (DECL_GC_OFFSET): Delete macro. - (flag_gc): Delete extern decl. - * decl.c (current_function_obstack_index): Delete var decl. - (current_function_obstack_usage): Delete var decl. - (start_function): Delete clearing of current_function_obstack_index - and current_function_obstack_usage. - (init_decl_processing): Delete code relying on -fgc. - Delete call to init_gc_processing. - (cp_finish_decl): Delete calls to build_static_gc_entry and - type_needs_gc_entry. Delete gc code setting DECL_GC_OFFSET. - (store_parm_decls): Delete -fgc calls to cp_expand_decl_cleanup - and to expand_expr of a __gc_main call. - (maybe_gc_cleanup): Delete var decl. - (finish_function): Delete call to expand_gc_prologue_and_epilogue. - * decl2.c (flag_gc): Delete var decl. - (lang_f_options): Delete offering of -fgc. - (lang_decode_option): Delete -fgc and -fno-gc handling. - (get_temp_regvar): Delete gc code. - * init.c (build_new): Delete gc code. - * lex.c (init_lex): Delete checking of flag_gc. - - * typeck.c (convert_arguments): Delete gc code. - (build_component_addr): Delete -fgc warning. - (build_modify_expr): Delete gc code. - - * decl2.c (build_push_scope): Delete fn. - * cp-tree.h (build_push_scope): Delete decl. - - * search.c (clear_search_slots): Delete fn. - * cp-tree.h (clear_search_slots): Delete decl. - - * search.c (tree_needs_constructor_p): Delete fn. - * cp-tree.h (tree_needs_constructor_p): Delete decl. - - * tree.c (id_cmp): Delete fn. - - * tree.c (set_fnaddr_from_vtable_entry): Delete fn. - * cp-tree.h (set_fnaddr_from_vtable_entry): Delete decl. - - * tree.c (decl_value_member): Delete fn. - * cp-tree.h (decl_value_member): Delete decl. - - * tree.c (list_hash_lookup_or_cons): Delete fn. - * cp-tree.h (list_hash_lookup_or_cons): Delete decl. - - * method.c (cplus_exception_name): Delete fn. - (EXCEPTION_NAME_{PREFIX, LENGTH}): Delete macros. - - * spew.c (shift_tokens): Delete fn. - -Mon Jan 22 17:49:33 1996 Jason Merrill - - * except.c (init_exception_processing): Pass 1 to needs_pop in calls - to cp_finish_decl. - * parse.y: Likewise. - -Mon Jan 22 17:34:29 1996 Brendan Kehoe - - * tree.c (build_cplus_staticfn_type): Delete function definition; - never used. - * cp-tree.h (build_cplus_staticfn_type): Delete decl. - - * tree.c (virtual_member): Delete function definition; never used. - * cp-tree.h (virtual_member): Delete decl. - -Fri Jan 19 18:03:14 1996 Mike Stump - - * typeck.c (build_component_ref): Handle getting vbase pointers - out of complex multiple inheritance better. - -Fri Jan 19 16:27:40 1996 Mike Stump - - * typeck.c (build_object_ref): Make sure we use the real type, not - any reference type. - -Fri Jan 19 16:01:47 1996 Mike Stump - - * tree.c (build_exception_variant): Don't create new types if we - don't have to, also build new types on the right obstack. - -Fri Jan 19 14:09:44 1996 Jason Merrill - - * decl.c (store_bindings): Split out from push_to_top_level. - (push_to_top_level): Call it for b->type_shadowed on class binding - levels. - -Fri Jan 19 13:53:14 1996 Mike Stump - - * search.c (expand_upcast_fixups): Fix so that offsets stored in - vbase_offsets are always right. Fixes a problem where virtual base - upcasting and downcasting could be wrong during conversions on this - during virtual function dispatch at ctor/dtor time when dynamic - vtable fixups for deltas are needed. This only sounds easier than - it is. :-) - (fixup_virtual_upcast_offsets): Change to reflect new calling - convention for expand_upcast_fixups. - -Fri Jan 19 12:23:08 1996 Brendan Kehoe - - * decl2.c (grokbitfield): Strip the NOPs from WIDTH before we - check that it's usable as the bitfield width. - -Wed Jan 17 21:22:40 1996 Brendan Kehoe - - * decl2.c (grokfield): Call cplus_decl_attributes with the attrlist. - Pass a null tree to grokdeclarator for its ATTRLIST arg, since it's - only ever used for functions in it. - -Wed Jan 17 12:10:38 1996 Jason Merrill - - * parse.y (qualified_type_name): Use the TYPE_DECL, not the type. - (nested_type): Likewise. - (nested_name_specifier): Use lastiddecl. - - * decl.c (grokdeclarator): Adjust accordingly. - * init.c (expand_member_init): Likewise. - * parse.y (base_class): Likewise. - * typeck2.c (build_functional_cast): Likewise. - - * typeck2.c (build_functional_cast): Fill in name after we've - checked for non-aggr type. - -Wed Jan 17 10:18:01 1996 Mike Stump - - * decl2.c (warn_pointer_arith): Default to on. - -Tue Jan 16 12:45:38 1996 Jason Merrill - - * lex.c (is_rid): New function. - * decl.c (grokdeclarator): Diagnose reserved words used as - declarator-ids. - -Tue Jan 16 11:39:40 1996 Jason Merrill - - * tree.c (get_decl_list): Don't lose cv-quals. - - * decl.c (grokdeclarator): Fix SCOPE_REF handling and diagnose - typespecs used as declarator-ids. - -Tue Jan 16 11:09:42 1996 Mike Stump - - * decl.c (poplevel): When poping a level, don't give a warning for - any subblocks that already exist. - -Tue Jan 16 00:25:33 1996 Jason Merrill - - * typeck.c (build_object_ref): Finish what I started. - - * parse.y (qualified_type_name): Don't check TYPE_BUILT_IN. - - * decl2.c (constructor_name_full): Handle TEMPLATE_TYPE_PARMs. - - * decl.c (grokdeclarator): Also accept TEMPLATE_TYPE_PARM as a - scope. - -Mon Jan 15 16:19:32 1996 Jason Merrill - - * decl.c (xref_tag): Handle passing a type in directly. - - * parse.y (qualified_type_name): Pull out the type. - (nested_type): Likewise. - Take types directly instead of as identifiers. - * call.c (build_scoped_method_call): Take types directly instead of - as identifiers. - * decl.c (xref_basetypes): Likewise. - * init.c (expand_member_init): Likewise. - (build_member_call): Likewise. - (build_offset_ref): Likewise. - * typeck2.c (build_scoped_ref): Likewise, remove bogus code. - * method.c (do_build_assign_ref): Likewise. - * decl.c (grokdeclarator): Handle a type appearing as the - declarator-id for constructors. - * method.c (do_build_copy_constructor): current_base_init_list now - uses the types directly, not their names. - * init.c (sort_base_init): Likewise. - (expand_member_init): Likewise. - * init.c (is_aggr_type): New function, like is_aggr_typedef. - -Mon Jan 15 08:45:01 1996 Jeffrey A Law - - * tree.c (layout_basetypes): Call build_lang_field_decl instead - of build_lang_decl if first arg is a FIELD_DECL. - -Thu Jan 11 14:55:07 1996 Brendan Kehoe - - * decl.c (cp_finish_decl): Only clear TREE_USED if DECL_NAME is - non-empty. - * except.c (expand_start_catch_block): Set TREE_USED to avoid - warnings about the catch handler. - -Mon Jan 8 17:35:12 1996 Jason Merrill - - * typeck.c (build_modify_expr): Use a COMPOUND_EXPR instead of - expand_target_expr. - -Thu Jan 4 12:30:32 1996 Brendan Kehoe - - Fix access control to use trees rather than integers. - * class.c (access_{default, public, protected, private, - default_virtual, public_virtual, private_virtual}_node): Add - definitions. - (init_class_processing): Do creation of those nodes. - * cp-tree.h (access_type): Delete enum decl. - (access_{default, public, protected, private, default_virtual, - public_virtual, private_virtual}_node): Add decls. - (compute_access): Change return type. - * search.c (compute_access): Have tree return type, instead of enum. - (lookup_field): Declare THIS_V and NEW_V to be tree nodes. - * lex.c (real_yylex): Use yylval.ttype for giving the value of the - access_* node for each of RID_{PUBLIC, PRIVATE, PROTECTED}. - * parse.y (VISSPEC): Make ttype rather than itype. - (base_class_access_list): Likewise. - * *.[cy]: Change all refs of `access_public' to `access_public_node', - etc. - * call.c (build_method_call): Make ACCESS be a tree. - * class.c (alter_access, finish_struct_1, filter_struct): Likewise. - * cvt.c (convert_to_aggr): Likewise. - * init.c (build_offset_ref, resolve_offset_ref, build_delete): - Likewise. - * method.c (hack_identifier): Likewise. - * typeck.c (build_component_ref_1, build_component_ref): ): Likewise. - -Thu Jan 4 11:02:20 1996 Mike Stump - - * typeck.c (pointer_int_sum, pointer_diff): Make code agree with C - frontend, and make it more consistent with respect to - warn_pointer_arith. - -Tue Jan 2 00:13:38 1996 Rusty Russell - - * decl.c (pushdecl): Check for duplicate parameter names. - -Wed Jan 3 09:25:48 1996 Mike Stump - - * decl.c (expand_static_init): Call assemble_external for atexit. - -Wed Jan 3 07:55:19 1996 Mike Stump - - * except.c (do_unwind): Remove some generated dead code. - (eh_outer_context): New routine, factor out some common code from - expand_builtin_throw and end_eh_unwinder. Add code to do return - address masking for the PA. - (expand_builtin_throw): Use eh_outer_context instead of open coding - it here. - (end_eh_unwinder): Likewise. - -Tue Jan 2 17:00:56 1996 Mike Stump - - * except.c (expand_throw): Call assemble_external for __empty, if we - use it. - -Thu Dec 28 11:13:15 1995 Mike Stump - - * except.c (expand_builtin_throw): Use RETURN_ADDR_OFFSET instead of - NORMAL_RETURN_ADDR_OFFSET. - (end_eh_unwinder): Likewise. - -Wed Dec 27 22:18:16 1995 Mike Stump - - * gc.c (build_dynamic_cast): Make sure we don't cast away const - when dealing with references, and make sure we handle dynamic - casting to a cv qualified reference. - -Thu Dec 21 23:50:35 1995 Mike Stump - - * except.c (struct eh_context): New structure top hold eh context - information. - (push_eh_context): New routine. - (pop_eh_context): Likewise. - * decl.c (push_cp_function_context): Use them. - (pop_cp_function_context): Likewise. - -Wed Dec 20 12:42:51 1995 Jason Merrill - - * decl2.c (finish_file): Also prune uninteresting functions in the - inline emission loop. - -Wed Dec 20 02:32:07 1995 Jeffrey A Law - - * sig.c (build_signature_table_constructor): Mark functions - in the signature as referenced. - -Tue Dec 19 22:36:56 1995 Jason Merrill - - * decl2.c (finish_file): Do all the vtable/synthesis stuff before - the inline emission stuff. - -Mon Dec 18 15:51:33 1995 Jason Merrill - - * cp-tree.h, decl2.c (flag_weak): New flag to control the use of - weak symbols. - * lang-options.h: Add -f{no-,}weak. - * decl.c (init_decl_processing): If the target does not support weak - symbols, don't use them. - * decl2.c, pt.c: s/SUPPORTS_WEAK/flag_weak/. - -Sun Dec 17 21:13:23 1995 Rusty Russell - - * init.c (expand_member_init): warning for base init after members. - -Fri Dec 15 15:32:18 1995 Jason Merrill - - * cvt.c (build_expr_type_conversion): Don't convert to a reference - type. - -Thu Dec 14 16:05:58 1995 Mike Stump - - * method.c (report_type_mismatch): Improve wording for volatile - mismatches. - -Thu Dec 14 14:16:26 1995 Mike Stump - - * init.c (expand_aggr_init_1): Use expand_aggr_init_1 instead of - expand_assignment, as the later doesn't handle things that have - copy constructors well. The compiler would do bitwise copying, - instead of ctor calling in some cases. - -Wed Dec 13 17:05:54 PST 1995 Paul Eggert - - * g++.c (my_strerror): Return "cannot access" if errno is 0. - (pfatal_with_name, perror_exec): Don't assume that - the returned value from my_strerror contains no '%'s. - (concat): Remove. - (sys_nerror): Declare only if HAVE_STRERROR is not defined. - -Wed Dec 13 16:22:38 1995 Jason Merrill - - Lose CLASSTYPE_METHODS/DECL_NEXT_METHOD chain; make - TYPE_METHODS/TREE_CHAIN mean what they used to. - * decl2.c (constructor_name_full): Refer to CLASSTYPE_METHOD_VEC - instead of TYPE_METHODS. - * decl.c (duplicate_decls): Lose references to DECL_NEXT_METHOD. - * tree.c (tree_copy_lang_decl_for_deferred_output): Likewise. - * cp-tree.h (CLASSTYPE_METHODS): Lose. - (CLASSTYPE_METHOD_VEC): Point to lang_spec->methods instead of - TYPE_METHODS. - (struct lang_decl): Lose next_method field. - (DECL_NEXT_METHOD): Lose. - * class.c (finish_struct_methods): Don't mess with TYPE_METHODS. - (finish_struct): Just use TYPE_METHODS; we don't need fn_fields - anymore. - (finish_struct_methods): Don't mess with the TREE_CHAINs in - fn_fields. - - * search.c (add_conversions): Don't use TREE_CHAIN to traverse method - vector. - - * call.c (build_method_call): Synthesize here even when not inlining. - * typeck.c (build_function_call_real): Likewise. - -Wed Dec 13 15:02:39 1995 Ian Lance Taylor - - * cp/lex.c (check_newline): If DBX_DEBUGGING_INFO and write_symbols - == DBX_DEBUG, call dbxout_start_new_source_file and - dbxout_resume_previous_source_file when appropriate. - -Tue Dec 12 20:38:55 1995 Mike Stump - - * except.c (start_anon_func): Push to the top level. - (end_anon_func): Pop from the top level. - -Mon Dec 11 18:56:14 1995 Mike Stump - - * cp-tree.h (build_cleanup): New routine to build cleanups. - * decl.c (expand_static_init): Use build_cleanup to build a cleanup - call at ctor time and use atexit to run it later. - * decl2.c (build_cleanup): New routine, taken from finish_file. - (finish_file): Use build_cleanup instead, and don't put function - local statics in global dtor list. - -Wed Dec 6 14:34:29 1995 Mike Stump - - * except.c (expand_throw): Ensure that we have cleanups, if we try - and expand cleanups. - -Wed Dec 6 11:48:21 1995 Mike Stump - - * except.c (expand_throw): Add logic to manage dynamic cleanups for - the EH object. - (expand_end_catch_block): Use the magic of expand_goto, instead of - emit_jump so that we get the cleanup for any catch clause parameter - and the cleanup for the exception object. Update to reflect label - changes. - (push_eh_cleanup): New routine to register a cleanup for an - exception object. - (empty_fndecl): Used to default cleanup actions to - nothing. - (init_exception_processing): Setup empty_fndecl. Setup - saved_cleanup. - (expand_start_catch_block): Update to reflect label changes. Call - push_eh_object to register the cleanup for the EH object. - (start_anon_func): New routine to start building lambda expressions - from trees. - (end_anon_func): New routine to end them. - (struct labelNode): Change so that we can use tree labels, or rtx - labels. - (saved_cleanup): Object to check for dynamic cleanups for the - exception handling object. - (push_label_entry): Change so that we can use tree labels, or rtx - labels. - (pop_label_entry): Likewise. - (top_label_entry): Likewise. - (expand_start_all_catch): Use tree label instead of rtx label, so - that we can get the magic of expand_goto. - (expand_end_all_catch): Update to reflect label changes. - - * class.c (build_vfn_ref): Remove building_cleanup logic, as we now - use UNSAVE_EXPRs. - typeck.c (get_member_function_from_ptrfunc): Remove remnants of - building_cleanup logic, as we now use UNSAVE_EXPRs. - * cp-tree.h (unsave_expr): Declare it. - * decl.c (building_cleanup): Remove. - (maybe_build_cleanup): Remove building_cleanup logic, and use - UNSAVE_EXPR instead. - -Sun Dec 3 01:34:58 1995 Mike Stump - - * gc.c (build_t_desc): Update error message to say . - -Thu Nov 30 12:30:05 1995 Brendan Kehoe - - * decl.c (pushdecl): Only warn about shadowing a local variable if - warn_shadow is true. - -Sun Nov 26 16:06:55 1995 Rusty Russell - - * typeck.c (build_binary_op_nodefault): Added warning about - comparisons between different enum types with -Wall, unless - -fenum-int-equiv set. - -Wed Nov 22 15:44:02 1995 Mike Stump - - * class.c (finish_struct_1): Skip down to the inner type in - multidimensional arrays. Ensures ctors will be made for types that - need constructing. - -Wed Nov 22 14:19:22 1995 Mike Stump - - * decl.c (last_dtor_insn): New to track the last compiler generated - insn in a dtor. - (store_parm_decls): Set it. - (finish_function): Use it to see if the dtor is empty. Avoid doing - vtable setup all the time, if we can. - (struct cp_function): Add last_dtor_insn. - (push_cp_function_context): Save it. - (pop_cp_function_context): Restore it. - -Wed Nov 22 11:52:19 1995 Paul Russell - - * typeck.c (build_unary_op): Set TREE_NO_UNUSED_WARNING to avoid - warnings. - -Tue Nov 21 17:15:23 1995 Mike Stump - - * typeck.c (expand_target_expr): Make sure targets get put into the - current temp_slot_level, so that the free_temp_slots call will reuse - them. - -Tue Nov 21 13:32:03 1995 Mike Stump - - * class.c (finish_struct_1): Delay delta fixups for virtual bases - until after we have done the hard virtuals, to avoid a bogus `every - virtual function must have a unique final overrider' for virtual - functions that are only overridden by hard virtuals. - -Thu Nov 9 13:35:30 1995 Jason Merrill - - * pt.c (do_function_instantiation): Don't try to find a file-scope - template for a member function. - -Tue Nov 14 06:20:35 1995 Mike Stump - - * g++.c (main): Add handling of -nodefaultlibs. - -Mon Nov 13 15:45:34 1995 Mike Stump - - * cp-tree.h (INDIRECT_BIND): Add a way for the frontend to - distinguish between direct bindings of reference variables, and - indirect bindings of reference variables. - * cvt.c (build_up_reference): Use it. - * typeck.c (convert_arguments): Use it to indicate this is an - indirect binding. - * decl.c (cp_finish_decl): Ensure that we reuse stack slots as fast - as they are unused. - (expand_static_init): Likewise. - (cplus_expand_expr_stmt): Likewise. - * decl2.c (finish_file): Likewise. - * init.c (perform_member_init): Likewise. - (emit_base_init): Likewise. - (expand_aggr_vbase_init_1): Likewise. - -Fri Nov 10 09:18:09 1995 Brendan Kehoe - - * decl.c (push_namespace): Rewrite to use build_lang_decl, so we - get a DECL_LANG_SPECIFIC node. - * cp-tree.h (lang_decl_flags): Add new member `level'. - (NAMESPACE_LEVEL): Don't use decl.arguments, instead use the - decl_flags level member. - -Mon Nov 6 18:36:13 1995 Brendan Kehoe - - * call.c (build_method_call): Make sure instance has a - TYPE_LANG_SPECIFIC node before we dive into it. - -Sat Nov 4 20:01:52 1995 Jason Molenda - - * method.c (make_thunk): use TREE_SET_CODE to set thunk's tree code. - -Thu Nov 2 17:56:57 1995 Mike Stump - - * decl.c (duplicate_decls): When smashing decls, smash staticness in - the usual way. - -Thu Nov 2 16:44:02 1995 Mike Stump - - * decl.c (poplevel): Handle the merging of subblocks of cleanups - when finishing blocks that have already been created (usually due to - the fixup goto code). Fixes bad debugging information. - -Wed Nov 1 12:33:53 1995 Jason Merrill - - * method.c (hack_identifier): Don't abort when we get a TREE_LIST - that's not a list of overloaded functions. - -Wed Nov 1 11:38:58 1995 Brendan Kehoe - - * decl2.c (mark_vtable_entries): Check DECL_LANG_SPECIFIC on fn - before trying to use DECL_ABSTRACT_VIRTUAL_P. - -Tue Oct 31 11:56:55 1995 Jason Merrill - - * decl2.c (mark_used): New function for hooking into setting of - TREE_USED on decls. - * call.c (build_method_call): Use it. - * class.c (instantiate_type): Likewise. - * init.c (build_offset_ref): Likewise. Don't call assemble_external - for all like-named functions. - * method.c (hack_identifier): Likewise. - (emit_thunk): Don't call assemble_external. - (make_thunk): Create thunk as a FUNCTION_DECL so that it - gets the right mode and ENCODE_SECTION_INFO works. - - * parse.y: Use mark_used. Pass operator names to do_identifier. - * lex.c (do_identifier): Handle operator names. - - * decl2.c (grokclassfn): Tweak __in_chrg attributes. - -Thu Oct 26 16:45:58 1995 Brendan Kehoe - - * errfn.c: Include stdio.h. - (cp_sprintf): Take out decl of sprintf, and cast sprintf to errorfn*. - -Wed Oct 25 18:58:41 1995 Mike Stump - - * typeck2.c (digest_init): Always convert initializers to the - right type. - -Wed Oct 25 13:25:24 1995 Mike Stump - - * init.c (member_init_ok_or_else): Don't allow member initializers - for indirect members, as it is invalid. - -Wed Oct 25 11:35:28 1995 Brendan Kehoe - - * decl.c (grokdeclarator): Don't allow `friend signed ()'. - -Fri Oct 20 10:30:59 1995 Mike Stump - - * parse.y (for.init.statement): Catch compound statements inside for - initializations, if we're being pedantic. - -Fri Oct 20 10:03:42 1995 Mike Stump - - * decl.c (lookup_tag): Return NULL_TREE if we don't find what we are - looking for. - -Thu Oct 19 14:26:10 1995 Mike Stump - - * error.c (dump_expr): Don't core dump when a boolean expression is - used as a default argument. - -Thu Oct 19 10:36:30 1995 Jason Merrill - - * class.c (finish_struct_bits): Check aggregate_value_p instead of - RETURN_IN_MEMORY. - -Wed Oct 18 18:12:32 1995 Jason Merrill - - * class.c (finish_struct_bits): Also set TREE_ADDRESSABLE on a - BLKmode type that would otherwise be returned in registers. - -Mon Oct 16 12:32:19 1995 Brendan Kehoe - - * g++.c (WITHLIBC): New macro. - (main): Declare saw_libc. Use WITHLIBC if `-lc' was used; set - saw_libc and pass it at the end if it was set. - -Wed Oct 11 16:30:34 1995 Brendan Kehoe - - * parse.y (fn.def1): Call split_specs_attrs in - declmods notype_declarator case. diff --git a/gcc/cp/ChangeLog.1 b/gcc/cp/ChangeLog.1 deleted file mode 100755 index 78fa179..0000000 --- a/gcc/cp/ChangeLog.1 +++ /dev/null @@ -1,9451 +0,0 @@ -Sun Nov 26 14:47:42 1995 Richard Kenner - - * Version 2.7.2 released. - -Mon Nov 20 14:05:00 1995 Mike Stump - - * g++.c (pfatal_with_name): Add missing third argument to concat. - -Thu Oct 26 13:59:54 1995 Mike Stump - - * init.c (expand_aggr_init): Handle cv qualifiers on the object's - type. - -Sat Nov 11 08:25:55 1995 Richard Kenner - - * Version 2.7.1 released. - -Thu Nov 2 17:02:47 1995 Jason Merrill - - * call.c (convert_harshness): Handle references to arrays. - -Fri Oct 27 14:20:21 1995 Jason Merrill - - * typeck.c (comp_target_types): Check multi-level pointer - conversions in both directions. - -Tue Oct 17 21:39:05 1995 Jason Merrill - - * parse.y (explicit_instantiation): Fix 'extern template' with no - return type. - -Mon Oct 16 14:35:20 1995 Jason Merrill - - * parse.y (explicit_instantiation): Support automatic instantiation - of constructors. - (named_class_head_*): Support out-of-class definition of nested - types. - -Wed Oct 11 12:20:56 1995 Mike Stump - - * search.c (envelope_add_decl): New routine. Fix so that - methods are hidden in the same way that other members are. - (dfs_pushdecls): Cleanup and move functionality out of line, - into envelope_add_decl. - -Tue Oct 10 15:46:01 1995 Mike Stump - - * typeck.c (mark_addressable): Only call assemble_external if we - have started the output file. - -Tue Oct 10 11:27:18 1995 Jason Merrill - - * decl.c (start_function): Fix earlier cv-quals change. - -Mon Oct 9 23:53:05 1995 Mike Stump - - * parse.y (complex_direct_notype_declarator): Only push the class if - we are not already in the class. - -Mon Oct 9 11:22:03 1995 Doug Evans - - * decl.c (duplicate_decls): Call merge_machine_decl_attributes. - Update olddecl's attributes too. - (grokdeclarator): #if 0 out call to build_decl_attribute_variant. - * typeck.c (common_type): Call merge_machine_type_attributes. - -Fri Oct 6 14:44:27 1995 Mike Stump - - * typeck.c (mark_addressable): Add missing call to - assemble_external. - -Wed Oct 4 15:06:39 1995 Mike Stump - - * decl.c (store_parm_decls): Make sure the unwinder start comes - before the exception specification start. - * except.c (expand_exception_blocks): Make sure the unwinder end - comes after the terminate protected catch clause region and after - the end of the exception specification region. - -Wed Oct 4 12:47:02 1995 Jason Merrill - - * lex.c (real_yylex): Fix identifier case for linemode. - (handle_sysv_pragma): Don't abort when we see a pragma we don't - recognize. - -Tue Oct 3 14:09:46 1995 Mike Stump - - * decl.c (store_parm_decls): Add a call to start_eh_unwinder. - * except.c (init_exception_processing): __throw doesn't take any - arguments. - (expand_builtin_throw): Likewise. Always use Pmode, instead of SImode - for all pointers. Use expand_builtin_return_addr to unwind the - first level off the stack. - (do_unwind): Always use Pmode, instead of SImode for all pointers. - (expand_exception_blocks): Add a call to end_eh_unwinder. - (start_eh_unwinder, end_eh_unwinder): New routines to build machine - independent stack unwinders for function/method calls. - -Mon Oct 2 17:20:42 1995 Mike Stump - - * tree.c (unsave_expr_now): Make sure we process the argument list - of any called functions. Fixes incorrect code generation for - cleanups. - -Mon Oct 2 13:04:16 1995 Mike Stump - - * typeck.c (get_member_function_from_ptrfunc): Save function if it - needs it. Cures core dump on things like (this->*(f()))(). - -Sat Sep 23 22:51:25 1995 Jason Merrill - - * decl.c (start_function): Conform to gcc cv-quals convention (no - expression has a cv-qualified type) in RESULT_DECLs. - * method.c (make_thunk): Likewise. - -Fri Sep 22 10:21:13 1995 Mike Stump - - * decl.c (pushtag): Add in the namespace name for the tag. - -Thu Sep 21 13:11:13 1995 Mike Stump - - * parse.y (maybe_base_class_list, base_class_list, base_class, - base_class_access_list): Make sure we see the typenames for base - classes. - * lex.c (see_typename): Instead of failing to see a typename when - there is no next token, perfer a typename, and get the next token. - -Wed Sep 20 12:35:27 1995 Michael Meissner - - * decl.c (init_decl_processing): Add __builtin_expect. - -Tue Sep 19 16:48:11 1995 Mike Stump - - * cvt.c (cp_convert_to_pointer): Don't allow leftover conversions to - or from pointer to member functions, they must all be handled before - this point. - -Fri Sep 15 17:14:47 1995 Brendan Kehoe - - * init.c (resolve_offset_ref): Fix wording of non-static member - being referenced as a static. - -Fri Sep 15 12:39:11 1995 Jason Merrill - - * typeck.c (build_indirect_ref): Only bash pointer if we actually - call build_expr_type_conversion. - -Thu Sep 14 18:24:56 1995 Jason Merrill - - * cvt.c (build_expr_type_conversion): Handle conversion from - reference. - * typeck.c (build_indirect_ref): Avoid infinite recursion. - -Thu Sep 14 17:23:28 1995 Mike Stump - - * decl.c (expand_start_early_try_stmts): New routine to start a try - block at the start of the function, for function-try-blocks. - * cp-tree.h (expand_start_early_try_stmts): Declare it. - * parse.y (function_try_block): Use it, instead of doing it here, as - we don't want to include rtl.h here, as that conflicts with RETURN - in the parser. - -Wed Sep 13 18:32:24 1995 Mike Stump - - * lex.c (reinit_parse_for_block): Support saving inline - function-try-blocks, uses peekyylex. - * parse.y (eat_saved_input): New rule, permit the parser to see that - END_OF_SAVED_INPUT is ok, as it can see this when parsing the - handlers of a function-try-block. - (fndef): Use it. - (component_decl): Make sure TRY and RETURN can come after fn.def2. - * spew.c (peekyylex): New routine to peek at what will come next. - -Wed Sep 13 16:52:06 1995 Jason Merrill - - * typeck.c (comptypes): Tighten up comparisons of template type - parms. - - * decl.c (duplicate_decls): Turn off whining about virtual functions - redeclared inline for now. - -Wed Sep 13 11:13:40 1995 Mike Stump - - * decl.c (store_in_parms): New routine to put things before we - put base inits. - * cp-tree.h (store_in_parms): Declare it. - * decl.c (store_parm_decls): Use it to makr sure the starting of the - eh spec comes before base inits. - (finish_function): Use sequences instead of the obsolete - reorder_insns. - * parse.y (fndef): Enhance readability and maintainability. Update - to include function_try_block syntax. - (function_try_block): Add. - -Tue Sep 12 17:43:07 1995 Brendan Kehoe - - * call.c (convert_harshness): Use comptypes, not ==, to check if - TYPE and PARMTYPE are equivalent on a function type. - -Tue Sep 12 17:31:33 1995 Douglas Rupp - - * Make-lang.in (cc1plus) : Removed unnecessary $(exeext). - -Mon Sep 11 23:24:07 1995 Mike Stump - - * except.c (expand_throw): Never allocate storage for thrown pointer - to objects. - -Mon Sep 11 19:36:45 1995 Mike Stump - - * except.c (expand_start_catch_block): Pointers to objects come - back from catch matching already dereferenced, don't dereference - again. - -Mon Sep 11 15:46:28 1995 Mike Stump - - * except.c (expand_throw): Only decay the throw expression, don't do - any default conversions. This is so that one can throw and catch - characters, and not have them match integers. - -Mon Sep 11 13:46:45 1995 Mike Stump - - * error.c (dump_aggr_type): Deal with anonymous unions that don't - have a TYPE_NAME. - -Fri Sep 8 20:40:27 1995 Brendan Kehoe - - * lex.c (handle_sysv_pragma): Deal with getting a comma from yylex. - -Fri Sep 8 15:51:41 1995 Mike Stump - - * except.c (expand_end_eh_spec): Handle empty EH specifications. - -Fri Sep 8 15:27:22 1995 Mike Stump - - * cp-tree.h (expand_start_eh_spec): Declare new routine. - (expand_end_eh_spec): Likewise. - * decl.c (store_parm_decls): Call expand_start_eh_spec to process - exception specifications. - * except.c (expand_leftover_cleanups): Remove unused parameter. - (expand_end_catch_block): Likewise. - (expand_exception_blocks): Likewise. - (expand_start_eh_spec): New routine to mark the start of an - exception specification region. - (expand_end_eh_spec): New routine to mark the end of an exception - specification region. - (expand_exception_blocks): Call expand_end_eh_spec to process - exception specifications. - -Fri Sep 8 14:40:48 1995 Per Bothner - - * lex.c (do_identifier): Use global binding in preference of - dead for local variable. - -Wed Sep 6 19:32:59 1995 Mike Stump - - * cp-tree.h (build_exception_variant): Remove used first argument. - * decl.c (duplicate_decls): Likewise. - (grokfndecl): Likewise. - (revert_static_member_fn): Likewise. - * decl2.c (grok_method_quals): Likewise. - * tree.c (build_exception_variant): Likewise. - * typeck.c (common_type): Likewise. - * decl2.c (grokclassfn): After changing the type, call - build_exception_variant, if necessary. - -Tue Sep 5 15:56:27 1995 Mike Stump - - * except.c (expand_throw): Run cleanups for the throw expression. - -Wed Aug 30 15:24:38 1995 Stephen L. Favor - - * except.c (expand_builtin_throw): Moved gen_label_rtx calls beyond - the store_parm_decls call which does initialization in the emit_* - code concerning label numbering. - -Thu Aug 31 09:01:07 1995 Mike Stump - - * except.c (expand_internal_throw): Let the frontend be responsible - for managing all frontend EH parameters, the backend routine only - needs to deal with backend values. type and value are no longer - passed to __throw. - (init_exception_processing): Likewise. - (expand_start_all_catch): Likewise. - (expand_end_all_catch): Likewise. - (expand_leftover_cleanups): Likewise. - (expand_end_catch_block): Likewise. - (expand_builtin_throw): Likewise. - (expand_throw): Likewise. - -Tue Aug 29 15:04:36 1995 Jason Merrill - - * cp-tree.h (DECL_REAL_CONTEXT): Give the real declaration context - for a decl. - * decl.c (cp_finish_decl): Use it. - -Tue Aug 29 10:30:27 1995 Mike Stump - - * except.c (expand_internal_throw): Oops, almost forgot type and - value are now trees. - -Mon Aug 28 17:57:45 1995 Brendan Kehoe - - Fix the attribute handling to make sure they get noted before we - create the function's RTL, in case they can affect that. - * decl.c (grokfndecl): New arg ATTRLIST. Run - cplus_decl_attributes before creating the decl's rtl. - (grokdeclarator): New arg ATTRLIST, passed down into grokfndecl. - (shadow_tag, groktypename, start_decl, start_method): Pass a - NULL_TREE to grokdeclarator's new last arg. - * decl2.c (grokfield): New arg ATTRLIST, passed into grokdeclarator. - (grokbitfield, grokoptypename): Pass a NULL_TREE to - grokdeclarator's new last arg. - * except.c (expand_start_catch_block): Likewise. - * pt.c (process_template_parm, end_template_decl, - do_function_instantiation): Likewise. - * cp-tree.h (grokfield): Add arg. - (grokdeclarator): Move the prototype from here... - * decl.h: ...to here. - * lex.c (cons_up_default_function): Pass NULL_TREE to grokfield - ATTRLIST argument. - * parse.y: Create a list for the grokfield arg where appropriate, - and pass it down instead of calling cplus_decl_attributes. - -Mon Aug 28 15:07:24 1995 Mike Stump - - * except.c: Always allow turning on exception handling. Allow cross - compilations to use EH. - -Thu Aug 24 17:39:24 1995 Mike Stump - - * except.c (saved_pc, saved_throw_type, saved_throw_value): Use - trees, instead of rtxs, and don't depend on using special machine - dependent registers. - (expand_internal_throw): Likewise. - (init_exception_processing): Likewise. - (expand_start_all_catch): Likewise. - (expand_end_all_catch): Likewise. - (expand_start_catch_block): Likewise. - (expand_leftover_cleanups): Likewise. - (expand_end_catch_block): Likewise. - (expand_builtin_throw): Likewise. - (expand_throw): Likewise. - -Wed Aug 23 17:25:51 1995 Jason Merrill - - * cvt.c (build_expr_type_conversion): Handle conversions to - reference types. - -Wed Aug 23 15:33:59 1995 Mike Stump - - * except.c (do_unwind): Work around backend bug with -fpic. - -Tue Aug 22 17:20:07 1995 Per Bothner - - * decl2.c (flag_new_for_scope): Add a new mode that follows ANSI - for-scoping, but supports (and warns about) old programs. - Make the new mode (with value 1) the default. - (lang_f_options): The on-value for flag_new_for_scope is now 2. - * cp-tree.h (DECL_DEAD_FOR_LOCAL, DECL_ERROR_REPORTED): New macros - (DECL_SHADOWED_FOR_VAR): Likewise. - * decl.c (struct binding_level): New fields dead_vars_from_for - and is_for_scope. - (note_level_for_for): New function. - (poplevel): Special processing if is_for_scope. - (pushdecl): Warn if for-scope variable shadows local. - * lex.c (do_identifier): Handle old (non-ANSI) for scoping, - and warn if conflicts. - * parse.y (FOR): Call note_level_for_for. - -Mon Aug 21 10:28:31 1995 Jason Merrill - - * decl2.c (import_export_inline): Class interface hackery does not - apply to synthesized methods. - -Sun Aug 20 16:29:00 1995 Mike Stump - - * search.c (virtual_context): Find the right context more often. - Solves a `recoverable compiler error, fixups for virtual function' - problem. - -Sun Aug 20 13:53:24 1995 Mike Stump - - * except.c (expand_start_all_catch): Ensure that we always transfer - control to the right EH handler, by rethrowing the end label on the - region, instead of hoping we are nested and falling through. - (expand_leftover_cleanups): Likewise. - (end_protect): Since we now rethrow the end label, put a - nop after it, so that outer regions are recognized. - * init.c (build_vec_delete_1): New routine to handle most of vector - deleting, all code moved here from build_vec_delete. - (build_array_eh_cleanup): Use build_vec_delete_1 to do all the real - work. - (expand_vec_init): If the array needs partial destructing, setup an - EH region to handle it. - (build_vec_delete): Move lots of code to build_vec_delete_1, use - build_vec_delete_1 to do the grunt work. - -Sat Aug 19 14:25:33 1995 Brendan Kehoe - - Handle decl attributes properly for function definitions without - previous attribute-loaded declarations. - * decl.c (start_function): New arg ATTRS. Add a call to - cplus_decl_attributes with it before we create the RTL. - * cp-tree.h (start_function): Update prototype. - * parse.y (fn.def1): Pass ATTRS into start_function instead of - trying to call cplus_decl_attributes too late. Pass a NULL_TREE - for other use. - * decl2.c (finish_file): Pass NULL_TREE as fourth arg to - start_function. - * method.c (synthesize_method): Likewise. - * except.c (expand_builtin_throw): Likewise for start on __throw. - -Sat Aug 19 13:36:08 1995 Mike Stump - - * class.c (set_rtti_entry): Turn on -fvtable-thunk -frtti support. - This changes -fvtable-thunks vtable layout, so a recompile will be - necessary, if you use -fvtable-thunks. - (get_vtable_entry): Use n, instead of i to be consistent with the - rest of the compiler. - (get_vtable_entry_n): Likewise. - (add_virtual_function): Add a slot for the tdesc, if -fvtable-thunks - are being used. - (finish_struct_1): Likewise. - (skip_rtti_stuff): New routine to collapse similar code from many - different parts of the compiler. I think I got them all. - (modify_one_vtable): Use it. - (fixup_vtable_deltas1): Likewise. - (override_one_vtable): Likewise. - * decl2.c (mark_vtable_entries): Likewise. - * tree.c (debug_binfo): Likewise. - * search.c (expand_upcast_fixups): Likewise. - (get_abstract_virtuals_1): Likewise. Use virtuals, instead of tmp to - consistent with the rest of the compiler. - (get_abstract_virtuals): Likewise. - * cp-tree.h (skip_rtti_stuff): New routine, declare it. - * gc.c (build_headof): Support -fvtable-thunk and -frtti together. - (build_typeid): Likewise. - (build_classof): Remove old style way of doing rtti. Remove support - for `classof' and `headof'. - * gxx.gperf: Likewise. - * hash.h: Likewise. - * parse.y: Likewise. - -Fri Aug 18 17:31:58 1995 Jason Merrill - - * decl.c (start_function): Clear ctor_label and dtor_label. - - * class.c (finish_struct_1): Fix handling of access decls. - -Tue Aug 15 19:21:54 1995 Jason Merrill - - * class.c (finish_struct): Only do minimal processing here, so it - can be used for class template definitions, as well. - (finish_struct_1): New function with the rest of the code. - -Tue Aug 15 09:46:16 1995 Mike Stump - - * class.c (prepare_fresh_vtable): On second though, always build the - offset (see Aug 10 change), unless -fvtable-thunks is given. It - does this by calling the new routine set_rtti_entry. - (finish_struct): Likewise. - (set_rtti_entry): New routine to update the rtti information at the - start of the vtable. - -Mon Aug 14 12:21:22 1995 Brendan Kehoe - - * error.c (dump_decl, case IDENTIFIER_NODE): Only work on a dtor - if it's declared in the C++ language spec. - (dump_function_decl): Likewise. - (dump_function_name): Likewise. - (ident_fndecl): Make sure we got something back from lookup_name. - * decl.c (start_function): Likewise. - -Fri Aug 11 16:52:15 1995 Jason Merrill - - * call.c (build_method_call): Don't call build_new when calling a - constructor without an instance. - -Thu Aug 10 20:00:17 1995 Mike Stump - - * class.c (prepare_fresh_vtable): Always build the offset to the - complete object, as it doesn't cost much. This allows dynamic_cast - to void * to work when -frtti isn't given. - (finish_struct): Likewise. - -Thu Aug 10 16:31:28 1995 Mike Stump - - * except.c (build_eh_type): Split out some functionality to new - routine named build_eh_type_type. - (build_eh_type_type): New routine. - (expand_start_catch_block): Use build_eh_type_type, as we never want - the dynamic type of the catch parameter, just the static type. - Fixes core dumps when -frtti is used and one catchs pointers to - classes. - -Thu Aug 10 14:55:29 1995 Mike Stump - - * except.c (expand_builtin_throw): Since we now use normal calling - conventions for __throw, we have to remove the first layer off the - stack, so that the next context we search for handlers is the outer - context instead of the context that had the call to __throw, if we - don't immediately find the desired context. - -Tue Aug 8 17:44:23 1995 Jason Merrill - - * tree.c (cp_expand_decl_cleanup): Returns int, not tree. - * cp-tree.h: Update. - - * parse.y (template_type_parm): Add support for `typename'. - -Tue Aug 8 12:06:31 1995 Mike Stump - - * except.c (expand_internal_throw): New internal routine to throw a - value. - (expand_end_all_catch, expand_leftover_cleanups): All throwers - changed to use `expand_internal_throw' instead of jumping to throw - label. - (expand_end_catch_block, expand_throw): Likewise. - (throw_label): Removed. - (expand_builtin_throw): Changed so that EH parameters are passed by - normal function call conventions. Completes Aug 4th work. - -Fri Aug 4 17:17:08 1995 Mike Stump - - * cp-tree.h (expand_builtin_throw): Declare it. - * decl2.c (finish_file): Call expand_builtin_throw. - * except.c (make_first_label): Remove. - (init_exception_processing): Don't use a LABEL_REF for throw_label, - instead use a SYMBOL_REF, this is so that we don't use LABEL_REFs in - other functions that don't really appear in those functions. This - solves a problem where cc1plus consumed exponential amounts of - memory when -Wall was used. - (expand_end_all_catch, expand_leftover_cleanups, - expand_end_catch_block, expand_throw): Change all uses of - throw_label to match new style. - (do_unwind): Rename parameter to inner_throw_label, as it is now - different from throw_label. Also, assume that our caller will wrap - the passed label with a LABEL_REF, if needed. - (expand_builtin_throw): Make external, change so that the generated - throw is now a real function. - (expand_exception_blocks): Never generate throw code inside another - function. - -Fri Aug 4 12:20:02 1995 Mike Stump - - * decl.c (grokdeclarator): Move checking of mutable const objects - and mutable static objects down, as we might decide during parsing - to unset staticp or constp (for example, when const is part of the - object being pointed to). - -Thu Aug 3 17:13:43 1995 Mike Stump - - * except.c (output_exception_table_entry): Enhance portability to - weird machines. - (emit_exception_table): Likewise. - -Thu Aug 3 16:41:38 1995 Mike Stump - - * typeck.c (build_ptrmemfunc): Handle casting of pointer to - non-virtual member functions. - -Wed Aug 2 11:58:25 1995 Mike Stump - - * gc.c (build_typeid): Strip cv qualifiers so that const T&, T&, T - and const T all match. - -Wed Aug 2 11:25:33 1995 Mike Stump - - * except.c (build_eh_type): Strip cv qualifiers so that const T&, - T&, T and const T all match. - -Tue Aug 1 14:20:16 1995 Mike Stump - - * except.c: Fix up comments, cleanup code and eliminate exceptNode, - exceptStack, exceptstack, push_except_stmts, pop_except_stmts, - new_except_stack, push_last_insn, pop_last_insn, insn_save_node and - InsnSave. Also, numerous speed improvements, and correctness - improvements. Double faulting in all situations should now be - handled correctly. - (expand_start_all_catch): Instead of having many terminate protected - regions, just have one. - (expand_start_catch_block): No longer have to protect - false_label_rtx, as it isn't used for EH region marking. - (expand_end_catch_block): Expand out EH cleanups here by using - expand_leftover_cleanups. - (expand_end_all_catch): Use sequences instead of playing with insn - links directly. - (expand_exception_blocks): Likewise. Also protect all catch clauses - with one terminate region. - -Mon Jul 31 13:24:30 1995 Jason Merrill - - * method.c (report_type_mismatch): Don't talk about an object - parameter for non-methods. - -Sun Jul 30 13:13:02 1995 Jason Merrill - - * class.c (finish_struct): Catch private and protected members of - anonymous unions here. - * decl2.c (finish_anon_union): And here. - * parse.y: Instead of here. - - * errfn.c (ARGSLIST): Support passing four args. - * error.c (cv_as_string): New function. - (cp_printers): Add it. - * call.c (build_method_call): Report 'const' at end of pseudo-decl. - - * method.c (report_type_mismatch): Deal with a bad_arg of 0. - - * init.c (expand_aggr_init): Handle volatile objects, too. - -Sat Jul 29 13:42:03 1995 Jason Merrill - - * decl.c (struct binding_level): Keep list of incomplete decls. - (print_binding_level): Use list_length to count them. - (pushdecl): Build up the list. - (hack_incomplete_structures): Walk it and prune completed decls. - -Fri Jul 28 15:26:44 1995 Jason Merrill - - * typeck.c (comp_target_types): Don't check const and volatile for - function types. - (comp_ptr_ttypes_real): Likewise. - -Thu Jul 27 15:40:48 1995 Jason Merrill - - * typeck.c (comp_target_types): Fix. - -Thu Jul 27 15:10:48 1995 Mike Stump - - * cp-tree.h (unsave_expr_now, build_unsave_expr, - cp_expand_decl_cleanup): Declare new routines. - * decl.c (cp_finish_decl, store_parm_decls, - hack_incomplete_structures): Change all cals from - expand_decl_cleanup to cp_expand_decl_cleanup. - * gc.c (protect_value_from_gc): Likewise. - * expr.c (cplus_expand_expr): Handle UNSAVE_EXPRs. - * tree.c (unsave_expr): New routine to build an UNSAVE_EXPR. - (unsave_expr_now): Backend routine used by tree expander. - (cp_expand_decl_cleanup): Wrap second argument in an UNSAVE_EXPR to - work around a limitation in the backend. The backend uses the - cleanups multiple times, on disjoint control flows, so we cannot - pass unsaved SAVE_EXPRs to the backend. - * tree.def (UNSAVE_EXPR): New tree code. - * typeck.c (c_expand_return): Move goto/return code up inside - conditional, as we don't always want to do this, we only want to do - this when we don't otherwise finish with this control flow. - -Thu Jul 27 10:38:43 1995 Brendan Kehoe - - * parse.y (typespec): Only complain about typeof if we're not - getting it from a system header. - -Thu Jul 27 10:26:23 1995 Doug Evans - - Clean up prefix attribute handling. - * parse.y (reserved_declspecs): Link prefix attributes with declspecs. - (declmods): Likewise. - (all rules that reference typed_declspecs and declmods): Call - split_specs_attrs or strip_attrs to separate declspecs and attrs. - (lang_extdef): Delete resetting of prefix_attributes. - (template_def, notype_declarator rule): Use NULL_TREE for - prefix_attributes. - (condition): Use NULL_TREE for prefix_attributes. - (setattrs): Deleted. - (nomods_initdcl0): Set prefix_attributes to NULL_TREE. - (component_decl): Delete resetting of prefix_attributes. - (component_decl_1, notype_components rule): Use NULL_TREE for - prefix_attributes. - (simple_stmt): Delete resetting of prefix_attributes. - -Mon Jul 24 13:37:53 1995 Jason Merrill - - * call.c (convert_harshness): Deal with reference conversions before - others. Actually do array->pointer decay. Call comp_target_types - with pointer types rather than their targets. - - * typeck.c (comp_target_types): Avoid assigning D const * to B *. - -Mon Jul 24 08:54:46 1995 Brendan Kehoe - - * pt.c (to_be_restored): Move decl to global scope. - -Sat Jul 22 12:22:11 1995 Jason Merrill - - * decl.c (start_decl): Put back clearing of DECL_IN_AGGR_P. - -Fri Jul 21 17:09:02 1995 Jason Merrill - - * decl.c (grokdeclarator): Downgrade error about 'extern int A::i' - to pedwarn. - - * pt.c (instantiate_template): Also avoid instantiation if the - function has already been declared to be a specialization. - - * decl2.c (check_classfn): Ignore cname argument, and return the - matching function. - - * decl.c (start_decl): Handle declarations of member functions - outside of the class (i.e. specialization declarations). - -Thu Jul 20 10:34:48 1995 Jason Merrill - - * class.c (finish_struct): Don't mess with the type of bitfields. - - * various.c: s/TYPE_POINTER_TO/build_pointer_type/. - -Thu Jul 20 01:43:10 1995 Mike Stump - - * init.c (expand_aggr_init): Assume LOOKUP_ONLYCONVERTING if init - is not a parameter list (TREE_LIST). - (expand_default_init): If LOOKUP_ONLYCONVERTING is set, then set - LOOKUP_NO_CONVERSION so that we don't allow two-level conversions, - but don't set it otherwise. - -Wed Jul 19 20:32:01 1995 Mike Stump - - * init.c (expand_default_init): Don't allow two-level conversions - during construction. - -Wed Jul 19 18:06:37 1995 Mike Stump - - * gc.c (build_headof): The type of dyncasting to a pointer to cv - void, should be pointer to cv void. - -Wed Jul 19 17:25:43 1995 Mike Stump - - * gc.c (build_dynamic_cast): Allow casting in const. - -Wed Jul 19 16:34:27 1995 Mike Stump - - * typeck.c (build_const_cast): If we are passed error_mark_node, - return it. - -Wed Jul 19 15:24:48 1995 Brendan Kehoe - - * class.c (push_nested_class): Make sure TYPE is non-nil. - - * cvt.c (type_promotes_to): Watch for error_mark_node on the - incoming TYPE. - -Wed Jul 19 13:23:12 1995 Gerald Baumgartner - - * cp-tree.h (SIGTABLE_VT_OFF_NAME): Renamed from SIGTABLE_OFFSET_NAME. - (SIGTABLE_VB_OFF_NAME): New macro. - (vt_off_identifier): Renamed from offset_identifier. - (vb_off_identifier): Added extern declaration. - - * decl.c (vt_off_identifier): Renamed from offset identifier. - (vb_off_identifier): New variable to hold the identifier for the - sigtable field vb_off. - (init_decl_processing): Initialize vb_off_identifier. - Renamed vt_off_identifier from offset_identifier. - * sig.c (build_signature_method_call): Renamed offset_identifier and - local variable offset to vt_off_identifer and vt_off, respecitively. - * sig.c (build_signature_table_constructor): Renamed offset to vt_off. - - * decl.c (init_decl_processing): Add vb_off field to - sigtable_entry_type. Reorder fields so that pfn gets properly - aligned at a 64 bit boundary on the Alpha. - * sig.c (build_signature_table_constructor): Build the constructor - according to the new layout. Set the vb_off field to -1 for now. - - * decl.c (init_decl_processing): Align sigtable_entry_type on word - boundaries instead of double word boundaries to save space. - -Tue Jul 18 16:58:37 1995 Mike Stump - - * cvt.c (cp_convert): Always call build_cplus_new for a ctor. - -Tue Jul 18 14:24:53 1995 Brendan Kehoe - - * parse.y (opt.component_decl_list): Only forbid private/protected - in anonymous unions. We need to make this know when the type is - defined for an object, to not give the error. - -Mon Jul 17 14:22:44 1995 Brendan Kehoe - - * parse.y (opt.component_decl_list): Don't allow access control - as private or protected for union members. - -Sun Jul 16 14:01:00 1995 Jim Wilson - - * lex.c (check_newline): For 'p' case, move goto skipline line to - before end brace for 'pragma'. - -Fri Jul 7 13:55:58 1995 Mike Stump - - * g++.1: Tiny updates. - -Fri Jul 7 13:05:20 1995 Mike Stump - - * decl.c (cp_finish_decl): Only destruct local static variables if - they are constructed, and only construct the first time control - passes completely through its declaration (if not initialized with a - constant-expression). - (expand_static_init): Likewise. - -Wed Jul 5 14:05:04 1995 Brendan Kehoe - - * typeck.c (comptypes, case OFFSET_REF): If either offset basetype - is a TEMPLATE_TYPE_PARM, give a match. - -Fri Jun 30 15:42:57 1995 Mike Stump - - * method.c (build_overload_value): Handle encoding of null pointer - constants (or any pointer with a constant numeric value) for - templates. - -Fri Jun 30 13:45:51 1995 Brendan Kehoe - - * call.c (convert_harshness): Add QUAL_CODE when we're faced with - const vs non-const for void conversions. - -Fri Jun 30 10:19:52 1995 Mike Stump - - * except.c (expand_start_all_catch): Fix problem with finding an - outer nested try block when there is no code to separate it from an - inner try block. - -Fri Jun 30 02:22:26 1995 Mike Stump - - * search.c (dfs_pushdecls): Consume 2 or 3 orders of magnitude less - memory please when virtual bases are used. - -Thu Jun 29 19:03:47 1995 Mike Stump - - * class.c (build_vbase_path): Avoid testing things that cannot be - null to see if they are null. - * cvt.c (convert_pointer_to_vbase): Remove code that doesn't work. - * decl.c (finish_function): Pass a type into the new - convert_pointer_to_vbase instead of a binfo. - * search.c (convert_pointer_to_vbase): Rewritten to use get_vbase - and convert_pointer_to_real. - (expand_indirect_vtbls_init): Use convert_pointer_to_vbase instead - of the more cryptic call to get_vbase. - -Thu Jun 29 09:35:05 1995 Mike Stump - - * decl.c (BOOL_TYPE_SIZE): Fix broken SLOW_BYTE_ACCESS check. - -Thu Jun 29 03:43:55 1995 Jason Merrill - - * pt.c (instantiate_template): Don't strip 'this' twice. - - * pt.c (coerce_template_parms): Allow null pointer constants. - - * decl.c (revert_static_member_fn): But only if DECL_ARGUMENTS is - set. - -Wed Jun 28 18:39:03 1995 Jason Merrill - - * decl.c (revert_static_member_fn): Also remove 'this' from - DECL_ARGUMENTS. - * decl2.c (check_classfn): Don't revert this function until we get a - match. - -Wed Jun 28 14:07:27 1995 Brendan Kehoe - - * parse.y (component_decl): Clear PREFIX_ATTRIBUTES here. - -Wed Jun 28 11:05:13 1995 Mike Stump - - * decl2.c (finish_file): Handle global vector news. - * init.c (build_new): Encode vector news so that later we will know - how many elements there are. - -Mon Jun 26 13:38:06 1995 Jason Merrill - - * expr.c (cplus_expand_expr): Don't mess with temp slots. - - * decl2.c (warn_if_unknown_interface): Don't crash if tinst_for_decl - returns null. - - * decl2.c (check_classfn): Use revert_static_member_fn. - * decl.c (revert_static_member_fn): Diagnose static member functions - declared const or volatile. - - * decl2.c (grokfield): Check for missing default args here, too. - (check_default_args): Function to do the checking. - * decl.c (pushdecl): Use it. - - * decl.c (pushdecl): Don't warn about shadowing a member of `this' - if there is no `this'. - -Sun Jun 25 11:34:25 1995 Jason Merrill - - * call.c (build_method_call): Downgrade 'called before definition' - to a warning, as it ought to go away after Monterey. - -Sat Jun 24 14:18:42 1995 Jason Merrill - - * pt.c (coerce_template_parms): Don't do extra checking on pointer - to member arguments. - - * class.c (finish_struct): const and reference members don't prevent - a class from being an aggregate. - - * class.c (finish_struct): Signatures are always aggregates. - -Fri Jun 23 17:20:29 1995 Jason Merrill - - * decl2.c (check_classfn): Improve error message. - - * pt.c (tsubst): Handle PROMOTE_PROTOTYPES. - -Thu Jun 22 01:50:42 1995 Jason Merrill - - * typeck.c (comptypes): Don't ignore method quals. - - * class.c (finish_struct): Non-abstract virtuals are always USED. - - * decl.c (build_ptrmemfunc_type): The underlying union type isn't - IS_AGGR_TYPE, either. - * class.c (finish_struct): Use CLASSTYPE_NON_AGGREGATE instead. - * cp-tree.h: Likewise. - - * cp-tree.h (lang_type): Add aggregate. - (CLASSTYPE_AGGREGATE): New macro. - (TYPE_NON_AGGREGATE_CLASS): Likewise. - * class.c (finish_struct): Determine whether a class is an - aggregate. - * decl.c (cp_finish_decl): Check TYPE_NON_AGGREGATE_CLASS instead of - TYPE_NEEDS_CONSTRUCTING. - * typeck2.c (digest_init): Check TYPE_NON_AGGREGATE_CLASS for - subobjects, too. - - * pt.c (tsubst, PARM_TYPE): Propagate DECL_ARTIFICIAL. - - * decl.c (start_function): For pre-parsed functions, layout all of - the parm decls again. - (grokvardecl): TREE_PUBLIC depends on DECL_THIS_EXTERN, not - DECL_EXTERNAL. - - * pt.c (coerce_template_parms): Improve checking for invalid - template parms. - -Wed Jun 21 12:01:16 1995 Brendan Kehoe - - * decl.c (grokdeclarator): Forbid declaration of a static member - with the same name as its enclosing class. - -Mon Jun 19 10:28:14 1995 Jason Merrill - - * decl.c (finish_function): Clear current_class_decl. - - * typeck.c (build_conditional_expr): Use convert (boolean_type_node - instead of truthvalue_conversion. - - * class.c (finish_struct): A data member with the same name as the - class doesn't suppress constructors. - -Fri Jun 16 18:11:39 1995 Gerald Baumgartner - - * decl.c (start_function): If current_class_decl is a signature - pointer, don't dereference it but set C_C_D to current_class_decl. - -Fri Jun 16 17:06:28 1995 Jason Merrill - - * decl.c (duplicate_decls): Complain about virtual functions - redeclared to be inline. - -Fri Jun 16 13:20:38 1995 Mike Stump - - * decl.c (get_unique_name): New routine to name unnamed namespaces. - (push_namespace): Use get_unique_name for naming unnamed namespaces. - -Thu Jun 15 15:00:41 1995 Jason Merrill - - * parse.y: Call cplus_decl_attributes with prefix_attributes where - appropriate. - -Wed Jun 14 19:24:49 1995 Mike Stump - - * search.c (get_vbase): New routine to switch hierarchies from the - CLASSTYPE_VBASECLASSES to the normal one. - (expand_indirect_vtbls_init): Use get_vbase to figure out how we - want to convert to a vbase pointer. - -Mon Jun 12 17:50:30 1995 Jason Merrill - - * pt.c (instantiate_class_template): Add the new instantiation to - template_classes. - (do_pending_expansions): Call instantiate_member_templates on all of - the classes in template_classes. - -Mon Jun 12 12:36:59 1995 Mike Stump - - * decl.c (complete_array_type): Fill in the TYPE_DOMAIN of our - TYPE_MAIN_VARIANT if it is not filled in. - * init.c (build_delete): If the TYPE_DOMAIN is not set, give an - error instead of core dumping. - -Mon Jun 12 10:41:40 1995 Jason Merrill - - * call.c (can_convert): Also check for distance > 0. - (can_convert_arg): Likewise. - (user_harshness): Likewise. - -Fri Jun 9 19:17:21 1995 Jason Merrill - - * g++.c (MATH_LIBRARY): Provide default. - (main): Always link with the math library if we link with libstdc++. - - * decl.c (start_function): Complain about redefinition of a function - even when the pending_inline version is compiled after the other - version. - -Thu Jun 8 15:44:38 1995 Jason Merrill - - * gc.c (build_dynamic_cast): Build up a reference to a parameter of - aggregate type. - -Wed Jun 7 15:31:57 1995 Brendan Kehoe - - * init.c (build_vec_delete): Resolve an offset ref before we try to - use it. - -Wed Jun 7 14:19:32 1995 Jason Merrill - - * typeck.c (build_modify_expr): If the class lacks a constructor or - assignment operator, return error_mark_node. - (common_type): Use build_cplus_array_type. - -Tue Jun 6 09:41:27 1995 Mike Stump - - * class.c (dont_allow_type_definitions): New variable set when types - cannot be defined. - (finish_struct): Use it. - * cp-tree.h (dont_allow_type_definitions): Define it. - * parse.y (primary, handler_seq): Set it. - -Mon Jun 5 18:49:38 1995 Mike Stump - - * method.c (build_opfncall): Use DECL_CHAIN, not TREE_CHAIN for - results from lookup_fnfields. Always give warning/error on bad - code. - -Mon Jun 5 11:39:37 1995 Brendan Kehoe - - * init.c (member_init_ok_or_else): Don't allow initialization of - an ancestor's member from within a constructor. - -Mon Jun 5 11:20:34 1995 Gerald Baumgartner - - * sig.c (build_signature_table_constructor): Use DECL_CONTEXT - instead of DECL_CLASS_CONTEXT for calculating the vfield offset so - abstract virtual functions are handled correctly. - - * sig.c (build_signature_table_constructor): Store the correct - delta in signature table entries. It does not yet work for - classes with virtual base classes as implementations of signatures. - (build_signature_method_call): Add the delta to the object_ptr - before generating the function call. - - * call.c (build_method_call): Make instance_ptr the signature - pointer itself instead of dereferencing the optr. - * sig.c (build_signature_method_call): Dereference the optr for the - direct and virtual calls. - - * sig.c (build_signature_table_constructor): Make the tag for - default implementations -1 instead of 2. - (build_signature_method_call): Change the generated conditional - expression correspondingly. - - * sig.c (build_signature_pointer_constructor): Deleted the sorry - message that said we can't handle multiple inheritance for - implementations of signatures - (build_signature_method_call): Use the offset from the sigtable - entry instead of the vptr field from the signature pointer for - building a virtual function call. - - * class.c (build_vfn_ref): Deleted signature specific code, we don't - call this function anymore from build_signature_method_call. - - * cp-tree.h (SIGNATURE_VPTR_NAME): Deleted. We use the right vptr - field in the object now instead of in the signature pointer/ref. - (build_vptr_ref): Deleted extern declaration. - * sig.c (build_vptr_ref): Deleted. - (build_signature_pointer_or_reference_type): Deleted construction of - the vptr field. - (build_signature_pointer_constructor): Deleted initialization of/ - assignment to the vptr field. - - * sig.c (build_signature_table_constructor): Convert the signature - table entry fields to their correct types. - - * sig.c (build_signature_table_constructor): Don't call digest_init - for the fields of a sigtable entry, it's wasted time. - - * sig.c (build_signature_table_constructor): Correctly set the - offset and index fields of a sigtable entry. Build the constructor - the way digest_init does, digest_init can't handle initializing an - anonymous union inside a struct. - (build_signature_method_call): Use the index field instead of the - delta field to get the vtable index. - - * decl.c (init_decl_processing): Fix number of fields for building - sigtable_entry_type. - - * cp-tree.h (tag_identifier, offset_identifier): Added extern decls. - (SIGTABLE_CODE_NAME): Renamed to SIGTABLE_TAG_NAME. - (SIGTABLE_PFN_NAME): Deleted, we'll use VTABLE_PFN_NAME instead. - * decl.c (tag_identifier, offset_identifier): New variables to - hold the identifiers for the sigtable fields tag and offset. - (init_decl_processing): Initialize these variables. - (init_decl_processing): Use these variables to build the - sigtable_entry_type structure. Rename the code and offset fields - to tag and delta, respectively; add offset and index fields. Changed - types of fields from short_integer_type_node to delta_type_node. - * sig.c (build_signature_table_constructor): Rename code and offset - to tag and delta, respectively. - (build_signature_method_call): Likewise. Use above variables. - -Thu Jun 1 17:03:51 1995 Jason Merrill - - * decl.c (lookup_name_real): Don't try to look anything up in an - erroneous object. - -Fri Jun 2 10:30:14 1995 Mike Stump - - * method.c (build_overload_int): New routine. Break out - functionality from build_overload_value so we can reuse it. - (build_overload_value): Handle pointer to member functions as value - parameters for templates. - (build_overload_identifier): Since template parameters are shared - among all instantiations, we have to substitute in the real types - in TREE_TYPE (parm). - pt.c (coerce_template_parms): Likewise. - (push_template_decls): Likewise. - (grok_template_type): Deleted as template parameters are shared - among all instantiations. - -Wed May 31 19:10:32 1995 Mike Stump - - * decl.c (grokdeclarator): Always give errors on constant overflow - for array indices. - -Wed May 31 11:39:43 1995 Jason Merrill - - * typeck.c (commonparms): Don't abort if simple_cst_equal returns < 0. - (build_c_cast): Don't tack on a NON_LVALUE_EXPR when casting to - reference type. - (build_indirect_ref): Fix check for *&. - -Fri Jun 16 06:54:03 1995 Mike Stump - - * Version 2.7.0 released. - -Fri Jun 16 15:07:29 1995 Richard Kenner - - * Make-lang.in (DEMANGLER_PROG): Add LIBS. - -Thu Jun 15 15:00:41 1995 Jason Merrill - - * decl.c (define_function): Don't set DECL_INTERFACE_KNOWN. - -Wed Jun 7 20:00:31 1995 Mike Stump - - * *.[chy]: Change all callers of finish_decl to cp_finish_decl. - * decl.c (finish_decl): New routine to handle call backs from the - mid end (declare_hidden_char_array). - -Wed Jun 7 19:02:50 1995 Jason Merrill - - * decl.c (start_function): Handle setting C_C_D here. - (set_C_C_D): Removed. - (struct saved_scope): Remove class_decl. - (push_to_top_level): Don't save current_class_decl. - (pop_from_top_level): Don't restore current_class_decl or C_C_D. - (struct cp_function): Add C_C_D. - (push_cp_function_context): Save C_C_D. - (pop_cp_function_context): Restore C_C_D. - -Fri Jun 2 11:05:58 1995 Jason Merrill - - * decl.c (set_C_C_D): New function. suspend_momentary before - building C_C_D. - (pop_from_top_level): Call it. - (start_function): Likewise. - (pop_cp_function_context): Likewise. - - * class.c, cp-tree.h, decl.c, decl2.c, parse.y: Lose all references - to current_vtable_decl, CLASSTYPE_INST_VAR and CLASSTYPE_VTBL_PTR. - - * decl.c (push_cp_function_context): Save current_class_decl. - (pop_cp_function_context): Restore current_class_decl and set C_C_D. - (pop_from_top_level): Don't use CLASSTYPE_INST_VAR to set C_C_D. - (start_function): Likewise. - - * class.c (popclass): Don't mess with current_class_decl, - current_vtable_decl, or C_C_D. - -Mon May 29 12:45:10 1995 Paul Eggert - - * Make-lang.in (c++.mostlyclean): Remove $(DEMANGLER_PROG). - -Wed May 24 15:55:18 1995 Richard Kenner - - * decl.c (duplicate_decls): Check simple_cst_equal result against 0. - * decl2.c (finish_anon_union): Likewise. - * method.c (largest_union_member): Likewise. - -Wed May 24 14:41:11 1995 H.J. Lu - - * Make-lang.in (cxxmain.o): Replace single quotes with backslashes. - -Mon May 22 17:38:48 1995 Richard Kenner - - * Make-lang.in (g++, g++-cross, cc1plus, DEMANGLER_PROG): - Use $@ instead of output name so works even if have .exe. - (cxxmain.o): Use cp if ln -s fails. - (c++.install-man): Use $(exeext) in executable names. - (c++.mostlyclean, stage[1-4]): Use $(objext) in object file names. - * Makefile.in (../cc1plus): Use $(exeext) in name of executable. - -Wed May 24 01:39:03 1995 Jason Merrill - - * call.c (build_method_call): parms can be null, duh. - -Tue May 23 01:32:09 1995 Jason Merrill - - * call.c (build_method_call): If convert_arguments failed, just bail. - -Fri May 19 10:31:11 1995 Jason Merrill - - * cvt.c (convert_force): Pass LOOKUP_NORMAL to cp_convert. - - * tree.c (copy_to_permanent): Oops. - -Fri May 19 10:01:07 1995 Brendan Kehoe - - * cp-tree.h (break_out_target_exprs): Add decl. - -Thu May 18 13:02:30 1995 Jason Merrill - - * decl.c (start_function): Move *all* interface handling stuff after - the pushdecl. - - * tree.c (mapcar): Renamed from make_deep_copy and generalized. - (perm_manip): Return t if permanent, otherwise 0. - (copy_to_permanent): Use them. - (bot_manip): Helper for break_out_target_exprs. - (break_out_target_exprs): New function. Uses mapcar. - - * typeck.c (convert_arguments): Use it. - - * method.c (hack_identifier): Use convert_from_reference to - dereference a reference. - -Wed May 17 17:54:54 1995 Mike Stump - - * call.c (convert_harshness): Move reference bashing before pointer - to member bashing. - -Wed May 17 16:57:53 1995 Mike Stump - - * cvt.c (convert_to_reference): Only complain, if complaints are - wanted. - * typeck.c (build_function_call_real): Likewise. If - LOOKUP_SPECULATIVELY is set and something won't work, return - NULL_TREE. - * cvt.c (cp_convert): Likewise. Pass flags down to build_method_call. - (convert): Pass LOOKUP_NORMAL to cp_convert. - * typeck.c (convert_for_assignment): Likewise. - (convert_force): Pass LOOKUP_COMPLAIN to cp_convert. - (convert_arguments): Get out early if we get an error_mark_node. - (convert_for_initialization): Use cp_convert instead of convert so - that we can pass flags down. - * cp-tree.h (LOOKUP_SPECULATIVELY): Added documentation. - -Wed May 17 01:43:58 1995 Jason Merrill - - * typeck2.c (store_init_value): Don't take the MAIN_VARIANT of the - decl type. - - * class.c (finish_struct): Don't complain about a class with no - user-defined constructors but with a member that has no default - constructor, as this is OK for aggregates. - - * expr.c (cplus_expand_expr, NEW_EXPR): If this is an explicit - constructor call, mark slot addressable. - -Tue May 16 18:37:51 1995 Douglas Rupp - - * g++.c: Changed WINNT to _WIN32. - -Tue May 16 12:40:16 1995 Jason Merrill - - * lex.c (handle_sysv_pragma): Don't use token_buffer. - -Tue May 16 12:05:26 1995 Mike Stump - - * call.c (resolve_scope_to_name): Add initial semantic support for - namespaces. - * class.c (finish_struct): Likewise. - * cp-tree.h (NAMESPACE_LEVEL): Likewise. - * cvt.c (build_up_reference, convert_to_reference): Likewise. - * decl.c (binding_level::namespace_p, suspend_binding_level): Likewise. - (resume_binding_level, toplevel_bindings_p): Likewise - (namespace_bindings_p, declare_namespace_level): Likewise. - (resume_level, push_namespace, pop_namespace): Likewise. - (pop_everything, pushtag, duplicate_decls, pushdecl): Likewise. - (implicitly_declare, lookup_namespace_name): Likewise. - (lookup_name_real, start_decl, make_temporary_for_reference): Likewise. - (obscure_complex_init, finish_decl, expand_static_init): Likewise. - (grokvardecl, grokdeclarator, parmlist_is_exprlist): Likewise. - (store_parm_decls, hack_incomplete_structures): Likewise. - * decl2.c (get_temp_name, finish_anon_union): Likewise. - (current_namespace, push_namespace, pop_namespace): Likewise. - (do_namespace_alias, do_toplevel_using_decl): Likewise. - (do_class_using_decl): Likewise. - * error.c (dump_decl): Likewise. - * init.c (build_member_call, build_offset_ref): Likewise. - * lex.c (identifier_type): Likewise. - * parse.y (lang_extdef, using_decl, extdef): Likewise. - (component_decl_1, nested_name_specifier_1): Likewise. - * spew.c (yylex): Likewise. - * tree.def (NAMESPACE_DECL): Likewise. - -Tue May 16 11:55:35 1995 Jason Merrill - - * decl.c (push_overloaded_decl): Return the new decl even if it - can't be pushed. - -Tue May 16 11:00:37 1995 Jason Merrill - - * typeck.c (decay_conversion): Split out from default_conversion. - (default_conversion): Call it. - (build_binary_op): Likewise. - (build_binary_op_nodefault): Use decay_conversion for truth ops. - -Mon May 15 12:47:56 1995 Jason Merrill - - * decl.c (warn_extern_redeclared_static): This is a pedwarn. - (duplicate_decls): Always use the old decl's linkage info. Don't - play with linkage of consts. - (pushdecl): Don't play with linkage of consts. - (redeclaration_error_message): Don't complain about an old public - decl and a new non-public decl here. - (grokvardecl): Handle linkage of consts here. - (grokdeclarator): An 'extern inline' is public. Pass constp to - grokvardecl. - (start_function): Wait until after the pushdecl to do some linkage - stuff. - - * decl2.c (import_export_vtable): Make duplicates weak rather than - static if supported. - (import_export_inline): Likewise. - * pt.c (do_pending_expansions): Likewise. - - * class.c (build_vbase_path): flag_assume_nonnull_objects only - affects reference conversion. - - * init.c (emit_base_init): Build up an RTL_EXPR and add it to - rtl_expr_chain. - * decl.c, decl2.c: s/base_init_insns/base_init_expr/. - -Tue May 16 07:06:28 1995 Paul Eggert - - * method.c (numeric_output_need_bar): Renamed from misspelling. - - * typeck.c (build_ptrmemfunc): Fix misspellings in messages. - -Sun May 14 10:26:22 1995 Richard Kenner - - * lang-options.h, lang-specs.h: New files. - -Thu May 11 00:31:48 1995 Jason Merrill - - * typeck.c (default_conversion): Don't check for BLKmode before - pulling out the decl_constant_value. - - * decl.c (start_function): Clear named_labels and shadowed_labels. - - * typeck.c (build_function_call_real): Also synthesize methods here. - -Wed May 10 00:55:59 1995 Jason Merrill - - * decl2.c (finish_file): Synthesize exported methods before the - reconsider loop. - - * parse.y: Move declaration of flag_new_for_scope to file scope. - -Tue May 9 19:10:33 1995 Mike Stump - - * decl2.c: Add flag_new_for_scope for new -ffor-scope flag. - * parse.y (FOR): Conditionalize the pushing and poping of scope for - the for-init-statement upon the new flag_new_for_scope. - * parse.y (try_block): Simplify and use compstmt. - -Mon May 8 12:41:52 1995 Jason Merrill - - * decl.c (define_function): Mark function decl artificial. - -Sun May 7 00:51:28 1995 Jason Merrill - - * parse.y (simple_stmt, FOR): Put back push/pop for condition scope. - - * decl2.c (grokclassfn): DECLs don't have cv-qualified types. - * tree.c (build_cplus_method_type): Likewise. - - * cp-tree.h (SET_DECL_ARTIFICIAL): Just set DECL_ARTIFICIAL to 1. - - * typeck.c (build_function_call_real): If convert_arguments failed, - just bail. - (convert_arguments): If one of the arguments is error_mark_node, - just bail. - -Sat May 6 02:39:41 1995 Jason Merrill - - * decl.c (duplicate_decls): Don't check DECL_NOT_REALLY_EXTERN for - decls that don't include it. - -Fri May 5 14:23:30 1995 Jason Merrill - - * decl.c (duplicate_decls): Decls that have DECL_INTERFACE_KNOWN or - DECL_NOT_REALLY_EXTERN set aren't extern decls. - - * typeck.c (build_indirect_ref): Don't call default_conversion for a - parameter of reference_type. - * cvt.c (convert_from_reference): Just use build_indirect_ref. - - * pt.c (do_type_instantiation): Only instantiate member functions - that actually come from templates. - -Fri May 5 09:46:05 1995 Mike Stump - - * parse.y: Generalized cleanup of poplevels, and compound statements - and compound statements in try blocks. Rewritten `for' rule so that - the scope of variables declared in the for clause is shortened to - span just to the end of the statement, instead of the whole - containing block. - -Fri May 5 00:37:14 1995 Jason Merrill - - * call.c (convert_harshness): Handle pointers to members better. - -Thu May 4 16:00:26 1995 Jason Merrill - - * decl2.c (delete_sanity): Do access control here. - * init.c (build_delete): Instead of here. - - * Make-lang.in: Build c++filt. - -Wed May 3 02:59:53 1995 Jason Merrill - - * decl2.c (cplus_decl_attributes): If we just modified a TYPE_DECL, - update our IDENTIFIER_TYPE_VALUE. - -Fri Apr 28 07:58:41 1995 Jason Merrill - - * lex.c (cons_up_default_function): Fix linkage of #pragma - implemented functions. - -Thu Apr 27 16:56:24 1995 Jason Merrill - - * method.c (build_overload_name): Simplify and fix repeated type - folding. - - * decl.c (grokdeclarator): Prohibit pointers to void or reference - members. - -Thu Apr 27 09:49:07 1995 Mike Stump - - * typeck2.c (process_init_constructor): Make sure initializers are - fully digested. - -Thu Apr 27 01:11:55 1995 Jason Merrill - - * lex.c (cons_up_default_function): Always defer synthesis. - -Thu Apr 27 00:20:37 1995 Jason Merrill - - * decl2.c (mark_inline_for_output): Don't play with pending_inline - stuff. - -Wed Apr 26 17:48:24 1995 Jason Merrill - - * call.c (user_harshness): New function; like build_type_conversion, - but doesn't actually build anything. - (compute_conversion_costs): Use it instead of build_type_conversion. - -Wed Apr 26 17:11:25 1995 Jason Merrill - - * typeck.c (build_function_call_real): Improve error message for - calling a non-function. - - * method.c (hack_identifier): Lose check for calling a data member. - -Wed Apr 26 16:59:13 1995 Mike Stump - - * typeck2.c (build_functional_cast): Remove very old cruft. - Seems like good code is generated without it. - -Wed Apr 26 00:47:16 1995 Jason Merrill - - * method.c (do_build_assign_ref): Fix handling of anonymous unions. - (do_build_copy_constructor): Likewise. - - * parse.y (simple_stmt, SWITCH): Call {push,pop}_switch. - - * decl.c (push_switch): New function. - (pop_switch): Likewise. - (define_case_label): Check for jumping over initialization. - - * call.c (build_method_call): Check for an inline function being - called before its definition has been seen. - * typeck.c (build_function_call_real): Likewise. - - * decl.c (duplicate_decls): Check for a function being redeclared - inline after its address has been taken. - - * typeck.c (build_conditional_expr): Handle related class lvalues. - -Tue Apr 25 13:20:45 1995 Jason Merrill - - * pt.c (do_pending_expansions): Don't expand unused templates. - - * parse.y (component_decl): Accept a lone semicolon. - -Tue Apr 25 00:25:56 1995 Jason Merrill - - * call.c (build_method_call): Don't allow an RTL_EXPR to serve as the - object parameter anymore. - - * expr.c (cplus_expand_expr): Don't create RTL_EXPRs with no insns. - -Mon Apr 24 12:35:48 1995 Jason Merrill - - * parse.y (simple_stmt, decl case): Clear prefix_attributes. - (lang_extdef): Likewise. - - * parse.y (maybe_parmlist): New rule for use in declarators where - this could either be a list of expressions or parameters. Calls - suspend_momentary before deciding which. - (direct_after_type_declarator): Use it. - (complex_direct_notype_declarator): Use it. - - * pt.c (tsubst): Propagate attributes const and noreturn. - - * typeck.c (build_modify_expr): If warn_synth, call build_opfncall - before doing the default thing. - -Thu Apr 27 21:49:36 1995 Doug Evans - - * typeck.c (common_type): Call lookup_attribute instead of - value_member. - -Tue Apr 25 18:07:43 1995 Richard Kenner - - * Make-lang.in: Change "realclean" to "maintainer-clean". - -Sun Apr 23 12:32:38 1995 Mike Stump - - * decl2.c (finish_file): Fix broken linked list handling. - -Fri Apr 21 18:08:43 1995 Jason Merrill - - * class.c (finish_base_struct): Don't set TYPE_HAS_COMPLEX_*_REF - as often. - (finish_struct): Likewise. - - * various: Use TYPE_HAS_TRIVIAL_* instead of TYPE_HAS_COMPLEX_*. - - * cp-tree.h (TYPE_HAS_TRIVIAL_INIT_REF): New macro. - (TYPE_HAS_TRIVIAL_ASSIGN_REF): New macro. - -Fri Apr 21 15:52:22 1995 Jason Merrill - - * typeck.c (c_expand_return): Only expand a returned TARGET_EXPR if - it is of the same type as the return value. - -Fri Apr 21 03:01:46 1995 Jason Merrill - - * decl2.c (finish_file): Reconsider if synthesizing a method wrote - out its assembly. - - * typeck.c (convert_for_initialization): Don't call a trivial copy - constructor. - - * typeck2.c (store_init_value): Only abort if the type has a - non-trivial copy constructor. - - * typeck.c (c_expand_return): If we're returning in a register and - the return value is a TARGET_EXPR, expand it. Only do - expand_aggr_init if we're returning in memory. - (expand_target_expr): Function to expand a TARGET_EXPR. - (build_modify_expr): Use it. - - * tree.c (build_cplus_new): Layout the slot. - - * expr.c (cplus_expand_expr): Use expand_call to expand the call - under a NEW_EXPR, so the target is not discarded. - -Thu Apr 20 14:59:31 1995 Mike Stump - - * gc.c (build_dynamic_cast): Tighten error checking. - -Thu Apr 20 11:23:54 1995 Jason Merrill - - * expr.c (cplus_expand_expr): Only abort if the returned target is - different from what we expected if the type has a non-trivial copy - constructor. - - * decl2.c (cplus_decl_attributes): Attributes applied to a template - really apply to the template's result. - - * tree.c (lvalue_p): Check IS_AGGR_TYPE instead of TREE_ADDRESSABLE - to decide whether to consider a CALL_EXPR an lvalue. - - * class.c (finish_struct_bits): Only set TREE_ADDRESSABLE if the - type has a non-trivial copy constructor. - - * decl.c (start_function): If interface_known, unset - DECL_NOT_REALLY_EXTERN on the function. - -Wed Apr 19 16:53:13 1995 Jason Merrill - - * pt.c (do_function_instantiation): Handle explicit instantiation of - member functions. - (do_type_instantiation): Handle 'inline template class foo', - meaning just spit out the vtable. - - * lex.c (cons_up_default_function): Set DECL_NOT_REALLY_EXTERN on - the consed functions. - - * decl2.c (import_export_inline): Set DECL_INTERFACE_KNOWN. - -Wed Apr 19 16:28:17 1995 Brendan Kehoe - - * call.c, class.c, decl2.c, gc.c, init.c, parse.y, pt.c, search.c, - typeck.c: Include output.h. - -Wed Apr 19 14:57:21 1995 Gerald Baumgartner - - * call.c (build_method_call): Allow a signature member functions to - be called from a default implementation. - -Wed Apr 19 10:21:17 1995 Jason Merrill - - * repo.c (finish_repo): Remember what directory we are in. - - * search.c (expand_upcast_fixups): Don't mess with abort_fndecl. - - * repo.c: Use obstacks instead of fixed-size buffers. Don't spit - out the second copy of the symbol name. Don't remember COLLECT_GCC. - -Wed Apr 19 02:32:40 1995 Mike Stump - - * search.c (virtual_context): New function to get the virtual - context of a function. - (expand_upcast_fixups): New function to generate runtime vtables. - (fixup_virtual_upcast_offsets): Likewise. - (expand_indirect_vtbls_init): Use fixup_virtual_upcast_offsets to - ensure that the this offsets for upcasts from virtual bases into - other virtual bases or non-virtual bases are correct at construction - time and destruction time. - * class.c (fixup_vtable_deltas): Modify to fixup all offsets in all - vtables in all virtual bases, instead of just one vtable in each - virtual base. - (fixup_vtable_deltas1): Likewise. - -Tue Apr 18 03:57:35 1995 Michael Meissner - - * Makefile.in (lex.o): Add dependency on c-pragma.h. - - * lex.c (handle_sysv_pragma): Use NULL_PTR and NULL_TREE as - appropriate, instead of 0. - -Mon Apr 17 12:28:42 1995 Jason Merrill - - * decl.c (pushdecl): Use decls_match, not duplicate_decls, for - comparing local and global decls. - -Fri Apr 14 01:46:52 1995 Jason Merrill - - * typeck.c (convert_arguments): Only prohibit passing to ... of - types with non-trivial copy constructors. - - * repo.c (repo_template_used): Don't try to mess with no id. - -Fri Apr 14 23:32:50 1995 Per Bothner - - * decl.c (duplicate_decls): Use cp_warning_at for redundant-decls. - -Thu Apr 13 15:37:42 1995 Brendan Kehoe - - * cp-tree.h (current_tinst_level): Delete declaration, since it's - static inside pt.c. - - * typeck.c (build_modify_expr): Catch incompatible array assignment. - - * parse.y (attribute_list, attrib): Rewrite actions to feed the - right stuff to decl_attributes. - -Thu Apr 13 11:24:10 1995 Jason Merrill - - * search.c (dfs_debug_mark): Check for magic virtual like - import_export_vtable. - - * typeck.c (build_binary_op_nodefault): Don't call cp_pedwarn with - four args. - -Wed Apr 12 12:02:57 1995 Jason Merrill - - * decl2.c (finish_file): Move prevtable pass before needs_messing_up - decision. - -Tue Apr 11 11:20:27 1995 Jason Merrill - - * decl.c (finish_decl): If we're writing out a static data member of - a class, we want the debug info for that class. - - * gc.c (build_t_desc): Check linkage of a class properly. - - * class.c (finish_struct): Set the 'headof' offset for the main - vtable properly. - (prepare_fresh_vtable): Fix typeinfo pointer here. - (modify_one_vtable): Instead of here. - -Mon Apr 10 12:15:59 1995 Jason Merrill - - * repo.c (repo_get_id): New function to return the interesting - identifier for a repo entity. - (repo_template_used): Use it. - (repo_template_instantiated): Mark the id as chosen. - (init_repo): Record whether or not the id was chosen. - (finish_repo): Note if an id was newly chosen. - - * pt.c (do_function_instantiation): Call repo_template_instantiated. - (do_type_instantiation): Likewise. Don't diagnose multiple - instantiation. - - * decl2.c (finish_file): Use DECL_NOT_REALLY_EXTERN when deciding - whether or not to synthesize a method. - - Undo these changes: - * class.c (finish_vtbls): build more vtables if flag_rtti is on. - * class.c (modify_all_direct_vtables): ditto. - * init.c (expand_direct_vtbls_init): expand more vtables if - flag_rtti is on. - -Sat Apr 8 17:45:41 1995 Mike Stump - - * gc.c (build_headof): Use ptrdiff_type_node instead of - integer_type_node on pointer arithmetic. - -Sat Apr 8 11:57:04 1995 Jason Merrill - - * typeck.c (build_modify_expr): Undo previous change. - -Thu Apr 6 01:23:50 1995 Jason Merrill - - * Makefile.in (compiler): Remove ../cc1plus before rebuilding it. - - * repo.c (get_base_filename): Put the .rpo file in the directory - with the object file, not the source. - - * typeck.c (build_conditional_expr): Handle pmf's better. - - * repo.c (finish_repo): Also use ASM_OUTPUT_LABELREF to print out - the name of the symbol. - -Wed Apr 5 15:24:12 1995 Jason Merrill - - * repo.c (open_repo_file): Make repo filename DOS-compliant. - (*): Also write a new repo file if some previously-used - templates are no longer used. Only remember the identifier. - - * lex.c (cons_up_default_function): If this function belongs to a - template class, call repo_template_used for it. - - * repo.c (repo_template_used): Using a class means using its vtable, - if any. - (finish_repo): Likewise. - - * typeck.c (build_modify_expr): Only wrap TARGET_EXPRs in RTL_EXPRs - if the type has a complex copy constructor. - - * decl2.c (lang_decode_option): -frepo implies - -fno-implicit-templates. - - * decl.c (start_function): Clear current_{base,member}_init_list. - - * lex.c (init_lex): Also unset *_eq if ! flag_operator_names. - -Tue Apr 4 16:11:08 1995 Jason Merrill - - * decl.c (struct cp_function): Add {base,member}_init_list. - (push_cp_function_context): Save current_{base,member}_init_list. - (pop_cp_function_context): Restore them. - -Mon Apr 3 16:55:08 1995 Jason Merrill - - * repo.c (get_base_filename): Take filename parm, fix logic bug. - - * typeck.c (build_compound_expr): Do not warn about a compound expr - in which the first expression has no side effects. - (build_x_compound_expr): Warn here instead. - (build_conditional_expr): Don't warn about a conditional expression - between an enum and the type it promotes to. - - * init.c (build_new): Handle initialization of arrays of builtins - properly. - -Mon Apr 3 15:08:04 1995 Brendan Kehoe - - * repo.c: Include config.h to get definitions of bcopy and rindex - on systems that don't have them (e.g., SVR4). - -Mon Apr 3 14:41:55 1995 Mike Stump - - * decl2.c (finish_table): Pass NULL_TREE instead of init to - finish_decl so that it won't try and do error checking on the - initializer. - -Mon Apr 3 10:45:50 1995 Jason Merrill - - * repo.c (get_base_filename): Analyze COLLECT_GCC_OPTIONS to - determine whether this compile used -c -o. - (open_repo_file): Use get_base_filename. Remove the extension. - (finish_repo): Spit out the values of main_input_filename, - COLLECT_GCC and COLLECT_GCC_OPTIONS. - - * parse.y (structsp): Add TYPENAME_KEYWORD complex_type_name. - -Sun Apr 2 23:43:51 1995 Jason Merrill - - * search.c (compute_access): Don't try to do access control on - nested types. - -Fri Mar 31 10:14:23 1995 Jason Merrill - - * repo.c: New file to handle things repo. - - * pt.c (instantiate_template): Call repo_template_used if the - definition is accessible. - (mark_function_instantiated): Split out from - do_function_instantiation. - (mark_class_instantiated): Split out from do_type_instantiation. - - * parse.y (template_instantiate_once): Call repo_template_used. - - * lex.c (lang_init): Call init_repo. - - * decl2.c: Handle flag_use_repository. - (finish_file): Call finish_repo. - - * decl.c (start_method): Call repo_template_used if this is a - template method. - - * Makefile.in (CXX_OBJS): Add repo.o. - (repo.o): Add dependencies. - - * Make-lang.in (CXX_SRCS): Add repo.c. - - * decl.c (start_function): If DECL_INTERFACE_KNOWN and - DECL_NOT_REALLY_EXTERN are both set, unset DECL_EXTERNAL. - - * typeck.c (build_binary_op_nodefault): Identify the invalid operand - types used. - - * decl.c (duplicate_decls): Propagate DECL_NOT_REALLY_EXTERN. - -Thu Mar 30 17:54:42 1995 Jason Merrill - - * typeck.c (build_binary_op_nodefault): Tidy up use of build_type - and result_type. When checking for comparison between signed - and unsigned, use result_type rather than the (possibly shortened) - type of op0. Also, don't warn about equality comparison of a - signed operand to an unsigned constant that fits in the signed - type. - - * method.c (do_build_copy_constructor): Reverse - current_base_init_list after we've built it up. - -Thu Mar 30 14:35:18 1995 Mike Stump - - * except.c (build_throw): Never warn about the value of throw not - being used. - -Thu Mar 30 13:16:54 1995 Mike Stump - - * except.c (expand_start_catch_block): Check for bad catch parameter - declarations. - -Thu Mar 30 13:06:11 1995 Jason Merrill - - * decl.c (finish_function): Only set DECL_NOT_REALLY_EXTERN if - DECL_EXTERNAL is not already set. - -Thu Mar 30 11:26:24 1995 Mike Stump - - * method.c (emit_thunk): Let poplevel know that the last level is - for a function so it can create a BLOCK_NODE and set DECL_INITIAL. - -Thu Mar 30 11:15:06 1995 Jason Merrill - - * decl2.c (import_export_inline): Don't set DECL_NOT_REALLY_EXTERN - here. - - * decl.c (grokdeclarator): OK, don't abort if we see a decl with - METHOD_TYPE. - (finish_function): Set DECL_EXTERNAL and DECL_NOT_REALLY_EXTERN on - all deferred inlines. - -Wed Mar 29 19:35:02 1995 Jason Merrill - - * cp-tree.h (DECL_THIS_INLINE): New macro. - (DECL_NOT_REALLY_EXTERN): New macro. - (DECL_THIS_STATIC): New macro. - - * decl.c: Lose all references to current_extern_inline. Break - inline semantics into DECL_INLINE for actual inlining and - DECL_THIS_INLINE for the linkage wierdness. Use DECL_THIS_STATIC. - * decl2.c: Use DECL_NOT_REALLY_EXTERN to indicate that we want to - emit an inline here. Associated changes. - * lex.c: Likewise. - * pt.c: Likewise. - * typeck.c: Likewise. - - * call.c (build_method_call): Don't bother trying to handle inlines - specially. - * cvt.c (convert_to_aggr): Likewise. - - * pt.c (do_function_instantiation): Handle instantiation of - public inlines, too. - -Wed Mar 29 16:04:25 1995 Mike Stump - - * except.c (init_exception_processing): Change the interface for - __throw_type_match and add decl for new rtti matching routine - __throw_type_match_rtti. - (build_eh_type): New routine to build a run time descriptor for the - expression given. - (expand_start_catch_block): Update to use new calling convention for - the matcher. - (expand_throw): Update to use build_eh_type. - -Mon Mar 27 07:14:33 1995 Warner Losh - - * g++.c: Removed __NetBSD__ from conditional. - Declare strerror if HAVE_STRERROR is defined; otherwise - declare sys_errlist and sys_nerr. - (my_strerror): New function. - -Tue Mar 28 14:16:35 1995 Jason Merrill - - * search.c (get_binfo): Don't try to be so clever. - - * tree.c (copy_to_permanent): Also suspend_momentary(). - - * cvt.c (cp_convert_to_pointer): Hand off to convert_fn_pointer even - if the types are the same. - - * decl.c (start_function): Handle extern inlines more like C++ says - we should. - - * init.c (build_member_call): Hand constructor calls off to - build_functional_cast. - - * typeck2.c (build_functional_cast): Use DECL_NESTED_TYPENAME to get - the name of the type. - -Tue Mar 28 13:13:56 1995 Brendan Kehoe - - * decl.c (grokdeclarator): Check for the decl returned by - grokfndecl to be null before using build_decl_attribute_variant. - -Mon Mar 27 18:04:41 1995 Brendan Kehoe - - * init.c (build_new): Use build_pointer_type instead of - TYPE_POINTER_TO. - -Fri Mar 24 12:11:24 1995 Jason Merrill - - * typeck.c (build_conditional_expr): Handle pmfs. - (convert_for_assignment): Fix pmf support. - - * cvt.c (convert_fn_ptr): Support !flag_vtable_thunks. - (cp_convert_to_pointer): Handle pmfs. - (cp_convert): Pass pmfs to cp_convert_to_pointer. - - * typeck.c (common_type): Handle inheritance for pmfs. - - * typeck2.c (build_m_component_ref): Do access control. - - * typeck.c (comp_target_types): Check for conversion to void * - before checking trickier conversions. - - * decl.c (duplicate_decls): Propagate DECL_ABSTRACT_VIRTUAL_P. - - * pt.c (push_tinst_level): Complain if template instantiation depth - is greater than max_tinst_depth. - - * typeck.c (common_type): Assume that we can call common_type to - unify the target type of a pointer. - -Thu Mar 23 00:48:44 1995 Jason Merrill - - * decl2.c (finish_file): Don't synthesize methods at - finish_vtable_prevardecl time. Do synthesize methods that are not - used, but are public and not external. - - * cvt.c (build_type_conversion): Only give an error if for_sure. - - * typeck.c (comp_target_types): Only support pointer conversions if - nptrs > 0. - -Wed Mar 22 19:30:15 1995 Brendan Kehoe - - * init.c (build_new): Catch use of an initializer list where it - shouldn't be. - -Wed Mar 22 16:21:07 1995 Jason Merrill - - * init.c (build_new): Wrap alloc_expr in an RTL_EXPR if nelts is - non-constant. - - * decl2.c: temp_name_counter is now public. - - * decl.c (struct cp_function): Add temp_name_counter field. - (push_cp_function_context): Save it. - (pop_cp_function_context): Restore it. - - * typeck.c (common_type): Handle unifying function types, and unify - unmatched things to void* with a compiler_error, rather than - silently like before. - -Wed Mar 22 15:10:34 1995 Mike Stump - - * decl2.c (finish_prevtable_vardecl, finish_vtable_vardecl): Revert - Brendan's last change and fix latent problem that causes TD entries - to not come out when the things that need them has yet to be - expanded. - -Wed Mar 22 15:12:00 1995 Jason Merrill - - * typeck.c (build_binary_op_nodefault, comparison ops): Update type0 - and type1, since we might have changed op0 or op1. - -Wed Mar 22 13:33:45 1995 Jason Merrill - - * typeck.c (common_type): Don't mess up templates. - -Wed Mar 22 04:56:00 1995 Jason Merrill - - * typeck.c (common_type): Handle ptms properly. Also handle - T* -> void*. - (build_binary_op_nodefault): New variable build_type controls what - type is given to the expression when it is created. Set this to - boolean_type_node for comparison ops instead of using result_type. - (comp_target_types): Allow T * -> void *. - - * cvt.c (cp_convert_to_pointer): Do access control when converting - ptms, too. - -Tue Mar 21 17:25:06 1995 Brendan Kehoe - - * parse.y (extern_lang_string): Catch use of linkage specs that - aren't all naming the same language. - - * class.c (finish_struct): Delete accidental duplicate code. - -Tue Mar 21 14:00:57 1995 Jason Merrill - - * typeck.c (build_binary_op_nodefault): Disable pedwarns about - comparing functions and incomplete types. - - * decl.c (finish_function): Only unset current_function_decl if - !nested. - (duplicate_decls): Last change went too far; we only want to stop - checking for value/reference ambiguity. - -Tue Mar 21 01:26:39 1995 Mike Stump - - * gc.c (build_generic_desc): Zap the DECL_SIZE so that we can lay it - out fresh, as the new type may be larger. - -Mon Mar 20 19:01:10 1995 Jason Merrill - - * expr.c (extract_init): Try to expand the RTL for the - initialization and figure out what it will look like so we can avoid - run-time initialization. Disabled for now. - (extract_scalar_init): Helper for scalar initialization. - (extract_aggr_init): Helper for aggregate initialization. - - * decl.c (duplicate_decls): Don't complain about ambiguous - declarations. - (obscure_complex_init): Now returns a tree. Call extract_init if - we're optimizing and this is a toplevel decl. - (finish_decl): Update accordingly. - - * lex.c (check_newline): If we're just changing files (not pushing - or popping), update input_file_stack->name. - -Mon Mar 20 17:55:04 1995 Mike Stump - - * pt.c (type_unification): Only TEMPLATE_DECLs are handled right now - in the transitive unification code. - -Mon Mar 20 16:07:50 1995 Brendan Kehoe - - * decl.c (shadow_tag): Don't allow inline, virtual, or explicit on - non-functions. - (grokdeclarator): Don't allow friends to be defined in local classes. - -Sat Mar 18 04:03:33 1995 Jason Merrill - - * decl2.c (finish_prevtable_vardecl): Use DECL_DECLARED_STATIC - rather than DECL_SAVED_INSNS to decide whether or not this method - was declared inline. - - * method.c (synthesize_method): Turn off DECL_INLINE if - function_cannot_inline_p thinks we're too large. - - * typeck.c (build_indirect_ref): Use build_expr_type_conversion. - -Fri Mar 17 17:47:36 1995 Jason Merrill - - * class.c (instantiate_type): Handle pmfs. - - * typeck.c (convert_for_assignment): Check types when assigning one - pmf to another. - - * decl.c (define_label): Fix logic for printing out the name of the - label in an error message. - - * error.c (dump_expr): Support ARRAY_REF. - -Fri Mar 17 17:43:02 1995 Brendan Kehoe - - * decl2.c (finish_vtable_vardecl): Call build_t_desc here. - (finish_prevtable_vardecl): Instead of here. - -Fri Mar 17 14:40:45 1995 Jason Merrill - - * decl.c (expand_static_init): Also use expand_aggr_init if the - initializer is a TREE_LIST. - (grokdeclarator): Only pedwarn about extra qualification if -pedantic. - - * pt.c (unify): Fix unification of return type. - - * expr.c (fixup_result_decl): Use store_expr, rather than - emit_move_insn, to move the return value into the place where - callers will expect it. - -Thu Mar 16 22:05:25 1995 Jason Merrill - - * init.c (build_offset_ref): Call assmble_external on functions. - * typeck.c (build_component_ref): Likewise. - -Thu Mar 16 20:28:16 1995 Brendan Kehoe - - * decl.c (struct saved_scope): Add members base_init_list and - member_init_list. - (push_to_top_level): Save current_base_init_list and - current_member_init_list to them. - (pop_from_top_level): Put it back. - -Thu Mar 16 19:21:14 1995 Jason Merrill - - * pt.c (instantiate_template): Call assemble_external. - -Thu Mar 16 18:07:54 1995 Brendan Kehoe - - * class.c: Include rtl.h, to get NULL_RTX. - (finish_struct): Also zero out DECL_SAVED_INSNS, to avoid problems - on hosts with different sizes for each part of the union. - * tree.c: Also include rtl.h. - (layout_basetypes): Same change for DECL_SAVED_INSNS. - -Thu Mar 16 13:57:36 1995 Jason Merrill - - * pt.c (unify): Fix array domain unification for 64-bit targets. - - * decl2.c (finish_file): Push bizarre type decl before walking the - vtables the first time. - (walk_vtables): OK, don't set prev to vars if the vardecl_fn messed - with TREE_CHAIN (prev). - - * init.c (emit_base_init): Use convert_pointer_to_real instead of - convert_pointer_to when converting to a direct base. - -Wed Mar 15 20:26:29 1995 Mike Stump - - * pt.c (type_unification): Handle transitive unification better. - -Wed Mar 15 13:56:16 1995 Jason Merrill - - * decl2.c (walk_vtables): Always set prev to vars. - (mark_vtable_entries): Call assemble_external on the vtable entries. - - * class.c (finish_struct): Set the vtable's size to NULL_TREE before - calling layout_decl, so that it gets updated properly. - - Finally re-enable dynamic synthesis. This time it works. - * method.c (synthesize_method): Pass decl_function_context (fndecl) - to {push,pop}_cp_function_context. - * decl.c (push_cp_function_context): Now takes a tree argument. - (pop_cp_function_context): Likewise. - * call.c (build_method_call): Enable synthesis. - * lex.c (cons_up_default_function): Likewise. - -Tue Mar 14 19:14:19 1995 Doug Evans - - * parse.y (setattrs): Chain onto prefix_attributes rather than - setting it. - -Wed Mar 15 13:00:00 1995 Brendan Kehoe - - * decl.c (pushdecl): Check if the type of the VAR_DECL is an - error_mark_node before trying to read TYPE_LANG_SPECIFIC. - -Mon Mar 13 21:00:28 1995 Brendan Kehoe - - * decl.c (grokdeclarator, case ARRAY_REF): Wrap the exp with fold, - and convert the size and integer_one_node to the index type. - -Mon Mar 13 08:01:02 1995 Jason Merrill - - * typeck.c (get_member_function_from_ptrfunc): Save the instance - argument, and tack it onto the front of the COND_EXPR to make the - semantics come out right. Grab the instance argument from - '*instance_ptrptr', rather than having it passed in separately. - - * various: Change various consed-up comparison operations to have - boolean type. Remove the instance argument in calls to - get_member_function_from_ptrfunc. - - * error.c (dump_expr): Dump true and false as "true" and "false". - - * decl2.c (finish_file): Also set DECL_STATIC_FUNCTION_P on the - global init function. - - * decl.c (finish_function): Only set DECL_EXTERNAL here if the - inline function is public. - -Sat Mar 11 00:58:03 1995 Jason Merrill - - * init.c (is_friend): Be more careful about checking - DECL_CLASS_CONTEXT on non-member functions. - - * decl2.c (finish_vtable_vardecl): Don't bother calling - assemble_external here. - (prune_vtable_vardecl): New function that just splices out the - vtable decl from the top-level decls. - (import_export_inline): Unset DECL_EXTERNAL at first. - (finish_file): Don't bother calling assemble_external here. Do - splice out all of the vtables. - -Fri Mar 10 14:42:29 1995 Jason Merrill - - * decl.c (finish_function): If we're not emitting the function yet, - call assemble_external for it. - - * decl2.c (finish_prevtable_vardecl): Don't call mark_vtable_entries - here. - (finish_vtable_vardecl): Don't do the linkage deduction thing here. - Also don't splice out the current vtable if it is unused. - (finish_file): Move the second walk_vtables and the synthesis check - inside the 'reconsider' loop. Move thunk emission after the - 'reconsider' loop. - -Thu Mar 9 16:28:16 1995 Brendan Kehoe - - * pt.c (tsubst): Don't bother calling cp_build_type_variant, since it - was passing bogus values for readonly and volatile from the original - template decl, not the resultant type of the tsubst call. - - * class.c (duplicate_tag_error): Use cp_error_at to point out the - previous definition of the tag. - -Thu Mar 9 10:46:17 1995 Jason Merrill - - * decl.c (start_function): Clear base_init_insns and protect_list. - (struct cp_function): Add base_init_insns field. - (push_cp_function_context): Also save base_init_insns. - (pop_cp_function_context): Also restore base_init_insns. - -Wed Mar 8 13:31:44 1995 Jason Merrill - - * init.c (member_init_ok_or_else): Check for initializing a static - member here. - (emit_base_init): Instead of here. - -Tue Mar 7 16:03:26 1995 Jason Merrill - - * call.c (build_method_call): Disable synthesis as needed. - * lex.c (cons_up_default_function): Likewise. - -Tue Mar 7 10:14:29 1995 Brendan Kehoe - - * parse.y: New rules to allow attributes in a prefix position. - (prefix_attributes): New variable. Pass it into cplus_decl_attributes. - (setattr): New rule. - (reserved_declspecs, declmods): Catch attributes here. - * decl2.c (cplus_decl_attributes): Add PREFIX_ATTRIBUTES argument. - * decl.c (duplicate_decls): Pass DECL_MACHINE_ATTRIBUTES to - descendent typedef. - (grokdeclarator): Added code to support machine attributes. - * Makefile.in (stamp-parse): Expect 5 shift/reduce failures. - -Mon Mar 6 15:07:02 1995 Jason Merrill - - * call.c (build_method_call): Don't synthesize methods outside of a - function. - - Make base initialization more re-entrant so that synthesis on the - fly will work (and, eventually, template instantation on the fly). - * init.c (sort_member_init): Don't bother with members that can't be - initialized. Reorganize a bit. Don't initialize base members here. - (sort_base_init): New function, like sort_member_init, but for base - classes. Steals some code from emit_base_init. - (emit_base_init): Simplify. Call sort_{member,base}_init before - doing any initialization, so we don't have to save - current_{member,base}_init_list in push_cp_function_context. - (expand_aggr_vbase_init_1): Adjust for sort_base_init. - (expand_aggr_vbase_init): Simplify. - * decl.c (struct cp_function): Add protect_list field. - (push_cp_function_context): Also save protect_list. - (pop_cp_function_context): Also restore protect_list. - * call.c (build_method_call): Enable synthesis at point of call. - * lex.c (cons_up_default_function): Likewise. - - * parse.y: Turn -ansi checks back into -pedantic checks. - - * init.c (build_new): Fix -fcheck-new for array new. - -Sat Mar 4 15:55:42 1995 Fergus Henderson - - * typeck.c (build_compound_expr): warn if left-hand operand of - comma expression has no side-effects. - -Fri Mar 3 15:16:45 1995 Jason Merrill - - * parse.y (primary): Change 'object qualified_id *' rules to 'object - overqualified_id *'. - -Fri Mar 3 12:48:17 1995 Brendan Kehoe - - * parse.y (unary_expr): Catch doing sizeof an overloaded function. - Make the error look the same as the one we issue in c_sizeof. - - * typeck.c (build_binary_op_nodefault): Give an error for trying - to compare a pointer-to-member to `void *'. - -Fri Mar 3 11:28:50 1995 Jason Merrill - - * typeck.c (build_unary_op): Handle bool increment with smoke and - mirrors here, rather than in expand_increment where it belongs, - because Kenner doesn't agree with me. - -Fri Mar 3 00:08:10 1995 Brendan Kehoe - - * decl.c (grokparms): Catch a PARM_DECL being used for a default - argument as well. - -Thu Mar 2 20:05:54 1995 Brendan Kehoe - - * init.c (build_new): Don't allow new on a function type. - - * parse.y (primary): Avoid a crash when seeing if the arg is of - the same type as that given for the typespec in an explicit dtor call. - -Thu Mar 2 00:49:38 1995 Jason Merrill - - * decl.c (finish_function): Change test for calling - mark_inline_for_output. - -Wed Mar 1 11:23:46 1995 Jason Merrill - - * typeck.c (build_modify_expr): Complain if - build_default_binary_type_conversion fails. - - * init.c (expand_default_init): Handle arguments of unknown type - properly. - - * cvt.c (build_expr_type_conversion): Only complain about ambiguity - if 'complain'. - * various: Pass 'complain'. - - * typeck.c (comptypes): Be more picky about comparing UPTs. - -Wed Mar 1 11:03:41 1995 Brendan Kehoe - - * decl.c (grokdeclarator): If declarator is null, say that the - type used has an incomplete type. - -Wed Mar 1 10:06:20 1995 Jason Merrill - - * pt.c (instantiate_template): Copy the template arguments to the - permanent_obstack. Also use simple_cst_equal to compare them when - looking for a previous instantiation. - - * tree.c (make_deep_copy): Support copying INTEGER_TYPEs (assuming - they are array domain types). - -Tue Feb 28 23:24:55 1995 Jason Merrill - - * cp-tree.h: Define WANT_* constants for passing to - build_expr_type_conversion. - * cvt.c (build_expr_type_conversion): New function to build - conversion to one of a group of suitable types. - (build_default_binary_type_conversion): Use it. - * decl2.c (grok_array_decl): Likewise. - * typeck.c (build_unary_op): Likewise. - (build_array_ref): Tidy up a bit. - (build_binary_op): Likewise. - -Tue Feb 28 19:57:31 1995 Brendan Kehoe - - * decl.c (grokdeclarator): Don't allow decl of an argument as `void'. - -Tue Feb 28 17:23:36 1995 Jason Merrill - - * parse.y (typed_declspecs1): Add 'typespec reserved_typespecquals - reserved_declspecs' rule. - - * parse.y (expr_or_declarator): Remove notype_qualified_id rule. - (direct_notype_declarator): Likewise. - (complex_direct_notype_declarator): Add notype_qualified_id rule. - - * lex.c (real_yylex): Handle :> digraph properly. - -Tue Feb 28 12:26:29 1995 Brendan Kehoe - - * decl.c (grokdeclarator): Check if it's a friend, not if it's - non-virtual, that's being initialized. Move the check up to - before FRIENDP would get cleared. Catch an unnamed var/field - being declared void. Say just `field' instead of `structure field' - in the error message. Only go for the operator name if DECLARATOR - is non-null. - -Tue Feb 28 00:08:01 1995 Jason Merrill - - * decl.c (start_function): Complain about abstract return type. - (grokdeclarator): Complain about declaring constructors and - destructors to be const or volatile. Complain about declaring - destructors to be static. - - * pt.c (uses_template_parms): Handle pmfs. - - * decl.c (grokdeclarator): Don't call variable_size for array bounds - that only depend on template constant parameters. - -Mon Feb 27 15:38:16 1995 Brendan Kehoe - - * error.c (dump_decl): Only look to see if it's a vtable if we - actually have a name to check out. - -Mon Feb 27 13:37:53 1995 Jason Merrill - - * cvt.c (convert_to_aggr): Lose misleading shortcut. - -Sun Feb 26 17:27:32 1995 Doug Evans - - * decl.c (set_nested_typename): Always set DECL_IGNORED_P, - not just for dwarf. - -Sun Feb 26 00:10:18 1995 Brendan Kehoe - - * decl.c (grokdeclarator): Don't allow a static member to be - declared `register'. - - * init.c (make_friend_class): Move up to a pedwarn for the warning - about a class declaring friends with itself. - - * decl.c (grokdeclarator): You can't do `volatile friend class foo' - or `inline friend class foo'. Only try to make a friend out of - TYPE if we didn't already reset it to integer_type_node. - -Sat Feb 25 22:32:03 1995 Brendan Kehoe - - * decl.c (grokdeclarator): Don't allow initialization of a - non-virtual function. - - * decl.c (start_function): Do a pedwarn if we're changing `main' - to have an int return type. - -Sat Feb 25 00:02:05 1995 Jason Merrill - - * typeck.c (build_modify_expr): Handle simple assignment from - TARGET_EXPRs by building up an RTL_EXPR to force expansion. Whew. - -Fri Feb 24 18:27:14 1995 Brendan Kehoe - - * decl.c (grokdeclarator): Also don't allow virtual outside of a - class decl for a scope method definition performed at global binding. - - * init.c (build_offset_ref): Don't allow creation of an OFFSET_REF - of a bitfield. - - * decl.c (grokdeclarator): Don't allow a const to be declared mutable. - - * typeck.c (build_binary_op): Return an error_mark_node if either - one of the args turned into an error_mark_node when we tried to - use default_conversion. - - * typeck.c (build_unary_op): Forbid using postfix -- on a bool. - - * decl.c (grokdeclarator): Allow `signed' and `unsigned' to be - used on `__wchar_t'. - -Fri Feb 24 13:59:53 1995 Mike Stump - - * except.c (end_protect_partials): Do it the right way. - -Wed Feb 22 15:42:56 1995 Jason Merrill - - * typeck.c (build_binary_op_nodefault): Upgrade warning about - comparing distinct pointer types to pedwarn. - - * typeck2.c (digest_init): Cope with extra braces. - - * typeck.c (build_binary_op_nodefault): Use tree_int_cst_sgn instead - of INT_CST_LT (..., interger_zero_node). - -Wed Feb 22 14:45:52 1995 Brendan Kehoe - - * except.c [!TRY_NEW_EH] (end_protect_partials): Define dummy - function for systems that don't have EH. - -Tue Feb 21 19:18:31 1995 Jason Merrill - - * call.c (can_convert_arg): Like can_convert, but takes an arg as - well. - - * pt.c (type_unification): Allow implicit conversions for parameters - that do not depend on template parameters. - -Tue Feb 21 18:43:48 1995 Douglas Rupp - - * Make-lang.in, config-lang.in: ($exeext): New macro. - * Make-lang.in: Try a "cp" if "ln" fails. - * cp-tree.h (decl_attributes): Added argument. - * decl2.c (cplus_decl_attribute): Add arg to decl_attributes. - * cp/g++.c: Added #ifdefs for sys/file.h and process.h for NT. - Modified spawnvp to have to correct number of arguments for OS/2, NT. - -Tue Feb 21 18:36:55 1995 Mike Stump - - * decl.c (finish_function): Add calls to end_protect_partials to end - the exception region that protects constructors so that partially - constructed objects can be partially destructed when the constructor - throws an exception. - * init.c (perform_member_init, sort_member_init, emit_base_init): - Added support for partially constructed objects. - * init.c (build_partial_cleanup_for): New routine to do partial - cleanups of a base class. - * decl2.c (finish_file): Move the emitting of the exception table - down, after we emit all code that might have exception regions in - them. - * except.c (end_protect_partials, might_have_exceptions_p): New - routines. - (emit_exception_table): Always output table if called. - * cp-tree.h (protect_list, end_protect_partials, - might_have_exceptions_p, emit_exception_table): Added. - -Tue Feb 21 16:05:59 1995 Brendan Kehoe - - * gc.c (build_typeid): Pass a NULL_TREE, not the bogus, unused - address of a local variable. - * class.c (build_vfn_ref): Only try to build the PLUS_EXPR if we - were given a non-null PTR_TO_INSTPTR. - -Tue Feb 21 01:53:18 1995 Jason Merrill - - * decl.c (duplicate_decls): Always lay out the merged decl. - - * decl2.c (finish_vtable_vardecl): Don't do vtable hack on templates. - (finish_prevtable_vardecl): Likewise. - - * method.c (synthesize_method): Set interface_{unknown,only} - according to the settings for our class, not the file where it comes - from. - -Sat Feb 18 12:26:48 1995 Mike Stump - - * except.c: Handle systems that define __i386__ but not __i386. - -Fri Feb 17 15:31:31 1995 Jason Merrill - - * decl2.c (reparse_decl_as_expr): Support being called without a - type argument. - - * parse.y (primary): Add '(' expr_or_declarator ')'. Adds 4 r/r - conflicts. Sigh. - -Fri Feb 17 12:02:06 1995 Mike Stump - - * parse.y (template_def, fndef, fn.def1, return_init, condition, - initdcl0, initdcl, notype_initdcl0, nomods_initdcl0, - component_decl_1, after_type_component_declarator0, - notype_component_declarator0, after_type_component_declarator, - notype_component_declarator, after_type_component_declarator, - full_parm, maybe_raises, exception_specification_opt): Fix up, - include exception_specification_opt maybeasm maybe_attribute and - maybe_init if missing. Rename maybe_raises to - exception_specification_opt to match draft wording. Use maybe_init - to simplify rules. - -Fri Feb 17 01:54:46 1995 Jason Merrill - - * init.c (build_new): Set TREE_NO_UNUSED_WARNING on COMPOUND_EXPRs - built for news of scalar types. - -Thu Feb 16 17:48:28 1995 Jason Merrill - - * typeck.c (build_binary_op_nodefault): Update code for warning - about signed/unsigned comparisons from C frontend. Realize that the - code in the C frontend is, if anything, even more bogus. Fix it. - (build_binary_op): Undo default_conversion if it wasn't useful. - - * typeck.c (build_unary_op, ADDR_EXPR): Lose bogus special case for - PRE*CREMENT_EXPR. - - * decl2.c (import_export_vtable): Don't try the vtable hack - if the class doesn't have any real non-inline virtual functions. - (finish_vtable_vardecl): Don't bother trying to find a non-inline - virtual function in a non-polymorphic class. - (finish_prevtable_vardecl): Likewise. - - * decl2.c (import_export_vtable): Use and set DECL_INTERFACE_KNOWN. - - * cp-tree.h (DECL_INTERFACE_KNOWN): Use DECL_LANG_FLAG_5. - - * init.c (expand_virtual_init): Always call assemble_external. - - * class.c (build_vfn_ref): Always call assemble_external. - (build_vtable): Always call import_export_vtable. - (prepare_fresh_vtable): Likewise. - (add_virtual_function): Don't bother setting TREE_ADDRESSABLE. - -Thu Feb 16 03:28:49 1995 Jason Merrill - - * class.c (finish_struct): Use TYPE_{MIN,MAX}_VALUE to determine - whether an enumerated type fits in a bitfield. - -Wed Feb 15 15:38:12 1995 Jason Merrill - - * class.c (grow_method): Update method_vec after growing the class - obstack. - -Wed Feb 15 13:42:59 1995 Mike Stump - - * parse.y (handler_seq): Push a level for the catch parameters. - -Wed Feb 15 12:42:57 1995 Jason Merrill - - * init.c (emit_base_init): Update BINFO_INHERITANCE_CHAIN on my - bases, in case they've been clobbered. - -Wed Feb 15 12:07:29 1995 Mike Stump - - * class.c (finish_base_struct): Set up BINFO_INHERITANCE_CHAIN here, - so that one day it will always be valid. - * tree.c (propagate_binfo_offsets, layout_vbasetypes): Likewise. - - * cp-tree.h (copy_binfo): Removed, unused. - * tree.c (copy_binfo): Likewise. - -Wed Feb 15 00:05:30 1995 Jason Merrill - - * init.c (build_new): Save the allocation before calling - expand_vec_init on it. - - * decl.c (finish_enum): The TYPE_PRECISION of the enum type mush - match the TYPE_PRECISION of the underlying type for constant folding - to work. - -Tue Feb 14 15:31:25 1995 Mike Stump - - * except.c (push_eh_entry, expand_start_all_catch, - expand_leftover_cleanups, expand_end_catch_block): Keep track of - the context in which the exception region occurs. - (build_exception_table): If the region was not output, don't output - the entry in the eh table for it. - -Tue Feb 14 02:15:43 1995 Jason Merrill - - * init.c (expand_default_init): Only use a previous constructor call - if it's a call to our constructor. Does the word "Duh" mean - anything to you? - - * decl.c (grokparms): Fine, just don't call - convert_for_initialization at all. OK? Happy now? - -Mon Feb 13 02:23:44 1995 Jason Merrill - - * cp-tree.h (CLASSTYPE_FIRST_CONVERSION): Make sure that the class - method vector has a second element before returning it. - - * decl.c (grokparms): Don't strip REFERENCE_TYPE before calling - convert_for_initialization. - -Sun Feb 12 03:57:06 1995 Jason Merrill - - * typeck.c (build_modify_expr): Compare function name to - constructor_name (current_class_type) instead of current_class_name. - - * decl.c (grokparms): Don't do anything with the return value of - convert_for_initialization. - - * error.c (dump_decl): Also dump_readonly_or_volatile on the decl. - - * decl.c (duplicate_decls): Tweak error message. - - * typeck.c (build_const_cast): Implement checking. - (build_reinterpret_cast): Implement some checking. - - * cp-tree.h (CONV_FORCE_TEMP): Require a new temporary when - converting to the same aggregate type. - (CONV_STATIC_CAST): Include it. - (CONV_C_CAST): Likewise. - * cvt.c (convert_force): Use CONV_C_CAST instead of CONV_OLD_CONVERT. - (cp_convert): Only force a new temporary if CONV_FORCE_TEMP. - -Fri Feb 10 16:18:52 1995 Jason Merrill - - * typeck.c (build_c_cast): Use non_lvalue to tack something on - where necessary. - - * decl.c (auto_function): Now a function. - * except.c (init_exception_processing): terminate, unexpected, - set_terminate, and set_unexpected have C++ linkage. - - * typeck.c (build_unary_op, TRUTH_NOT_EXPR): Use convert instead of - truthvalue_conversion for converting to bool, as it handles - user-defined conversions properly. - (condition_conversion): Likewise. - - * except.c (expand_throw): Don't call convert_to_reference. - Pass the correct parameters to build_new. - - * method.c (do_build_assign_ref): Don't use access control when - converting to a base reference here. - (do_build_copy_constructor): Or here. - - * init.c (build_new): Unset TREE_READONLY on the dereferenced - pointer before assigning to it. - - * decl.c (maybe_build_cleanup): Don't bother stripping const here. - - * decl2.c (delete_sanity): You can now delete pointer to const. - -Fri Feb 10 13:28:38 1995 Jason Merrill - - * decl.c (finish_function): Don't rely on actual parameters being - evaluated left-to-right. - * except.c (expand_end_catch_block): Likewise. - -Fri Feb 10 00:52:04 1995 Jason Merrill - - * tree.c (real_lvalue_p): Like lvalue_p, but class temps aren't - considered lvalues. - * cvt.c (convert_to_reference): Use real_lvalue_p instead of - lvalue_p. - - * cvt.c (build_type_conversion_1): Don't call convert on aggregate - types. - (convert_to_reference): Fix erroneous text substitution. - - * typeck2.c (initializer_constant_valid_p): Update from C frontend. - Add new argument to all callers. - - * typeck.c (convert_arguments): Check for error_mark_node before - trying to do anything with the actual parameter. - - * typeck.c (condition_conversion): Build up a CLEANUP_POINT_EXPR and - fold it. - (bool_truthvalue_conversion): Remove. Fix all callers to call - truthvalue_conversion instead. - (various): Fold CLEANUP_POINT_EXPRs. - - * parse.y (conditions): Call condition_conversion rather than - building up a CLEANUP_POINT_EXPR. - - * pt.c (end_template_decl): Don't warn_if_unknown_interface here - under -falt-external-templates. - -Thu Feb 9 05:24:10 1995 Jason Merrill - - * init.c (build_new): Complain about new of const type without - initializer. Other cleanup. - - * call.c (compute_conversion_costs): Don't call - build_type_conversion with a reference type; convert to the target - type and check its lvaluetude. - * cvt.c (convert_to_reference): Likewise. - - * cvt.c (build_type_conversion_1): There will never be any need to - dereference references here now. - -Thu Feb 9 00:37:47 1995 Mike Stump - - * except.c (expand_builtin_throw): Make sure we only `use' the - value of return_val_rtx. - -Wed Feb 8 15:45:55 1995 Jason Merrill - - * parse.y (structsp): Don't complain about declaring a type being - defined to be a friend. - - * decl2.c (warn_if_unknown_interface): Note the template in question - and the point of instantiation, for -falt-external-templates. - * lex.c (reinit_parse_for_method): Pass the decl to - warn_if_unknown_interface. - * pt.c (instantiate_template): Likewise. - (end_template_decl): Likewise. - - * decl.c (set_nested_typename): Set IDENTIFIER_TYPE_VALUE on the - nested name again, to make local classes work a bit better. - - * typeck.c (build_function_call_real): Dereference reference after - checking for incomplete type. - - * init.c (build_new): Accept new of const and volatile types. - -Wed Feb 8 14:04:16 1995 Jason Merrill - - * decl.c (grokdeclarator): Fix error message. - -Wed Feb 8 03:16:15 1995 Jason Merrill - - * typeck.c (convert_for_initialization): Do bash arrays when - converting to a reference to non-array. - -Tue Feb 7 15:50:33 1995 Jason Merrill - - * cvt.c (cp_convert): Don't call convert_to_reference, or - automatically dereference references. Do pass reference conversions - to cp_convert_to_pointer. - (cp_convert_to_pointer): Support references. - - * call.c (build_method_call): Don't build up a reference to the - parameter here; let build_overload_call handle that. - - * typeck.c (build_c_cast): Call convert_to_reference directly if - converting to a reference type. - * method.c (do_build_copy_constructor): Likewise. - * method.c (do_build_copy_constructor): Likewise. - (do_build_assign_ref): Likewise. - - * call.c (build_method_call): Dereference a returned reference. - * typeck.c (build_function_call_real): Likewise. - - * decl.c (xref_basetypes): Check for unions with basetypes here. - (xref_tag): Instead of here. - - * pt.c (process_template_parm): Template type parm decls are - artificial. - -Mon Feb 6 04:32:09 1995 Jason Merrill - - * parse.y (typed_declspecs): Add missing semicolon. - (do_xref_defn): Resurrect. - (named_class_head_sans_basetype): Move template specialization - definition cases to named_class_head_sans_basetype_defn. - - * decl2.c (grokfield): Call pushdecl_class_level after setting the - TYPE_NAME, not before. - -Sun Feb 5 02:50:45 1995 Jason Merrill - - * call.c (convert_harshness): Don't call sorry here. Don't allow - conversions between function pointer types if pedantic. - - * pt.c (overload_template_name): Pass globalize=1 to xref_tag. - - * lex.c (cons_up_default_function): Use the full name for the return - type of op=. - - * decl.c (set_nested_typename): Don't worry about anonymous types, - as they already have a unique name. - (pushdecl): Remove redundant set_nested_typename - (xref_tag): Split out base handling into xref_basetypes. - - * cp-tree.h (TYPE_INCOMPLETE): New macro; TEMPLATE_TYPE_PARMs are - not considered incomplete even though their definition is unknown. - - * decl.c (xref_defn_tag): Lose. - (xref_tag): xref_next_defn = ! globalize. - (pushdecl): Don't set DECL_NESTED_TYPENAME on artificial decls. The - ones that should have it set will have it set by pushtag. - (pushdecl_class_level): Likewise. - (pushtag): Tidy up a bit. - (set_nested_typename): Push a decl for the nested typename from - here, rather than from xref_defn_tag. - - * parse.y (do_xref): Lose. - (named_class_head): If we see 'class foo:' we know it's a - definition, so don't worry about base lists for non-definitions. - - * pt.c (push_template_decls): Template parm decls are artificial. - - * decl.c (duplicate_decls): Restore check for qualifier - disagreement for non-functions. - (decls_match): Remove check for qualifier disagreement. - -Fri Feb 3 14:58:58 1995 Jason Merrill - - * decl.c (grok_reference_init): Convert initializer from - reference. - * typeck.c (convert_for_initialization): Likewise. - - * decl.c (duplicate_decls): Propagate DECL_NESTED_TYPENAME. - - * cvt.c (cp_convert): Don't convert to the same class type by just - tacking on a NOP_EXPR. - (convert_to_reference): Use comp_target_types instead of comptypes - so that we don't allow conversions two levels down. - -Thu Feb 2 15:07:58 1995 Jason Merrill - - * class.c (build_vbase_path): Bash types to make the backend happy. - * cvt.c (build_up_reference): Bash the types bashed by - build_vbase_path to be reference types instead of pointer types. - (convert_to_reference): Likewise. - - * typeck.c (build_c_cast): Don't strip NOPs if we're converting to a - reference type. - - * parse.y (structsp): Put back error for 'struct B: public A;'. - -Wed Feb 1 23:02:06 1995 Mike Stump - - * except.c: Add support for mips systems that don't define __mips - but do define mips, like Ultrix. - -Wed Feb 1 22:39:07 1995 Mike Stump - - * except.c: Add support for exception handling on the Alpha. - -Wed Feb 1 10:12:14 1995 Mike Stump - - * decl2.c (finish_file): Fix bug in Jan 31st change. - -Tue Jan 31 16:59:15 1995 Gerald Baumgartner - - * sig.c (build_signature_pointer_or_reference_type): Don't set - IS_AGGR_TYPE for signature pointers/reference so expand_default_init - doesn't expect to find a copy constructor. - * call.c (build_method_call): Treat signature pointers/reference - as if IS_AGGR_TYPE were set. - -Tue Jan 31 13:28:56 1995 Mike Stump - - * gc.c (get_typeid): Pawn off error messages to build_t_desc. - (build_t_desc): Inform the user here if they try and build - with -frtti and don't include . - - * decl2.c (finish_prevtable_vardecl): Support rescanning. - (finish_file): Move finish_prevtable_vardecl up to before the global - initializers are done as tdecls are initialized in the global - initializer. Also Pick up any new tdecls or vtables needed by - synthesized methods. - - * class.c (finish_struct): Simplify. We have to do rtti scanning at - end, so we might as well do all of it there. - -Tue Jan 31 05:35:02 1995 Jason Merrill - - * call.c (build_method_call): Fix -fthis-is-variable for 32-bit - targets, too. - -Tue Jan 31 00:11:04 1995 Mike Stump - - * decl2.c (finish_prevtable_vardecl): New routine, mostly split from - finish_vtable_vardecl. It has the first half functionality from - that routine. - * decl2.c (finish_vtable_vardecl): Update to not include stuff not - in finish_prevtable_vardecl. - * decl2.c (finish_file): Call finish_prevtable_vardecl. - * gc.c (build_generic_desc): Allow it to be called when not at the - global binding layer, but behave as if we were. - (build_t_desc): Rearrange a bit so that it really works and is - easier to follow. - * class.c (finish_struct): Don't decide on tdecls here, as we have - to wait until the end of the file in general to decide whether or - not they come out. - -Mon Jan 30 01:00:40 1995 Jason Merrill - - * init.c (build_delete): Check access to operator delete before - calling the destructor. - * method.c (build_opfncall, DELETE_EXPR): build_method is allowed to - return error_mark_node. - * call.c (build_method_call): Use the one-argument op delete even if - it's an error. - - * init.c (build_new): Fix -fthis-is-variable support. - * call.c (build_method_call): Likewise. - - * call.c (convert_harshness): Make conversion from a pointer to bool - worse than conversion to another pointer. - -Sat Jan 28 16:46:10 1995 Jason Merrill - - * init.c (build_new): Check new return value if -fcheck-new. - - * lex.c (check_newline): Clear end_of_file when we're done, too. - -Sat Jan 28 10:38:39 1995 Mike Stump - - * decl2.c (finish_vtable_vardecl): Make rtti TD tables follow - vtables whereever they go. - - * gc.c (build_t_desc): Remove old way of setting it up, as it wasn't - right. - -Sat Jan 28 09:10:44 1995 Mike Stump - - * decl2.c (finish_vtable_vardecl): Now set the - interface/implementation of vtables on the first virtual function, - if one exists, otherwise we use the old method. This is a major win - in terms of cutting down the size of objects and executables in - terms of text space and data space. Now most of the savings that - #pragma interface/implementation gives is automatic in a fair number - of cases. - -Sat Jan 28 04:57:33 1995 Jason Merrill - - * decl.c (grokdeclarator): Discard the template parameters in a - template constructor declaration so that the function is always - named constructor_name (ctype). - - * lex.c (check_newline): Use ungetc to put back the character before - calling HANDLE_PRAGMA. - -Fri Jan 27 17:23:47 1995 Mike Stump - - * decl2.c (check_classfn): If the cname is T and fn_name is T, - make sure we still match them. - -Fri Jan 27 16:32:10 1995 Jason Merrill - - * parse.y: Add END_OF_LINE token. - - * lex.c (check_newline): Set linemode when we see a # directive, and - unset it when we're done. Turn all 'return's into 'goto skipline'. - Fix all uses of '\n', since we won't see it anymore. Put back the - character we read before checking for a sysv or target pragma. - (real_yylex): If we see an EOF in linemode, return END_OF_LINE. - (handle_sysv_pragma): Don't look at the input stream; quit when we - see an END_OF_LINE token. - - * input.c (getch): Return EOF if we're in line mode and at the end - of a line. - (put_back): Don't put back an EOF. - -Thu Jan 26 19:26:34 1995 Mike Stump - - * except.c (expand_throw): Do the newing of the exception object - before we load the type descriptor or the address so that we don't - wipe any of the values out. - -Thu Jan 26 19:20:00 1995 Mike Stump - - * except.c (init_exception_processing): Don't use r12 on the rs6000. - -Tue Jan 24 16:36:31 1995 Jason Merrill - - * decl.c (grokparms): Don't try to build up a reference at this point. - - * typeck2.c (build_functional_cast): Don't assume that a NOP_EXPR - will suffice to convert from integer_zero_node. - -Wed Jan 25 15:02:09 1995 David S. Miller - - * class.c (instantiate_type): Change error message text. - * typeck2.c (store_init_value): Likewise. - -Mon Jan 23 21:57:14 1995 Mike Stump - - * pt.c (tsubst): When we copy a node, don't forget to copy - TREE_CHAIN, we use it later. - -Mon Jan 23 03:33:47 1995 Jason Merrill - - * typeck.c (convert_for_assignment): Initialize variable before use. - -Fri Jan 20 01:17:59 1995 Jason Merrill - - * g++.c (main): Link with both libstdc++ and libg++ if called as - something ending with "g++", otherwise only libstdc++. Move -lm to - the end of the line. - -Thu Jan 19 15:43:11 1995 Jason Merrill - - * call.c (build_method_call): Don't mess with 'this' before calling - compute_conversion_costs. - -Wed Jan 18 15:40:55 1995 Jason Merrill - - * search.c (get_matching_virtual): Give line number for previous - declaration. - - * call.c (convert_harshness): Handle conversions to references - better. - - * cvt.c (build_up_reference): OK, handle {MIN,MAX}_EXPR *properly*. - -Wed Jan 18 15:21:38 1995 Mike Stump - - * class.c (instantiate_type): Use DECL_CHAIN to walk lists instead, - as the TREE_CHAIN for methods will take us to the next differently - named function, DECL_CHAIN won't. - -Wed Jan 18 14:26:59 1995 Jason Merrill - - * tree.c (lvalue_p): Handle {MIN,MAX}_EXPR. - - * decl2.c (lang_decode_option): -Wall implies -Wparentheses. - warn_parentheses defaults to 0. - - * decl.c (grokparms): Put back call to require_instantiated_type. - -Tue Jan 17 19:56:15 1995 Mike Stump - - * except.c (exception_section): Use the data section on the rs6000. - Change calling convention for named_section. - -Wed Jan 17 18:20:57 1994 Fergus Henderson - - * cp-tree.h : Make if (x=0) warn with wall - * parse.y : Make if (x=0) warn with wall - -Tue Jan 17 14:12:00 1995 Jason Merrill - - * decl.c (BOOL_TYPE_SIZE): BITS_PER_WORD if SLOW_BYTE_ACCESS, - BITS_PER_UNIT otherwise. - - * search.c (get_matching_virtual): Don't check the binfo if the - types are the same. - - * cvt.c (cp_convert): Just call truthvalue_conversion to convert to - bool. - -Mon Jan 16 13:28:48 1995 Jason Merrill - - * various: Use boolean_type_node, boolean_true_node, - boolean_false_node. - - * search.c (get_matching_virtual): Allow covariant returns that - don't require pointer adjustment. - - * typeck.c (build_conditional_expr): Don't call default_conversion - on ifexp. - - * cvt.c (build_up_reference): Handle MIN_EXPR and MAX_EXPR. - - * decl.c (grokdeclarator): Upgrade warning about &const to pedwarn. - -Sun Jan 15 22:17:32 1995 David Binderman - - * pt.c (do_function_instantiation): Free targs once we're done. - -Sun Jan 15 22:17:32 1995 Jason Merrill - - * decl.c (BOOL_TYPE_SIZE): Defaults to BITS_PER_WORD. - (init_decl_processing): Use BOOL_TYPE_SIZE instead of CHAR_TYPE_SIZE - for bool. - -Sat Jan 14 05:33:55 1995 Jason Merrill - - * decl2.c (finish_file): We need to mess up if there are any - variables in the list, not just if there is one with a constructor. - -Fri Jan 13 14:42:55 1995 Jason Merrill - - * decl.c (duplicate_decls): Propagate DECL_STATIC_{CON,DE}STRUCTOR. - (finish_function): Handle DECL_STATIC_{CON,DE}STRUCTOR. - (finish_function): Trust rest_of_compilation. - - * decl2.c (finish_file): Also call functions designated as static - constructors/destructors. - - * decl.c (grokdeclarator): Allow access decls of operator functions. - (grokparms): Only do convert_for_initialization if the initializer - has a type. - (duplicate_decls): Put back push_obstacks_nochange call. - - * lex.c (real_yylex): Downgrade complaint about the escape sequence - being too large from pedwarn to warning. - - * decl.c (grokdeclarator): Don't complain about long long in system - headers. - - * lex.c (real_yylex): Handle digraphs. - -Thu Jan 12 12:17:24 1995 Jason Merrill - - * decl.c (init_decl_processing): -f{no-,}strict-prototype only - affects C linkage declarations now. - - * typeck.c (comp_target_types): Grok simple contravariant conversions. - (common_type): t1 and t2 are interchangeable. - - * various: Test return value of comp_target_types differently in - different places; it now returns -1 for a contravariant conversion - (which is fine in symmetric cases). - - (common_type): Prefer long double to double even when - they have the same precision. - - * decl.c (grokparms): Call convert_for_initialization to check - default arguments. - - * init.c (build_new): void_type_node has a size (of 0). - - * decl.c (decls_match): Also check for agreement of TREE_READONLY - and TREE_THIS_VOLATILE. - (push_class_level_binding): Properly handle shadowing of - nested tags by fields. - - * search.c (dfs_pushdecls): Likewise. - - * decl2.c (finish_file): Don't second-guess self-initialization. - - * cvt.c (convert_to_reference): Work with expr directly, rather than - a copy. - - * decl.c (push_overloaded_decl): Only shadow artificial TYPE_DECLs. - - * init.c (add_friend): Downgrade duplicate friend message from - pedwarn to warning. - - * decl.c (duplicate_decls): Push obstacks before calling common_type. - -Thu Jan 12 17:15:21 1995 Michael Ben-Gershon - - * except.c (push_eh_entry): set LABEL_PRESERVE_P flag for - exception table labels. - (expand_start_all_catch): Likewise. - (expand_leftover_cleanups): Likewise. - (expand_end_catch_block): Likewise. - * except.c (make_first_label): new function. - (expand_start_all_catch): add a call to make_first_label() before - using a label as a jump destination. - (expand_end_all_catch): Likewise. - (expand_leftover_cleanups): Likewise. - (expand_end_catch_block): Likewise. - (expand_builtin_throw): Likewise. - (expand_throw): Likewise. - * except.c: Add ARM processor support for exception handling. - -Thu Jan 12 12:17:24 1995 Jason Merrill - - (complete_array_type): Copy code from C frontend. - - * lex.c (real_yylex): Don't multiply the length of a wide string - literal by WCHAR_BYTES. - - * decl.c (pushdecl): Check for redeclaration of wchar_t here. - (duplicate_decls): Instead of here. - (define_label): Complain about a label named wchar_t. - (grokdeclarator): Complain about declarations of - operator-function-ids as non-functions. - - * typeck.c (unary_complex_lvalue): Also wrap prefix -- and ++ in - COMPOUND_EXPRs. - (build_unary_op): Wrap unary plus in a NON_LVALUE_EXPR. - - * lex.c (real_yylex): Don't skip whitespace when reading the next - character after ->. - -Wed Jan 11 16:32:49 1995 Mike Stump - - * except.c: Allow cc1plus to be built with native compiler on rs6000. - (expand_start_all_catch): Add assemble_external calls for various - routines we call. - (expand_leftover_cleanups): Likewise. - (expand_start_catch_block): Likewise. - (do_unwind): Likewise. - (expand_builtin_throw): Likewise. - -Wed Jan 11 01:05:42 1995 Jason Merrill - - * decl.c (pushtag): Only look for a previous decl in the current - binding level. Use explicit global scope in DECL_NESTED_TYPENAME. - - * gxx.gperf: Add __signature__ and __sigof__ keywords. - - * decl2.c (lang_decode_option): -ansi does not set flag_no_asm. It - does set flag_no_gnu_keywords and flag_operator_names. - - * lex.c (init_lex): 'overload' is not a keyword unless -traditional. - Unset extension keywords if -fno-gnu-keywords. - Allow operator names ('bitand') if -foperator-names. - Never unset 'asm'; -fno-asm only affects 'typeof'. - - * decl.c (lookup_name_real): The got_object special lookup only - applies to types. - -Tue Jan 10 18:07:51 1995 Jason Merrill - - * spew.c (yylex): Also use DECL_NESTED_TYPENAME if got_object is set. - - * parse.y (primary): Unset got_object after all rules that use the - 'object' nonterminal. - (object): Set got_object. - - * lex.h: Declare got_object. - - * decl.c (lookup_name_real): Also lookup names in the context of an - object specified. - -Tue Jan 10 14:30:30 1995 Mike Stump - - * typeck.c (get_member_function_from_ptrfunc): Use ptrdiff_type_node - for things that have to be added to pointers, not size_type. Cures - problems with pointer to members on Alphas. - (build_binary_op_nodefault): Likewise. - (get_delta_difference_: Likewise. - (build_ptrmemfunc): Likewise. - -Tue Jan 10 01:49:25 1995 Jason Merrill - - * decl.c (pushtag): Stick the new decl in TYPE_NAME before pushing - it. - - * typeck.c (build_component_ref): Don't build up a COMPONENT_REF - when dealing with overloaded member functions; just act like - build_offset_ref. - (commonparms): Remove misleading comment. - - * decl.c (duplicate_decls): Complain about repeated default - arguments here. - (redeclaration_error_message): Instead of here. - (pushdecl): Complain about missing default arguments here. - (grokparms): Instead of here. - (lookup_name_current_level): Also match on DECL_ASSEMBLER_NAME. - (grok_reference_init): Do not complain about missing initializer if - declared 'extern'. - - * search.c (lookup_field): Don't return a TYPE_DECL if there is a - function alternative and want_type is not set. - -Mon Jan 9 18:16:23 1995 Jason Merrill - - * decl.c (pushtag): Don't set TYPE_NAME to an identifier. Do push - the decl when the type has no TYPE_NAME. - (lookup_nested_type): Don't assume that type has TYPE_NAME set. - (lookup_name_real): Call lookup_field with want_type = - prefer_type. - - * search.c (lookup_field): Handle want_type properly in the presence - of fields with the same name. - - * decl.c (set_nested_typename): Set nested name for file-scope types - to include leading ::. - (pushdecl): Set the nested typename if the decl doesn't have one, - rather than if the type's canonical decl doesn't have one. - -Mon Jan 9 03:44:33 1995 Jason Merrill - - * typeck.c (convert_for_assignment): Complain about contravariance - violation here. - (comp_target_types): Instead of here. - (build_unary_op): resolve_offset_ref before checking for a valid - type. - - * spew.c (yylex): Decrement looking_for_typename after we see a - _DEFN. - - * decl.c (pushdecl): Don't install an artificial TYPE_DECL in - IDENTIFIER_LOCAL_VALUE if we already have a decl with that name. - - * typeck.c (convert_for_assignment): Converting pointers to bool - does not need a cast. - -Sun Jan 8 18:16:45 1995 Jason Merrill - - * class.c (instantiate_type): Initialize nsubsts parm. - - * pt.c (do_function_instantiation): Likewise. - -Sat Jan 7 14:37:05 1995 Jason Merrill - - * pt.c (tsubst): Use TREE_STATIC instead of DECL_INLINE && - DECL_SAVED_INSNS to determine whether or not we've seen a definition - of this function. - (instantiate_template): Likewise. - - * call.c (convert_harshness): Allow const reference binding when - called from the overloading code, but not when called from - can_convert (since it isn't a conversion). - (convert_harshness): Put back some disabled code. - -Fri Jan 6 14:10:57 1995 Jason Merrill - - * call.c (convert_harshness): There is no implicit conversion from - void* to other pointer types (unless the parameter is (void*)0). - (convert_harshness): Non-lvalues do not convert to reference types. - - * class.c (finish_struct_methods): Still set - TYPE_HAS_{INT,REAL}_CONVERSION. - - * call.c (can_convert): Don't use aggregate initialization. - - * cp-tree.h: Declare lookup_conversions. - -Thu Jan 5 21:08:00 1995 Mike Stump - - * parse.y (simple_stmt): Fix duplicate case value error messages to - be more readable. - -Wed Jan 4 16:44:19 1995 Jason Merrill - - * cvt.c (build_type_conversion): Total rewrite to use - convert_harshness instead of reproducing conversion logic here. Now - much shorter. - - * call.c (convert_harshness): Support conversions to bool. - (can_convert): Checks whether a conversion is less harsh - than USER_CODE, for build_type_conversion. - - * search.c (add_conversions): Function for passing to dfs_walk which - adds all the type conversion operators in the current type to a list. - (lookup_conversions): Calls dfs_walk with add_conversions and return - the list. - (dfs_walk): Don't require a qfn. - - * cp-tree.h: Lose CLASSTYPE_CONVERSIONS hackery. - (CLASSTYPE_FIRST_CONVERSION): Points to elt 1 of CLASSTYPE_METHOD_VEC. - - * class.c (finish_struct_bits): Lose CLASSTYPE_CONVERSIONS hackery. - (grow_method): A separate function for building onto the growing - method vector. - (finish_struct_methods): Use it. Put all type conversion operators - right after the constructors. Perhaps we should sort the methods - alphabetically? - -Mon Jan 2 14:42:58 1995 Jason Merrill - - * call.c (build_method_call): Lose another misleading shortcut. - -Fri Dec 30 17:57:30 1994 Mike Stump - - * gc.c (build_bltn_desc): Handle bool as a built-in type. - -Fri Dec 30 14:20:21 1994 Mike Stump - - * tree.c (layout_vbasetypes): Ensure that we don't loose alignment - on the complete type because of small virtual bases. - -Fri Dec 30 12:22:29 1994 Mike Stump - - * decl.c (n_incomplete): Bump n_incomplete up to int to match C - front end. - (pushdecl): Also count decls pushed that are of a type being defined - as incomplete things. - * class.c (finish_struct): Move hack_incomplete_structures up to - just after we set it as not being defined, so that the decls we - build for RTTI don't count as incomplete. - -Thu Dec 29 18:20:57 1994 Mike Stump - - * pt.c (tsubst): Fix problem with defining constructors in templated - classes with virtual bases. - -Wed Dec 28 08:31:00 1994 Mike Stump - - * parse.y (TYPEID): Strip top-level cv-qualifiers on typeid - expressions. - * gc.c (build_typeid): Likewise. - -Thu Dec 22 17:26:33 1994 Mike Stump - - * cvt.c (build_up_reference): Fix breakage introduced on Nov 29, - don't assert on complex AGGR inits. - -Thu Dec 22 14:32:31 1994 Mike Stump - - * method.c (build_overload_value): Handle pointer to members as - template arguments. - -Thu Dec 22 13:09:07 1994 Mike Stump - - * typeck.c (unary_complex_lvalue): Don't call sorry if we know how - to do take the address of a data member for a pointer to data - member. - -Thu Dec 22 10:04:19 1994 Mike Stump - - * decl.c (grokdeclarator): Use the typedef name for linkage if the - type doesn't otherwise have a name. - - * decl2.c (grokfield): Likewise. - - * class.c (finish_struct): Since we reuse the TYPE_DECL for the - DECL_NAME of enums, structs and classes, we have to avoid trying to - put it in the TYPE_FIELDS again. - -Wed Dec 21 11:07:05 1994 Mike Stump - - * decl2.c (check_classfn): Ignore this parameter on static functions - when checking to see if we match. - -Tue Dec 20 17:47:02 1994 Mike Stump - - * typeck.c (unary_complex_lvalue): Handle address of non-left most - pointers to members by calling get_delta_difference. - -Mon Dec 19 22:40:53 1994 Mike Stump - - * decl2.c (check_classfn): Don't use decls_match yet, as it modifies - static functions to early. - -Thu Dec 19 22:37:48 1994 Mike Stump - - * method.c (make_thunk): Handle encoding of positive thunk offsets. - -Sat Dec 17 13:29:50 1994 Doug Evans - - * Make-lang.in (.PHONY): Tell GNU make C++ and c++ are phony targets. - -Thu Dec 15 16:32:12 1994 Mike Stump - - * decl2.c (check_classfn): Use decls_match to check if this has - already been declared, as the DECL_ASSEMBLER_NAME may have been - changed via asm("new_name"). - * decl.c (decls_match): Make public. - -Thu Dec 15 15:17:55 1994 Mike Stump - - * *.[chy] (expand_aggr_init) Add fourth argument to handle - distinction between = init and (init) style of initializations. - * *.[chy] (finish_decl): Add fifth argument to handle - distinction between = init and (init) style of initializations. - -Tue Dec 13 19:16:05 1994 Mike Stump - - Fix some random `explicit' bugs. - - * cvt.c (convert_to_reference): Add third parameter to - convert_force. - (convert_force): Likewise. - * call.c (build_method_call): Likewise. - * decl2.c (setup_vtbl_ptr): Likewise. - * init.c (expand_virtual_init): Likewise. - (build_member_call): Likewise. - (build_delete): Likewise. - (build_vbase_delete): Likewise. - * typeck.c (build_component_addr): Likewise. - (build_c_cast): Likewise. - (build_modify_expr): Likewise. - * cp-tree.h (CONV_NONCONVERTING): Likewise. Add so that we can - distinguish the context in which the conversion appears. Add thrid - argument to build_c_cast. - * cvt.c (cp_convert): Pass whether or not we want to consider - non-converting constructors down to build_method_call. - * decl2.c (reparse_absdcl_as_casts): Add third argument to - build_c_cast. - * gc.c (build_m_desc): Likewise. - * init.c (build_new): Likewise. - * parse.y (expr_no_commas): Likewise. - (primary): Likewise. - * typeck.c (build_x_function_call): Likewise. - (build_static_cast): Likewise. - (build_reinterpret_cast): Likewise. - (build_const_cast): Likewise. - (build_c_cast): Likewise. - (build_ptrmemfunc): Likewise. - * typeck2.c (build_functional_cast): Likewise. - * init.c (expand_aggr_init): Added LOOKUP_ONLYCONVERTING to - expand_aggr_init_1 as inits are converted to the destination type. - -Tue Dec 13 16:18:57 1994 Jason Merrill - - * Make-lang.in (cc1plus): Depends on c-pragma.o. - - * Makefile.in (OBJ{DEP,}S): Add ../c-pragma.o. - - * lex.c (check_newline): If the #pragma is not recognized by g++, - try machine-specific ones too. - (handle_sysv_pragma): Copied from c-lex.c. - -Mon Dec 12 23:53:06 1994 Mike Stump - - * except.c (expand_throw): Fix Dec 6th change, build_new likes a - reference better. - -Mon Dec 12 18:01:00 1994 Jason Merrill - - * typeck.c (build_binary_op): Lose checks on TYPE_PTRMEMFUNC_P with - IS_AGGR_TYPE, since now they will not both be set on the same type. - - * pt.c (do_pending_expansions): Don't clear TREE_PUBLIC on - instantiations controlled by -fexternal-templates. - - * decl.c (duplicate_decls): Don't complain about different values of - __attribute__ ((const)) and ((noreturn)). - -Fri Dec 9 18:17:37 1994 Doug Evans - - * Makefile.in (BISONFLAGS): Delete --yacc. - (PARSE_H): Depend on $(PARSE_C), for parallel makes. - (PARSE_C): Undo last patch. - -Fri Dec 2 10:44:36 1994 Mike Stump - - * Makefile.in (BISONFLAGS): Add --yacc so that output winds up in - y.tab.c. - -Thu Dec 8 17:39:46 1994 Jason Merrill - - * decl.c (finish_decl): Don't call obscure_complex_init for decls - of indeterminate size. - -Wed Dec 7 16:49:22 1994 Jason Merrill - - * decl.c (obscure_complex_init): Function to tweak the decl to - prevent expand_decl from tring to initialize it. - (finish_decl): Use it rather than writing the same code in three - different places. - - * parse.y (bad_parm): Stop trying to support parms without types. - -Wed Dec 7 12:06:56 1994 Mike Stump - - * decl2.c (grokfield): Make asm specs on static member functions - work. - -Tue Dec 6 15:43:20 1994 Mike Stump - - * except.c (expand_throw): Make a copy of the thrown object. - -Tue Dec 6 14:16:34 1994 Jason Merrill - - * parse.y: : has lower precedence than =. - -Tue Dec 6 12:46:17 1994 Mike Stump - - * decl.c (pushdecl): Use DECL_NAME of VAR_DECLs to avoid namespace - manglings. - (grokvardecl): Add namespace into variable name. - -Tue Dec 6 11:26:55 1994 Mike Stump - - * decl2.c (current_namespace_id): New routine to transform a simple - name into a name in a namespace. - * decl.c (grokdeclarator): Use it. - * decl2.c (get_namespace_id): Find the name of the current - namespace. - (push_namespace, pop_namespace): Complete out missing - functionality. - -Mon Dec 5 17:11:51 1994 Jason Merrill - - * class.c (finish_struct): Don't use LONG_LONG_TYPE_SIZE, as it may - not be defined. Fix warning message for enums and restore warning - for non-enums. - - * decl2.c (push_namespace): Dummy function. - (pop_namespace): Likewise. - (do_namespace_alias): Likewise. - (do_using_decl): Likewise. - (do_using_directive): Likewise. - - * parse.y: New token NSNAME for namespace names. - (extdef): Add namespace, using definitions. - (using_decl): New rule for using declarations. - (any_id): New rule for identifiers with any degree of scoping. - (identifier): Add NSNAME. - (notype_identifier): Likewise. - (component_decl): Add using_decl. - (nested_name_specifier): Add NSNAME SCOPE. - - * typeck.c (convert_for_assignment): Handle conversions between - enums and bool. - - * decl.c (duplicate_decls): Only propagate DECL_MAIN_VARIANT on - FUNCTION_DECLs. - -Mon Dec 5 13:03:16 1994 Mike Stump - - * class.c (finish_struct): Give an error if one tries to declare a - bit-field's size greater than a long long, as the backend will dump. - It is not an error to declare an enum bit-field greater than its - precision. Warn if an enum bit-field is too small to hold all - its values. - -Mon Dec 5 11:41:50 1994 Mike Stump - - * typeck.c (convert_for_assignment): Use cp_convert instead of - convert so that we don't get static casts. - -Sun Dec 4 11:59:01 1994 Mike Stump - - * cvt.c (cp_convert): Don't complain about int->enum conversion if - we are doing static casts. - -Fri Dec 2 18:32:41 1994 Mike Stump - - * error.c (dump_expr): Do something more intelligent with SAVE_EXPRs - when dumping expressions in error messages. - -Fri Dec 2 17:04:27 1994 Mike Stump - - * gc.c (build_dynamic_cast): Change interface to libg++, ensure that - the return type is the right type, and make references work. - -Fri Dec 2 16:36:43 1994 Jason Merrill - - * decl.c (poplevel): Don't be confused by function-scope - declarations of non-nested functions. - (duplicate_decls): Propagate DECL_MAIN_VARIANT. - (pushdecl): Use duplicate_decls to copy info from old decl into new - function-scope one rather than doing it here. - - * decl2.c (mark_inline_for_output): Deal with the DECL_MAIN_VARIANT - of this decl, in case this is a function-scope declaration. - - * decl.c (finish_enum): Make sure that the type has the right - precision when we call fixup_*_type. - -Tue Nov 29 19:12:07 1994 Jason Merrill - - * cvt.c (build_up_reference): Strip superfluous NOP_EXPRs; we do - want to build up references to rvalues if possible. - (cp_convert): Stick on a NOP_EXPR when converting to the same type. - -Tue Nov 29 11:28:59 1994 Mike Stump - - * parse.y (maybe_raises): Handle throw (). - * parse.y (ansi_raise_identifier): grok type-ids in exception - specifications. - * tree.c (build_exception_variant): Use list compare to check if - two exception specifications match. - * decl.c (duplicate_decls, bad_specifiers): Enhance wording on error - messages. - * call.c (build_method_call): Remove TREE_RAISES. - * cvt.c (convert_to_aggr): Likewise. - * typeck.c (build_function_call_real, convert_arguments): Likewise. - * init.c (expand_aggr_init_1): Likewise. - -Tue Nov 29 09:50:39 1994 Mike Stump - - * except.c: Add support for m68k and mips exception handling - support. - -Tue Nov 29 08:48:33 1994 Mike Stump - - * except.c (expand_end_all_catch): Throw into outer context, if we - fall off end of catch handlers. - -Mon Nov 28 16:44:41 1994 Mike Stump - - * Makefile.in: Make is easier to decide where parse.[ch] will be - built. - -Thu Nov 17 20:11:24 1994 Doug Evans - - * cp/Make-lang.in (CXX_INSTALL_NAME) Use program_transform_name. - (GXX_INSTALL_NAME) Likewise. - (CXX_CROSS_NAME) Use program_transform_cross_name. - (GXX_CROSS_NAME) Likewise. - (c++.install-man): Use program_transform_name on g++.1. - (c++.uninstall): Likewise. - -Mon Nov 28 13:53:03 1994 Mike Stump - - * parse.y (THROW): Fix precedence of throw expressions. - -Mon Nov 28 13:15:16 1994 Mike Stump - - * typeck.c (build_unary_op): Allow promotions from bool to int on - unary ~. - -Sun Nov 27 00:16:21 1994 Jason Merrill - - * method.c (build_overload_name): Use DECL_ASSEMBLER_NAME for - classes when appropriate. - (build_overload_nested_name): When dealing with a function context, - use ASM_FORMAT_PRIVATE_NAME to tweak the name of the function to - avoid conflicts between local classes of the same name. - -Wed Nov 23 17:59:42 1994 Mike Stump - - * gxx.gperf, parse.y, lex.h, hash.h, lex.c (init_lex), delc.c - (duplicate_decls, grokdeclarator), cp-tree.h: Add support for - `explicit'. - * cvt.c (convert_to_reference, cp_convert, build_type_conversion_1, - build_type_conversion): Use LOOKUP_ONLYCONVERTING in - build_method_calls so that non-converting constructors are not used. - * call.c (build_method_call): If we shouldn't use a non-converting - constructor, then don't. - -Wed Nov 23 14:46:56 1994 Jason Merrill - - * call.c (build_method_call): Don't try to synthesize methods yet. - -Tue Nov 22 12:45:21 1994 Jason Merrill - - * pt.c (push_template_decls): Create CONST_DECLs for template - constant parameters, not VAR_DECLs. - -Sat Nov 19 15:28:31 1994 Jim Wilson - - * typeck.c (build_binary_op_nodefault): Can shorten shift only if - shift count is less than size in bits of arg0. - -Thu Nov 17 15:30:50 1994 Mike Stump - - * gxx.gperf, hash.h, lex.c (init_lex, real_yylex), parse.y: Add new - ANSI keywords and, and_eq, bitand, bitor, explicit, namespace, not, - not_eq, or, or_eq, typename, using, xor, xor_eq to g++. Still need - to add support for explicit, namespace, typename, and using, support - for the rest is already in. - -Fri Nov 4 19:04:18 1994 Mike Stump - - * gc.c (get_bad_cast_node): New routine to support compile time - throws of bad_cast. - * gc.c (build_dynamic_cast): Support throwing of bad_cast at compile - time. - -Fri Nov 4 11:12:00 1994 Mike Stump - - * except.c: Add hppa support. - -Fri Nov 4 10:50:50 1994 Mike Stump - - * except.c: Add rs6000 support. - -Thu Nov 3 14:24:23 1994 Mike Stump - - * except.c (do_unwind): Add i[34]86 support. - -Thu Nov 3 00:10:46 1994 Jason Merrill - - * pt.c (do_pending_expansions): Unset TREE_PUBLIC on implicit - instantiations. - -Wed Nov 2 15:08:24 1994 Kung Hsu - - * decl.c (finish_function): Emit types used in method parameters - into symbol table. - -Wed Nov 2 15:05:47 1994 Jason Merrill - - * pt.c (process_template_parm): Allow pointer to member function - template parameter types. - (uses_template_parms): Handle pointer to member function - CONSTRUCTORs. - - * g++.c (main): Cast first argument of bzero to (char *). - Pass -lstdc++ instead of -lg++ unless we are invoked as 'g++'. - -Mon Oct 31 14:50:48 1994 Kung Hsu - - * gc.c (build_dynamic_cast): rewrite to make it work. - * class.c (finish_vtbls): build more vtables if flag_rtti is on. - * class.c (modify_all_direct_vtables): ditto. - * init.c (expand_direct_vtbls_init): expand more vtables if - flag_rtti is on. - * decl.c (init_type_desc): add default return. - -Tue Oct 25 17:13:09 1994 Kung Hsu - - * tree.c (debug_binfo): get rid of the initial size entry of - vtable. - * cp-tree.h: change flag_dossier to flag rtti, define type - descriptor type nodes. - * decl.c (init_type_desc): new function to initialize type - descriptor type nodes. - * decl.c (record_builtin_type): change flag_dossier to flag_rtti. - * lex.c (init_lex): ditto. - * decl.c : change variable flag_dossier to flag_rtti. - * decl.c (duplicate_decls): get rid initial size entry of vtable. - * decl.c (hack_incomplete_structures): take out assert 164. - * search.c (get_abstract_virtuals_1): ditto. - * search.c (dfs_init_vbase_pointers): change CLASSTYPE_DOSSIER to - CLASSTYPE_RTTI. - * parse.y: ditto. - * class.c (prepare_fresh_vtable): for virtual bases, get right - offset. - * class.c (add_virtual_function): change flag_dossier to - flag_rtti. - * class.c (modify_one_vtable): modify the right rtti entry. - * class.c (override_one_vtable): get rid of size entry. - * class.c (finish_struct): change flag_dossier to flag_rtti, and - build extra vtables, build type descriptors for polymorphic - classes. - * gc.c (build_headof): make headof() works correctly with new - rtti. - * gc.c (build_typeid): make this function work with new rtti. - * gc.c (get_typeid): make this function work with new rtti. - * gc.c (build_bltn_desc): new function for new rtti. - * gc.c (build_user_desc): ditto. - * gc.c (build_class_desc): ditto. - * gc.c (build_ptr_desc): ditto. - * gc.c (build_attr_desc): ditto. - * gc.c (build_func_desc): ditto. - * gc.c (build_ptmf_desc): ditto. - * gc.c (build_ptmd_desc): ditto. - * gc.c (build_t_desc): ditto. - * gc.c : comment out old build_t_desc, build_i_desc, build_m_desc. - -Tue Oct 25 13:37:41 1994 Jason Merrill - - * call.c (convert_harshness): Check for TREE_UNSIGNED differences - after checking for integral conversions. - -Wed Nov 30 19:13:50 1994 Mike Stump - - * Version 2.6.3 released. - -Thu Nov 17 10:56:50 1994 Jason Merrill - - * typeck2.c (build_m_component_ref): Check the basetype of the - member pointer against the main variant of the object type. - -Mon Nov 14 14:21:52 1994 Jason Merrill - - * cvt.c (convert_to_reference): Make sure that the original expr - gets its type back when converting a reference. - - * method.c (build_overload_name): Clear numeric_outputed_need_bar here. - (build_decl_overload): Instead of here. - -Tue Nov 8 17:11:24 1994 Jason Merrill - - * cvt.c (cp_convert): Don't build a TARGET_EXPR if we're not in a - function. - - * typeck.c (convert_for_initialization): Handle initialization from - a TARGET_EXPR. - -Sun Nov 6 01:34:24 1994 Jason Merrill - - * pt.c (lookup_nested_type_by_name): Fix list-walking logic. - (tsubst): When replacing a TEMPLATE_TYPE_PARM, propagate - TYPE_READONLY and TYPE_VOLATILE from the argument. - (unify): When unifying with a TEMPLATE_TYPE_PARM, remove cv-quals - present in parm from arg. - (type_unification): Strip REFERENCE_TYPE from the argument type. - (unify): Don't strip REFERENCE_TYPE from the argument type. - -Sat Nov 5 22:42:15 1994 Greg McGary - - * pt.c (do_type_instantiation): Check to see if there's a - IDENTIFIER_TEMPLATE on a class before calling - instantiate_member_templates(). - -Sat Nov 12 06:35:42 1994 Mike Stump - - * Version 2.6.2 released. - -Thu Nov 3 18:48:19 1994 Paul Eggert - - * Makefile.in (spew.o, lex.o, pt.o): - Depend on $(srcdir)/parse.h, not parse.h. - -Tue Nov 1 19:19:41 1994 Mike Stump - - * Version 2.6.1 released. - -Sun Oct 23 13:19:55 1994 Jason Merrill - - * decl2.c: Declare flag_access_control. - (struct lang_f_options): Add access-control. - * expr.c (cplus_expand_expr, NEW_EXPR): Unset flag_access_control - for the call to expand_aggr_init to copy the object out of the - pcc_struct_return slot. - * search.c (compute_access): if (!flag_access_control) return - access_public. - -Fri Oct 21 00:32:54 1994 Jason Merrill - - * lex.c (cons_up_default_function): Don't try to defer method - synthesis now. - - * decl.c (init_decl_processing): Use __pure_virtual for abort_fndecl - instead of abort, since the OSF/1 dynamic linker doesn't like to see - relocation entries for abort. - - * tree.c (array_type_nelts_total): Use sizetype, not - integer_type_node. - (array_type_nelts_top): Likewise. - -Thu Oct 20 15:48:27 1994 Mike Stump - - * decl.c (grokdeclarator): Added handling for catch parameters - (CATCHPARM). - * except.c (expand_start_catch_block): Use the new CATCHPARM context - instead of NORMAL. - * except.c (expand_throw): Don't let convert_to_reference complain - about what we are doing. - -Thu Oct 20 12:55:24 1994 Jim Wilson - - * method.c (emit_thunk): Call instantiate_virtual_regs. - -Wed Oct 19 14:15:33 1994 Mike Stump - - * except.c (expand_exception_blocks): Make sure throw code doesn't - get put in function that won't be output. - -Mon Oct 17 18:03:15 1994 Jason Merrill - - * decl.c (init_decl_processing): Make alloca a builtin. - -Thu Oct 27 21:10:25 1994 Craig Burley - - * g++.c (main): Only decrement "added" and set "library" to - NULL when "library" != NULL (just like 940829 fix). - -Mon Oct 17 15:56:11 1994 Mike Stump - - * except.c (expand_start_catch_block): Make sure the false label - gets onto the permanent obstack, as it is used for the exception - table. - -Fri Oct 14 18:54:48 1994 Mike Stump - - * class.c (modify_one_vtable): Since the DECL_CONTEXT of fndecl can - be set just below, use current_fndecl instead. - -Fri Oct 14 15:12:22 1994 Jason Merrill - - * init.c (expand_aggr_vbase_init_1): Don't call expand_aggr_init_1 - with LOOKUP_SPECULATIVELY. - (expand_default_init): Abort if build_method_call returns NULL_TREE. - - * typeck.c (build_modify_expr): Don't just build a MODIFY_EXPR if - the rhs is a TARGET_EXPR. - - * parse.y (left_curly): Anonymous types are not affected by #pragma - interface/implementation. - - * method.c (synthesize_method): Don't call setup_vtbl_ptr for the - default constructor if it isn't needed. - - * lex.c (cons_up_default_function): Do synthesize methods for - anonymous types if necessary. - -Thu Oct 13 17:44:55 1994 Jason Merrill - - * method.c (build_decl_overload): Set numeric_outputed_need_bar to 0. - -Wed Oct 12 13:27:57 1994 Jason Merrill - - * typeck.c (build_modify_expr): Understand how to copy an aggregate. - - * init.c (expand_default_init): Likewise. Also remove some of the - crufty code that assumes methods will not be synthesized properly. - - * lex.c (cons_up_default_function): If the containing type has no - name, these functions should never need to be called, so just - declare them. - - * lex.c (real_yylex): Use HOST_BITS_PER_WIDE_INT to determine the - bitmask for lexing character constants. - - * call.c (build_method_call): Disable code that tries to do tricky - stuff with a default parameter that is a constructor call, but - actually does other tricky stuff that breaks things. - -Wed Oct 12 16:14:01 1994 Benoit Belley - - * decl.c (finish_enum): Disable code which forces enums to be signed, - since this conflicts with their use as bitfields. type_promotes_to - handles promotion of enums of underlying unsigned types to signed - integer types. - -Wed Oct 12 13:24:03 1994 Jason Merrill - - * cvt.c (type_promotes_to): Also promote enums to long if - appropriate. - - * typeck.c (default_conversion): Don't expect type_promotes_to to - return a main variant. - -Wed Oct 12 12:19:45 1994 Jason Merrill - - * call.c (build_scoped_method_call): Don't lose side effects in the - object expression when calling a non-existent destructor. - -Fri Sep 2 19:05:21 1994 Rohan Lenard - - * call.c (build_scoped_method_call): Remove erroneous error message - when destructor call is written as a scoped call. - -Tue Oct 11 23:48:31 1994 Jason Merrill - - * various: Cast pointer arguments to bzero and bcopy to char *. - -Tue Oct 11 19:34:32 1994 Mike Stump - - * class.c (get_derived_offset): Added a type parameter to limit how - far up the CLASSTYPE_VFIELD_PARENT chain we search. - * class.c (modify_one_vtable, fixup_vtable_deltas): When forming the - offset to put into the vtable for the this parameter, make sure we - don't offset from a parent of the DECL_CONTEXT of the function. - -Tue Oct 11 16:10:52 1994 Jason Merrill - - * pt.c (do_function_instantiation): Set DECL_EXTERNAL and - TREE_STATIC when setting DECL_INTERFACE_KNOWN. - (do_type_instantiation): Likewise. - - * lex.c (cons_up_default_function): Set DECL_INTERFACE_KNOWN, - DECL_EXTERNAL and TREE_STATIC as appropriate. - - * decl2.c (finish_file): Also synthesize methods that don't have - DECL_EXTERNAL set. Set interface_unknown before doing so. - - * decl.c (start_function): If DECL_INTERFACE_KNOWN is set on the - function decl, don't muck with TREE_PUBLIC and DECL_EXTERNAL. - -Mon Oct 10 00:56:53 1994 Jason Merrill - - * lex.c (cons_up_default_function): Mark methods in a template class - as template instances. Store the values of interface_unknown and - interface_only for do_pending_inlines. - (do_pending_inlines): Use them. - - * decl2.c (finish_file): If we haven't seen a definition of a - function declared static, make the decl non-PUBLIC so compile_file - can give an error. - -Sun Oct 9 02:42:29 1994 Jason Merrill - - * method.c (do_build_copy_constructor): Handle anonymous unions. - (do_build_assign_ref): Likewise. - (largest_union_member): Move from lex.c. - -Sat Oct 8 14:59:43 1994 Jason Merrill - - Re-implement g++'s vague linkage independent of TREE_PUBLIC. - * pt.c (instantiate_member_templates): Lose redundant - -fexternal-templates handling. - (tsubst): Set TREE_PUBLIC and DECL_EXTERNAL on new decls. Don't set - TREE_STATIC or DECL_INTERFACE_KNOWN. - (do_pending_expansions): Predicate on DECL_INTERFACE_KNOWN instead - of DECL_EXTERNAL for explicit instantiations. - (do_function_instantiation): Do the new thing. - (do_type_instantiation): Likewise. - (instantiate_template): Deal with member templates defined in a .cc - file with -fexternal-templates. - * except.c (expand_exception_blocks): Use DECL_LINKAGE_KNOWN to - decide whether to stick builtin_throw here. - * decl2.c (import_export_inline): Predicate on DECL_INTERFACE_KNOWN - rather than TREE_PUBLIC. Generally fix rules. - (finish_file): Use DECL_INITIAL to determine whether or not a method - has been synthesized, rather than TREE_ASM_WRITTEN. - * decl.c (warn_extern_redeclared_static): Use DECL_PUBLIC instead of - TREE_PUBLIC. - (pushdecl): Likewise. - (duplicate_decls): Likewise. Deal with DECL_DECLARED_STATIC and - DECL_INTERFACE_KNOWN. - (redeclaration_error_message): Fix checking for conflicting linkage. - (define_function): Set DECL_INTERFACE_KNOWN. - (grokfndecl): Function decls are PUBLIC until we are sure about - their linkage. Set DECL_DECLARED_STATIC as needed. - (start_function): Deal with linkage. Move pushdecl after linkage - magic. - (finish_function): Don't set TREE_ASM_WRITTEN on discarded inlines. - * cp-tree.h (lang_decl_flags): Add interface_known and - declared_static. - (DECL_INTERFACE_KNOWN): New macro. - (DECL_DECLARED_STATIC): New macro. - (DECL_PUBLIC): New macro. - - Clean up bogus use of TREE_PUBLIC. - * class.c (alter_access): Fix mistaken use of TREE_PUBLIC (it - doesn't correspond to TREE_PROTECTED and TREE_PRIVATE). - * init.c (do_friend): Don't arbitrarily set TREE_PUBLIC. - -Wed Oct 5 13:44:41 1994 Jason Merrill - - * call.c (build_overload_call_real): Don't immediately do - array->pointer conversion. - - * pt.c (type_unification): If not passing to a reference, strip - cv-quals. Also handle array->pointer conversion. - -Tue Oct 4 17:45:37 1994 Jason Merrill - - * decl.c (grokdeclarator): Don't warn about applying const to a - const typedef or template type parameter. - - * decl2.c (finish_file): Also synthesize methods after walking the - vtables. Ugly ugly ugly. - -Mon Oct 3 15:02:41 1994 Jason Merrill - - * various: Remove lingering remnants of old exception handling code. - - * decl2.c (finish_file): Synthesize methods before walking the - vtables, so that the vtables get emitted as needed. - - * decl.c (shadow_tag): Remove obsolete code for pushing tags and - dealing with exceptions. - -Mon Oct 3 13:05:27 1994 Ian Lance Taylor - - * Make-lang.in (g++-cross): Depend upon version.o and $(LIBDEPS). - -Mon Oct 3 02:59:28 1994 Jason Merrill - - * decl2.c (finish_file): Fix inline handling. - -Sun Oct 2 00:21:56 1994 Jason Merrill - - * decl.c (grokdeclarator): Handle redundant scope even better. - ({push,pop}_cp_function_context): Take toplev parameter. - - * method.c (synthesize_method): Pass toplev parameter to - {push,pop}_cp_function_context depending on decl_function_context - (fndecl). - - * typeck.c (build_x_unary_op): Unary & on OFFSET_REFs is always the - built-in version. - - * method.c (synthesize_method): Don't be confused by __in_chrg - parameter. - - * class.c (popclass): Set C_C_D like start_function does. - - * decl.c (grokdeclarator): Handle redundant scope better. - - * parse.y (expr_or_declarator): Add '(' expr_or_declarator ')' rule. - (direct_notype_declarator): Likewise. - (complex_direct_notype_declarator): Remove it here. - -Sat Oct 1 21:42:18 1994 Jason Merrill - - * init.c (resolve_offset_ref): Fix types used in resolving .* - expressions. - -Sat Oct 1 15:18:49 1994 Jason Merrill - - Beginnings of work to synthesize methods only when needed. - * call.c (build_method_call): Synthesize methods as necessary - (currently never necessary). - * class.c (popclass): Don't try to set C_C_D here, as it'll end up - on the wrong obstack. - * decl.c (push_cp_function_context): Mostly copied from - push_c_function_context. - (pop_cp_function_context): Similarly. - (finish_function): Reverse order of poplevel and pop_nested_class so - that current_class_decl is restored properly. - (start_function): Likewise. - (finish_function): Add parameter 'nested'. Don't call - permanent_allocation if (nested). - * various: Pass extra parameter to finish_function. - * decl2.c (finish_file): Reorganize end-of-file inline handling, - synthesizing methods as necessary. - * lex.c (cons_up_default_function): Call mark_inline_for_output. - Only synthesize methods immediately if #pragma implementation - (currently disabled). - (do_pending_inlines): Call synthesize_method. - * method.c (synthesize_method): New function; all method synthesis - goes through here. Calls do_build_assign_ref and - do_build_copy_constructor. - (build_default_constructor): Remove. - (build_dtor): Likewise. - (build_assign_ref): Rename to do_build_assign_ref and remove stuff - done by synthesize_method. - (build_copy_constructor): Similarly. - -Thu Sep 29 16:58:52 1994 Mike Stump - - * typeck.c (c_expand_return): Use magic so the backend can fixup the - assignment into the return register, so cleanups won't clobber it. - -Thu Sep 29 13:08:50 1994 Jason Merrill - - * method.c (hack_identifier): Don't call assemble_external for - template decls. - - * decl.c (finish_decl): Also end temporary allocation if the decl in - question has a type of error_mark_node. - -Wed Sep 28 21:45:00 1994 Mike Stump - - * typeck.c (build_modify_expr): When optimizing ?: on lhs, make sure - that if the ?: was a reference type, that the subparts will be also. - -Wed Sep 28 16:14:04 1994 Brendan Kehoe - - * except.c (register_exception_table): Use Pmode, not PTRmode. - -Fri Sep 23 13:54:27 1994 Jason Merrill - - * lex.c (do_pending_inlines): Do method synthesis after the - pending_inlines have been reversed. - -Thu Sep 22 12:53:03 1994 Per Bothner - - * decl2.c (finish_file): Fix Brendan's fix: Only call - register_exception_table if there is a non-empty exception table. - -Thu Sep 22 12:03:46 1994 Brendan Kehoe - - * decl2.c (finish_file): Only do register_exception_table if - -fhandle-exceptions is being used. - -Wed Sep 21 19:01:51 1994 Per Bothner - - * except.c (output_exception_table_entry): Simplify - by using assemble_integer. - (build_exception_table): Change to return a count. - Cleanup to use standard macros, instead of hard-wired - sparc asm format. Don't make __EXCEPTION_TABLE__ global. - (register_exception_table): New function. Generate call to builtin. - * decl2.c (finish_file): Call register_exception_table. - * cp-tree.h (build_exception_table): Fix prototype. - -Wed Sep 21 13:20:42 1994 Brendan Kehoe - - * tree.c (break_out_calls): Don't try to duplicate the DECL_INITIAL. - - * decl2.c (delete_sanity): Give an error at trying to delete a - function. - -Wed Sep 21 11:47:10 1994 Jason Merrill - - * lex.c (cons_up_default_function): Mark synthesized destructors - inline. - - * decl.c (duplicate_decls): Ignore redeclarations of wchar_t as - something other than __wchar_t, complaining if -pedantic and not in - a system header. - -Tue Sep 20 09:43:28 1994 Jason Merrill - - * decl.c (xref_tag): Set up BINFO_INHERITANCE_CHAIN on base binfos - here. - - * typeck.c (build_modify_expr): Require complete type after checking - for error_mark_node. - - * call.c (build_method_call): Print parmtypes when complaining of - ambiguous call. - - * typeck.c (build_modify_expr): Handle assignment to array from - non-array. - - * decl.c (lookup_name_real): Deal with got_scope == error_mark_node. - - * call.c (build_method_call): Don't bother with the exact match. - -Mon Sep 19 00:51:39 1994 Jason Merrill - - * init.c (expand_aggr_init): If we munge the type of the variable, - also munge the type of the initializer. - - * decl.c (grokdeclarator): Use <= when comparing to RID_LAST_MODIFIER. - (init_decl_processing): Push artificial declaration of wchar_t so - people don't have to declare it before they can use it. - - * error.c (cp_line_of): return lineno in lieu of 0. - - * typeck.c (convert_for_assignment): Handle conversion of pmfs to - int and bool. - (build_component_ref): Fold the COMPONENT_REF in case it can be - reduced. - - * typeck2.c (store_init_value): Don't pedwarn about non-constant - bracketed initializers for automatic variables. - -Sun Sep 18 10:12:12 1994 Jason Merrill - - * error.c (dump_decl): Don't say `typedef enum foo foo'. - - * decl.c (start_decl): Don't set TREE_PUBLIC on template decls just - because they're affected by #pragma i/i. We'll deal with that when - they get instantiated. - - * typeck.c (build_unary_op): Clean up cruft in ADDR_EXPR case. - - * class.c (instantiate_type): Set TREE_CONSTANT on instantiated - ADDR_EXPRs if appropriate. - - * decl.c (build_ptrmemfunc_type): Unset IS_AGGR_TYPE on pmf types. - - * typeck.c (build_ptrmemfunc): Handle &overloaded_method as an - initializer properly. - * typeck2.c (digest_init): Likewise. - - * tree.c (cp_build_type_variant): Like c_build_type_variant, except - it uses build_cplus_array_type. - * *.c: Use cp_build_type_variant instead of c_build_type_variant. - - * pt.c (do_type_instantiation): Don't try to instantiate nested - enums. - -Tue Sep 13 10:56:58 1994 Jason Merrill - - * cvt.c (build_up_reference): Handle preincrement and predecrement - properly. - -Tue Sep 13 09:51:59 1994 Brendan Kehoe - - * decl.c (finish_decl): Only lay out the rtl for DECL if it is, in - fact, static. - -Mon Sep 12 14:40:30 1994 Brendan Kehoe - - * decl.c (finish_decl): Lay out the rtl for DECL before doing - grok_reference_init, in case it's static. - -Mon Sep 12 12:45:38 1994 Jason Merrill - - * class.c (finish_struct): Don't synthesize constructors if the - class has a field with the same name as the class. Don't die on - classes with no constructors or destructors. Don't die if the head - and tail of the class are in different files. - - * decl.c (grokdeclarator): Don't treat a function pointer field - with the same name as the class as a constructor. - -Fri Sep 9 13:17:00 1994 Jason Merrill - - * typeck.c (build_c_cast): Pull constant values out of their - variables here. - - * decl.c (duplicate_decls): Only propagate DECL_CHAIN in - FUNCTION_DECLs and TEMPLATE_DECLs. - -Thu Sep 8 10:07:48 1994 Jason Merrill - - * decl.c (duplicate_decls): Propagate DECL_CHAIN in all DECLs that - have it. - - * pt.c (unify): REALs and INTEGERs only unify with their own genus. - (instantiate_member_templates): Don't muck with DECL_EXTERNAL and - TREE_PUBLIC unless -fexternal-templates. - -Wed Sep 7 13:17:10 1994 Jason Merrill - - * pt.c (do_type_instantiation): Call instantiate_member_templates. - Deal with specializations. - (tsubst): Don't stick the mangled name in DECL_NAME for function - instantiations. Don't push them, either. - - * decl2.c (grokfield): Move code for generating the - DECL_ASSEMBLER_NAME for static members from here. - * method.c (build_static_name): To here. - * decl.c (grokvardecl): Call build_static_name. - (duplicate_decls): Keep old DECL_ASSEMBLER_NAME. - -Mon Sep 5 12:49:18 1994 Jason Merrill - - * call.c (build_method_call): if -Wsynth, warn when selecting - synthesized op= over user-supplied one cfront would select. - * decl2.c (lang_decode_option): Handle -Wsynth. - -Fri Sep 2 15:11:59 1994 Jason Merrill - - * decl.c (finish_enum): Overhaul to fix several bugs. - (start_enum): Disable useless code. - -Thu Sep 1 16:04:54 1994 Jason Merrill - - * typeck.c (c_expand_return): Warn about returning a reference to a - temporary. - (convert_arguments): Increment argument counter when using default - arguments, too. - -Wed Aug 31 14:29:22 1994 Jason Merrill - - * decl.c (finish_decl): If the type of decl is error_mark_node, - don't bother trying to do anything. - - * typeck.c (convert_for_initialization): If the rhs contains a - constructor call, pretend the lhs type needs to be constructed. - - * init.c (expand_default_init): If we stick the object inside the - initializer, mark the initializer used. - -Tue Aug 30 13:50:18 1994 Jason Merrill - - * method.c (build_assign_ref): return *this; - (build_assign_ref): Fix base assignment order. - (build_copy_constructor): Fix member init order. - -Mon Aug 29 13:54:39 1994 Brendan Kehoe - - * g++.c (main): Remember to clear out SAW_SPECLANG after we see - its argument. - -Sat Aug 27 09:36:03 1994 Jason Merrill - - * method.c (build_copy_constructor): Also copy virtual bases. - -Fri Aug 26 17:05:15 1994 Jason Merrill - - * lex.c (do_pending_inlines): Clear out pending_inlines before doing - any synthesis. Also first set deja_vu on all pending_inlines. - - * method.c (build_assign_ref): Use build_member_call to invoke base - operator=, rather than build_modify_expr. And use - build_reference_type instead of TYPE_REFERENCE_TO. - (build_copy_constructor): Use TYPE_NESTED_NAME to identify the - basetype. - - * decl2.c (grokfield): Don't complain about undefined local class - methods. - - * class.c (finish_struct): Don't try to synthesize methods here. - * lex.c (do_pending_inlines): Instead, synthesize them here. - (init_lex): Initialize synth_obstack. - (cons_up_default_function): Stick synthesis request on - pending_inlines. - -Fri Aug 26 12:24:14 1994 Brendan Kehoe - - * call.c (build_method_call) [PCC_STATIC_STRUCT_RETURN]: Also - accept an RTL_EXPR in what we're about to use for the instance, - since anything which would end up with pcc_struct_return set - inside cplus_expand_expr. - - * cp-tree.h (cons_up_default_function): Note change of prototype. - -Thu Aug 25 23:05:30 1994 Gerald Baumgartner - - * class.c (finish_struct): Undid change from Aug 21 testing - CLASSTYPE_INTERFACE and CLASSTYPE_VTABLE_NEEDS_WRITING. - * parse.y (left_curly): Likewise, undid change from Aug 21. - * decl.c (xref_tag): Undid change from Aug 21, set - CLASSTYPE_INTERFACE correctly, and added comments. - -Thu Aug 25 00:36:31 1994 Jason Merrill - - Rework approach to synthesized methods; don't go through the parser - anymore. - * class.c (finish_struct): Use new synthesis approach. - * lex.c (cons_up_default_function): Now just creates declaration, - not code. - (largest_union_member): #if 0 out. - (default_assign_ref_body): Likewise. - (default_copy_constructor_body): Likewise. - * method.c (build_default_constructor): New function to synthesize X(). - (build_copy_constructor): Synthesize X(X&). - (build_assign_ref): Synthesize X::operator=(X&). - (build_dtor): Synthesize ~X(). - - * error.c (cp_line_of): If we're dealing with an artificial - TYPE_DECL, look at the type instead. - -Wed Aug 24 11:11:50 1994 Jason Merrill - - * init.c (sort_member_init): Check warn_reorder. - * decl2.c (lang_decode_option): Handle -W{no-,}reorder. - - * cp-tree.h (CLASSTYPE_SOURCE_LINE): New macro. - * error.c (cp_line_of): Use CLASSTYPE_SOURCE_LINE for aggregates. - * class.c (finish_struct): Set CLASSTYPE_SOURCE_LINE. - -Tue Aug 23 09:28:35 1994 Mike Stump - - * error.c (dump_decl): Improve wording, so that error messages - dont't read template<, class foo>... - -Mon Aug 22 15:30:51 1994 Brendan Kehoe - - * parse.y (label_colon): Also match a TYPENAME as a label name, - since they may have declared a class by that name but have also - tried to have a local label under the same name. - - * pt.c (coerce_template_parms): Call cp_error, not cp_error_at, - for the message so they know at what point it was instantiated. - -Sun Aug 21 23:07:35 1994 Gerald Baumgartner - - * class.c (finish_struct): Move setting of CLASSTYPE_INTERFACE and - CLASSTYPE_VTABLE_NEEDS_WRITING for signatures up to left_curly time. - * decl.c (xref_tag): Move setting of CLASSTYPE_INTERFACE and - CLASSTYPE_VTABLE_NEEDS_WRITING for signatures down to left_curly time. - * parse.y (left_curly): New final resting place for setting - CLASSTYPE_INTERFACE and CLASSTYPE_VTABLE_NEEDS_WRITING for signatures. - - * class.c (finish_struct): Don't test for function/field name - conflicts in signatures, since all the fields are compiler-constructed. - -Fri Aug 19 14:04:47 1994 Kung Hsu - - * method.c (build_overload_nested_name): in qualified name - mangling, the template with value instantiation will have numeric - at end and may mixed with the name length of next nested level. - Add a '_' in between. - * method.c (build_overload_name): ditto. - * method.c (build_overload_identifier): ditto. - -Thu Aug 18 16:24:43 1994 Mike Stump - - * error.c (dump_decl): Handle NULL args. - -Thu Sep 29 16:15:36 1994 Michael I Bushnell - - * g++.c: Rework last change so it's done like collect.c (and - gcc.c). - -Wed Sep 14 10:17:27 1994 Michael I Bushnell - - * g++.c: Include in case `errno' is a macro - as permitted by ANSI C. - -Thu Aug 18 12:48:09 1994 Mike Stump - - * class.c (finish_struct): Move setting of CLASSTYPE_INTERFACE and - CLASSTYPE_VTABLE_NEEDS_WRITING up to left_curly time. - * decl.c (xref_tag): Move setting of CLASSTYPE_INTERFACE and - CLASSTYPE_VTABLE_NEEDS_WRITING down to left_curly time. - * parse.y (left_curly): New final resting place for setting - CLASSTYPE_INTERFACE and CLASSTYPE_VTABLE_NEEDS_WRITING. - -Thu Aug 11 11:32:42 1994 H.J. Lu - - * g++.c (main): Only decrement "added" and set "library" to - NULL when "library" != NULL. - -Sat Aug 13 00:14:52 1994 Jason Merrill - - * decl.c (grokdeclarator): Don't set TREE_PUBLIC on a function decl - just because its class has a known interface. - (decls_match): Deal with new format of template parms. - - * lex.c (cons_up_default_function): Don't play with TREE_PUBLIC and - DECL_EXTERNAL here. - -Fri Aug 12 01:55:15 1994 Jason Merrill - - * decl.c (pushtag): SET_DECL_ARTIFICIAL on gratuitous typedefs. - (xref_defn_tag): Likewise. - (pushdecl): Only allow artificial typedefs to be shadowed. - - * init.c (emit_base_init): Pass the right binfos to - expand_aggr_init_1. - - * class.c (delete_duplicate_fields_1): Make it work right. - (finish_struct): Catch function/field name conflict. - - * decl2.c (check_classfn): Pass the function to cp_error, not just - the name. - - * init.c (sort_member_init): Warn when order of member initializers - does not match order of member declarations. - (emit_base_init): Call expand_aggr_init_1 with LOOKUP_PROTECT. - - * error.c (dump_expr): Handle lists of functions. - - * decl.c (start_function): #pragma interface only affects functions - that would otherwise be static. - (finish_decl): Don't warn about an unused variable if it has both - constructor and destructor, since the 'resource allocation is - initialization' idiom is relatively common. - - * typeck.c (comp_target_types): Don't handle TEMPLATE_TYPE_PARMs. - (comp_target_parms): Likewise. - (compparms): Never consider default parms. - (common_base_type): Don't choose a virtual baseclass if there is a - more derived class in common. - (build_conditional_expr): If pedantic, pedwarn about conversion to - common base in conditional expr. - - * class.c (instantiate_type): Handle template instantiation better. - - * typeck.c (convert_arguments): Don't try to get tricky and convert - to int directly when PROMOTE_PROTOTYPES is set, as it breaks - user-defined conversions. - - * lex.c (check_for_missing_semicolon): Also give error at end of - file. - - * call.c (build_method_call): Don't promote arrays to pointers here. - - * typeck.c (convert_arguments): Don't require the actual parameter - to be of a complete type if the formal parameter is a reference. - -Thu Aug 11 15:21:40 1994 Jason Merrill - - * decl.c (grokdeclarator): Soften 'static' on member function error - to pedwarn. - - * init.c (build_new): Don't automatically save rval. - (build_offset_ref): Do field lookup with proper basetype_path. - -Thu Aug 11 12:46:54 1994 Brendan Kehoe - - * errfn.c (cp_silent): Declare to mark when we should avoid - emitting warnings and errors. - (cp_error): Check it. - (cp_warning): Likewise. - (cp_pedwarn): Likewise. - (cp_compiler_error): Likewise. - (cp_error_at): Likewise. - (cp_warning_at): Likewise. - (cp_pedwarn_at): Likewise. - * call.c (compute_conversion_costs): Set CP_SILENT when we start - out, and make sure we turn it off before we leave. - -Thu Aug 11 00:02:54 1994 Jason Merrill - - * decl2.c (grok_array_decl): Try computing *(A+B) if neither - argument is obviously an array. - -Wed Aug 10 15:32:04 1994 Jason Merrill - - * typeck.c (c_expand_start_case): Do cleanups here. - - * parse.y (xcond): Do bool conversion here, too. - (simple_stmt, SWITCH case): Don't do cleanups here. - - * decl.c (duplicate_decls): Don't treat builtins that have been - explicitly declared specially. - -Tue Aug 9 01:16:09 1994 Jason Merrill - - * tree.c (make_deep_copy): Support copying pointer, reference, - function, array, offset and method types. - - * decl.c (init_decl_processing): Mark exit and abort as - BUILT_IN_NONANSI so that duplicate_decls is kinder about - redeclaration. - (duplicate_decls): Don't give two errors for redeclaring a C - function with the same parms but a different return type. - - * parse.y (paren_cond_or_null): Do cleanup and bool conversion here. - (condition): Instead of here. - (simple_stmt, SWITCH case): Also do cleanup here. - - * decl2.c (finish_anon_union): Only break out FIELD_DECLs. - - * call.c (build_method_call): Don't throw away the side effects of - the object in a call to a non-existent constructor. - * parse.y (primary): Likewise. - - * method.c (build_decl_overload): Oop. - - * decl2.c (lang_decode_option): Deal with flag_no_nonansi_builtin, - warn about uselessness of specifying -fansi-overloading. - - * method.c (build_decl_overload): Treat any non-member new with one - parameter as __builtin_new. - - * decl.c (init_decl_processing): Setup built-in meanings of exit, - _exit and abort. - -Mon Aug 8 15:03:30 1994 Jason Merrill - - * error.c (dump_readonly_or_volatile): Put a space between const and - volatile if both apply. - - * init.c (perform_member_init): Clean up after this initialization. - (emit_base_init): Clean up after each base init, not after all have - been done. - (expand_aggr_vbase_init_1): Clean up after this init. - -Sun Aug 7 14:55:05 1994 Jason Merrill - - * call.c (build_method_call): Deal with destroying references. - - * parse.y (condition): Do bool_truthvalue_conversion here. - (paren_expr_or_null): And here. - (simple_if): Not here. - (simple_stmt): Or here. - -Sat Aug 6 22:29:45 1994 Jason Merrill - - * parse.y (paren_expr_or_null): Wrap the expression in a - CLEANUP_POINT_EXPR. - (condition): Likewise. - -Sat Aug 6 19:46:37 1994 Rohan Lenard - - * call.c (build_scoped_method_call): Fix error message when - destructor call refers to a nonexistent type. - -Sat Apr 16 22:43:30 1993 Gerald Baumgartner - - * lex.h (rid): Deleted RID_RAISES, it's never used. - Moved RID_PUBLIC, RID_PRIVATE, RID_PROTECTED, RID_EXCEPTION, - RID_TEMPLATE and RID_SIGNATURE to the end of the enumeration, - they don't need to be touched in `grokdeclarator.' - (RID_LAST_MODIFIER): Defined macro to be RID_MUTABLE. - - * decl.c (grokdeclarator): Use RID_LAST_MODIFIER instead of - RID_MAX as loop limit for finding declaration specifiers. - -Sat Apr 3 21:59:07 1993 Gerald Baumgartner - - * lex.c (debug_yytranslate): Moved to parse.y since it needs to - access `yytname,' which is static in parse.c. - -Fri Apr 2 23:36:57 1993 Gerald Baumgarnter - - * cp-tree.h (GNU_xref_ref): Fixed typo in extern declaration, it - was `GNU_xref_def' instead of `GNU_xref_ref.' - -Fri Aug 5 14:20:16 1994 Jason Merrill - - * pt.c (do_function_instantiation): Don't set TREE_PUBLIC and - DECL_EXTERNAL on 'extern' instantiations; wait until EOF to do that. - (do_type_instantiation): Likewise. - - * decl2.c (import_export_inline): Decides at EOF what an inline's - linkage should be. - (finish_file): Call it. - - * decl.c (start_function): Don't rely on the settings of TREE_PUBLIC - and DECL_EXTERNAL from do_*_instantiation. Only set - DECL_DEFER_OUTPUT on inlines whose linkage might actually change. - (finish_function): Use DECL_DEFER_OUTPUT to decide which inlines to - mark for later consideration, rather than DECL_FUNCTION_MEMBER_P. - -Fri Aug 5 01:12:20 1994 Mike Stump - - * class.c (get_class_offset_1, get_class_offset): New routine to - find the offset of the class where a virtual function is defined, - from the complete type. - * class.c (modify_one_vtable, fixup_vtable_deltas): Use - get_class_offset instead of virtual_offset as get_class_offset will - always provide the right answer. - * tree.c (virtual_offset): Remove. It only ever worked some of the - time. - -Tue Aug 2 12:44:21 1994 Jason Merrill - - * call.c (build_method_call): Put back unary_complex_lvalue call - that I thought was redundant. - - * typeck.c (c_expand_return): Fix a case I missed before. - -Sun Jul 31 17:54:02 1994 Jason Merrill - - * pt.c (unify): Strip cv-quals from template type arguments (when - 'const T*' is matched to 'const char*', that does not mean that T is - 'const char'). - -Fri Jul 29 01:03:06 1994 Jason Merrill - - * pt.c (do_type_instantiation): Instantiate nested TAGS, not - typedefs. Third time's the charm? - - * parse.y (template_parm): Support default template parms. - * pt.c (process_template_parm): Likewise. - (end_template_parm_list): Likewise. - (coerce_template_parms): Likewise. - (mangle_class_name_for_template): Likewise. - (push_template_decls): Likewise. - (unify): Likewise. - * method.c (build_overload_identifier): Likewise. - * error.c (dump_decl): Likewise. - -Wed Jul 27 17:47:00 1994 Jason Merrill - - * pt.c (do_type_instantiation): Only instantiate nested *classes*. - -Tue Jul 26 13:22:40 1994 Jason Merrill - - * search.c (note_debug_info_needed): Also emit debugging information - for the types of fields. - -Mon Jul 25 00:34:44 1994 Jason Merrill - - * pt.c (lookup_template_class): Pass 'template' to - coerce_template_parms instead of 'in_decl', since it's a more - meaningful context. - - * typeck.c (c_expand_return): Make sure any cleanups for the return - expression get run. - (build_c_cast): Use CONVERT_EXPR for conversion to void. - - * pt.c (do_type_instantiation): Also instantiate nested types. - - * typeck.c (convert_for_assignment): Don't die when comparing - pointers with different levels of indirection. - - * decl.c (grokdeclarator): The sub-call to grokdeclarator for - class-local typedefs sets DECL_ARGUMENTS, so we need to clear it - out. - - * decl2.c (finish_anon_union): Don't die if the union has no - members. - - * decl.c (grokdeclarator): Undo changes to declspecs when we're done - so that 'typedef int foo, bar;' will work. - - * decl2.c (finish_file): Don't call expand_aggr_init for - non-aggregates. - -Mon Jul 25 00:03:10 1994 Teemu Torma - - * decl.c (finish_function): We can't inline constructors and - destructors under some conditions with -fpic, but don't unset - DECL_INLINE. - -Mon Jul 25 00:03:10 1994 Jason Merrill - - * typeck.c (build_object_ref): Make sure 'datum' is a valid object. - -Sun Jul 24 14:19:31 1994 Jason Merrill - - * class.c (finish_struct): Don't set DECL_FIELD_BITPOS on - non-fields. - (finish_struct_methods): Use copy_assignment_arg_p. - - * cvt.c (cp_convert): If expr is an OFFSET_REF, resolve it instead - of giving an error. - - * typeck.c (build_binary_op_nodefault): Don't set result_type if we - don't know how to compare the operands. - - * decl.c (grokdeclarator): Avoid seg fault when someone uses '__op' - as a declarator-id in their program. Like the Linux headers do. - Arrgh. - - * tree.c (lvalue_p): Treat calls to functions returning objects by - value as lvalues again. - - * typeck.c (build_component_addr): Use convert_force to convert the - pointer in case the component type is also a private base class. - - * search.c (get_matching_virtual): Fix bogus warning of overloaded - virtual. - - * pt.c (overload_template_name): Set DECL_ARTIFICIAL on the created - TYPE_DECL to fix bogus shadowing warnings. - -Fri Jul 22 01:15:32 1994 Jason Merrill - - * init.c (expand_aggr_init_1): const and volatile mismatches do not - prevent a TARGET_EXPR from initializing an object directly. - -Tue Jul 19 17:55:37 1994 Jason Merrill - - * cvt.c (build_up_reference): Allow building up references to - `this', don't warn about making references to artificial variables - (like `this'). - - * tree.c (lvalue_p): `this' is not an lvalue. - - * call.c (build_method_call): Accept using a typedef name (or - template type parameter) for explicit destructor calls. - -Thu Jul 14 09:42:23 1994 Mike Stump - - * Version 2.6.0 released. - -Wed Jul 13 03:57:54 1994 Jason Merrill - - * method.c (hack_identifier): Put back old code so lists of - non-functions will be handled properly. - - * cp-tree.h (TYPE_NEEDS_CONSTRUCTING): #if 0 out; this macro is now - defined in the language-independent tree.h. - - * tree.c (count_functions): Avoid bogus warning when compiling this - function. - -Mon Jul 11 18:37:20 1994 Jason Merrill - - * decl.c (grok_reference_init): Always save the initializer of a - reference. - -Fri Jul 8 17:41:46 1994 Mike Stump - - * decl.c (cplus_expand_expr_stmt): Wrap statement expressions inside - CLEANUP_POINT_EXPRs so that the stack slots can be reused. - (disabled for now) - -Fri Jul 8 12:59:38 1994 Jason Merrill - - * method.c (hack_identifier): Fix for new overloading. - - * typeck.c (build_binary_op_nodefault): Don't mess with division by - zero. - -Fri Jul 8 13:20:28 1994 Gerald Baumgartner - - * decl2.c (finish_file): Only call walk_sigtables, if - flag_handle_signatures is turned on, don't waste time otherwise. - -Fri Jul 8 02:27:41 1994 Jason Merrill - - * decl.c (push_overloaded_decl): Don't create overloads of one when - shadowing a class type. - * typeck.c (build_x_function_call): Complain about overloads of one. - - * decl.c (grokdeclarator): Don't try to treat a char* as a tree. - (grokdeclarator): Fix setting of TREE_STATIC. - (start_decl): Clear DECL_IN_AGGR_P after calling duplicate_decls. - -Thu Jul 7 22:20:46 1994 Gerald Baumgartner - - * cp-tree.h (walk_sigtables): Created extern declaration. - * decl2.c (walk_sigtables): Created function, patterned after - walk_vtables, even though we only need it to write out sigtables. - (finish_sigtable_vardecl): Created function. - (finish_vtable_vardecl): Changed 0 to NULL_PTR. - (finish_file): Call walk_sigtables. - - * sig.c (build_signature_table_constructor): Mark class member - function pointed to from signature table entry as addressable. - -Thu Jul 7 13:39:37 1994 Jason Merrill - - * decl.c (start_decl): Check new decl of static member variable - against the declaration in the class here. - (grokvardecl): Instead of here. - - * class.c (prepare_fresh_vtable): Call import_export_vtable if not - -fvtable-thunks. - (build_vtable): Likewise. - - * decl2.c (import_export_vtable): Move logic for deciding the - interface of a template class from here. - (import_export_template): To here. - (finish_vtable_vardecl): Call import_export_template before - import_export_vtable. - -Wed Jul 6 20:25:48 1994 Mike Stump - - * except.c (init_exception_processing): Setup interim_eh_hook to - call lang_interim_eh. - * except.c (do_unwind): Propagate throw object value across - stack unwinding. - * except.c (saved_throw_value): Used to hold the value of the object - being thrown. It is always a reference to the real value. - * except.c (expand_start_catch_block): Add handling for the - value of the exception object. - * except.c (expand_start_catch_block): Add handler for the handler, - so that throws inside the handler go to the outer block. - * except.c (expand_end_catch_block): Likewise. - * parse.y (handler_args): Use parm instead, as the other doesn't yet - handle references correctly. - -Wed Jul 6 17:55:32 1994 Per Bothner - - * decl2.c (mark_vtable_entries): If -ftable-thunks, set the - vtable entry properly to abort. - -Tue Jul 5 14:07:54 1994 Jason Merrill - - * typeck.c (build_binary_op_nodefault): Downgrade division by zero - errors to warnings. - - * call.c (build_overload_call_real): Handle fnname being a list of - functions. - * typeck.c (build_x_function_call): Pass list of functions to - build_overload_call, not just the name. - * tree.c (count_functions): Complain when called for invalid - argument. - - * decl.c (grokdeclarator): Fix settings of TREE_STATIC, TREE_PUBLIC - and DECL_EXTERNAL on static members and initialized const members. - * decl2.c (grokfield): Reflect this change. - -Fri Jul 1 09:35:51 1994 Jason Merrill - - * parse.y (init): ANSI C++ does not forbid { }. - -Thu Jun 30 00:35:22 1994 Jason Merrill - - * decl2.c (lang_decode_option): Set warn_nonvdtor along with -Wall. - warn_nonvdtor defaults to off. - - * class.c (instantiate_type): Use comptypes rather than relying on - types to satisfy ==. - - * decl.c (start_function): Set DECL_DEFER_OUTPUT on all inlines that - might be static. - - * tree.c (build_cplus_new): Never build WITH_CLEANUP_EXPRs. - - * decl.c (grok_reference_init): Deal with ADDR_EXPRs of TARGET_EXPRs. - - * cvt.c (cp_convert): Pass 0 to with_cleanup_p arg of - build_cplus_new. - -Wed Jun 29 22:31:09 1994 Jason Merrill - - * decl2.c (finish_file): Maybe consider static inlines multiple - times, in case they reference each other. - -Tue Jun 28 11:58:38 1994 Gerald Baumgartner - - * class.c (finish_struct): Don't `cons_up_default_function's - for signatures. - (finish_struct): Handle an empty method_vec correctly. - - * decl.c (grokdeclarator): Don't warn about a signature being - empty in a signature pointer declaration if we only saw a - forward declaration of the signature. Changed `warning's into - `cp_warning's. - - * sig.c (build_sigtable): Don't die if a null signature table - constructor is returned. - (build_signature_pointer_constructor): If the signature table - constructor is null, the _sptr field is set to a null pointer - and cast to the appropriate type. Make copies of all null - pointers so that the type null_pointer_node doesn't get changed. - (build_signature_table_constructor): Added comments. - - * sig.c (build_signature_pointer_constructor): Complain if we - try to assign to/initialize a signature pointer/reference of - an undefined signature. - -Mon Jun 27 14:05:16 1994 Gerald Baumgartner - - * typeck2.c (store_init_value): Don't be pedantic about - non-constant initializers of signature tables/pointers/references. - -Fri Jun 24 16:49:41 1994 Gerald Baumgartner - - * decl.c (grokdeclarator): If we are grokking an opaque typedef - in a signature, don't complain about it begin static. - -Wed Jun 29 16:44:45 1994 Mike Stump - - Fixes a problem of the this pointer being wrong in virtual calls to - methods that are not overridden in more derived classes. - - * class.c (fixup_vtable_delta): New routine. It will fixup the - delta entries in vtables, wheever they need updating. - * class.c (finish_struct): Call the new routine for all virtual - bases, as they can have different offsets, than those used in base - classes that we derive our vtable from. - -Tue Jun 28 23:49:28 1994 Jason Merrill - - * typeck.c (build_binary_op): Use the types before default - conversions in the error message. - - * *.c: Use c_build_type_variant instead of build_type_variant where - the type might be an array. - - * call.c (build_method_call): Call build_type_variant and - build_reference_type in the right order. - * decl.c (record_builtin_type): Likewise. - -Wed Jun 29 16:58:53 1994 Jason Merrill - - * call.c (build_method_call): Call build_type_variant and - build_reference_type in the right order. - * decl.c (record_builtin_type): Likewise. - -Tue Jun 28 23:49:28 1994 Jason Merrill - - * typeck.c (build_binary_op): Use the types before default - conversions in the error message. - - * *.c: Use c_build_type_variant instead of build_type_variant where - the type might be an array. - -Sat Jun 25 11:50:54 1994 Jason Merrill - - * cvt.c (convert_to_reference): Try UDC's before doing the - reinterpret_cast thang, though. - -Fri Jun 24 01:24:01 1994 Jason Merrill - - * typeck.c (c_expand_return): Don't USE the return value location - after we've expanded the jump. - - * decl2.c (finish_file): Make sure DECL_SAVED_INSNS is not 0 before - trying to write out an inline. - - * cvt.c (build_up_reference): Also do address adjustment when the - target type uses MI. - (convert_to_reference): Try UDCs only after built-in conversions. - (build_type_conversion_1): Don't play games with the argument to the - method. - (build_type_conversion): #if 0 out code for binding to reference. - -Thu Jun 23 00:22:28 1994 Jason Merrill - - * decl2.c (finish_file): Use TREE_SYMBOL_REFERENCED to decide - whether to emit inlines. - - * decl.c (grokdeclarator): Set explicit_int for decls that just - specify, say, 'long'. - - * init.c (do_friend): Do overload C functions (or call pushdecl, - anyaway). - -Wed Jun 22 13:40:49 1994 Jason Merrill - - * cvt.c (build_up_reference): Don't call readonly_error. - (convert_to_reference): Propagate const and volatile from expr to - its type. - - * tree.c (lvalue_p): Random CALL_EXPRs are not lvalues. - - * cvt.c (build_up_reference): Break out WITH_CLEANUP_EXPR when - creating a temporary. - (convert_to_reference): Lose excessive and incorrect trickiness. - (cp_convert): Call build_cplus_new with with_cleanup_p set. - - * typeck2.c (build_functional_cast): Likewise. - -Tue Jun 21 17:38:38 1994 Jason Merrill - - * decl.c (grokdeclarator): signed, unsigned, long and short all - imply 'int'. - - * decl.c (grokdeclarator): Allow "this is a type" syntax. - (grok_reference_init): Simplify and fix. - -Sun Jun 19 17:08:48 1994 Jason Merrill - - * decl.c (grokdeclarator): pedwarn about a typedef that specifies no - type. - -Sat Jun 18 04:16:50 1994 Jason Merrill - - * decl.c (start_function): Move TREE_PUBLIC and DECL_EXTERNAL - tinkering to after call to pushdecl. - -Fri Jun 17 14:48:28 1994 Jason Merrill - - * call.c (build_method_call): Handle destructors for non-aggregate - types properly. - -Thu Jun 16 16:48:05 1994 Jason Merrill - - * call.c (build_method_call): Make sure that the name given for the - destructor matches the constructor_name of the instance. - - * pt.c (do_function_instantiation): A non-extern instantiation - overrides a later extern one. - (do_type_instantiation): Likewise. - -Wed Jun 15 19:34:54 1994 Jason Merrill - - * init.c (expand_aggr_init): Use TYPE_MAIN_VARIANT to get the - unqualified array type. - - * cp-tree.h (EMPTY_CONSTRUCTOR_P): Tests whether NODE is a - CONSTRUCTOR with no elements. - - * decl.c (various): Lose empty_init_node. - (finish_decl): Use EMPTY_CONSTRUCTOR_P, do the empty CONSTRUCTOR - thing depending on the value of DECL_COMMON instead of - flag_conserve_space, do the empty CONSTRUCTOR thing for types that - don't have constructors, don't treat a real empty CONSTRUCTOR - specially. - - * typeck2.c (process_init_constructor): Don't treat empty_init_node - specially. - -Wed Jun 15 19:05:25 1994 Mike Stump - - * class.c (override_one_vtable): Don't forget to merge in an old - overrider when we wanted to reuse a vtable, but couldn't. - -Wed Jun 15 15:03:16 1994 Jason Merrill - - * decl.c (start_decl): Put statics in common again. - - * decl.c (grokdeclarator): Return NULL_TREE for an error rather than - setting the type to error_mark_node. - - * typeck.c (build_modify_expr): Build up a COMPOUND_EXPR for enum - bitfield assignments. - -Tue Jun 14 12:23:38 1994 Jason Merrill - - * decl.c (grok_op_properties): Const objects can be passed by value. - -Mon Jun 13 03:10:59 1994 Jason Merrill - - * decl2.c (import_export_vtable): Force implicit instantiations to - be interface_only when -fno-implicit-templates. - - * decl.c (duplicate_decls): Redeclaring a class template name is an - error. - - * pt.c (end_template_decl): Call GNU_xref_decl for class templates. - * xref.c (GNU_xref_decl): Support templates. - -Sat Jun 11 17:09:05 1994 Jason Merrill - - * decl.c (grok_op_properties): Split out checking for whether this - function should suppress the default assignment operator. - * decl2.c (grok_function_init): Likewise. - (copy_assignment_arg_p): New function to do just that. - Now considers virtual assignment operators that take a base as an - argument to count as copy assignment operators. - - * search.c (dfs_debug_mark): Lose checks for DWARF_DEBUG and - TREE_ASM_WRITTEN, as they are redundant. - - * pt.c (end_template_decl): Don't try to set DECL_CLASS_CONTEXT on a - decl that has no LANG_SPECIFIC part. - (do_type_instantiation): Force the debugging information for this - type to be emitted. - - * decl.c (start_decl): Clear up uses of various types of templates - (say sorry for static data members, rather than "invalid template"). - (expand_static_init): Fix initialization of static data members of - template classes. - -Fri Jun 10 00:41:19 1994 Jason Merrill - - * decl.c (grokdeclarator): Set DECL_CONTEXT on static data members. - - * g++.c (main): Use -xc++-cpp-output for .i files. - - * pt.c (tsubst): Give meaningful error about declaring template for - a copy constructor which was not declared in the class template. - (do_type_instantiation): Explicit instantiation before the class - template is an error. - (instantiate_template): Don't die if tsubst returns error_mark_node. - -Thu Jun 9 19:04:59 1994 Jason Merrill - - Don't synthesize the copy assignment operator if the one in a base - class is pure virtual. - * cp-tree.h (TYPE_HAS_ABSTRACT_ASSIGN_REF): New macro to indicate - whether the type has a pure virtual copy assignment operator. - * class.c (finish_base_struct): Don't generate the copy assignment - operator if a base class has a pure virtual one. - * decl.c (grok_op_properties): Add disabled code to set - TYPE_HAS_ABSTRACT_ASSIGN_REF with comment pointing to where it is - actually set. - * decl2.c (grok_function_init): Set TYPE_HAS_ABSTRACT_ASSIGN_REF. - - * decl2.c (import_export_vtable): Always treat template - instantiations as if write_virtuals >= 2, and treat implicit - instantiations as external if -fno-implicit-templates. - (finish_file): Output all pending inlines if - flag_keep_inline_functions. - -Wed Jun 8 20:48:02 1994 Mike Stump - - * tree.c (layout_vbasetypes): Align virtual base classes inside - complete objects, so that we don't core dump on machines such as - SPARCs when we access members that require larger than normal - alignments, such as a double. Also, we bump up the total alignment - on the complete type, as necessary. - -Wed Jun 8 16:18:14 1994 Jason Merrill - - * gxxint.texi (Free Store): New section with code for examining - cookie. - (Limitations of g++): Remove operator delete entry, since it is no - longer accurate. Fix access control entry. - - * typeck.c (build_unary_op): Pedwarn about taking the address of or - incrementing a cast to non-reference type. - (build_modify_expr): Use convert instead of convert_force again. - - * search.c (get_base_distance): Use IS_AGGR_TYPE_CODE to check for - class type, not == RECORD_TYPE. - - * decl.c (grokdeclarator): Cope with grokfndecl returning NULL_TREE. - - * typeck2.c (report_case_error): #if 0 out. - * lex.c (real_yylex): Lose RANGE. - * parse.y: Likewise. - -Tue Jun 7 18:17:35 1994 Jason Merrill - - * parse.y (simple_stmt, case ranges): Use ELLIPSIS instead of RANGE. - -Mon Jun 6 19:39:57 1994 Jason Merrill - - * typeck.c (build_c_cast): Don't shortcut conversions to the same - type. Don't replace consts with their values here, since that's now - done in cp_convert. - - * cvt.c (cp_convert): When converting to bool, take - integer_zero_node to false_node and all other INTEGER_CSTs to - true_node. - (build_type_conversion): Don't complain about multiple conversions - to float if we're not really converting. - -Fri Jun 3 02:10:56 1994 Jason Merrill - - Implement 'extern template class A;' syntax for suppressing - specific implicit instantiations. - * cp-tree.h: Update prototypes for do_*_instantiation. - * pt.c (do_pending_expansions): Don't compile 'extern' explicit - instantiations. - (do_function_instantiation): Set DECL_EXTERNAL on 'extern' explicit - instantiations. - (do_type_instantiation): Likewise. - * parse.y (explicit_instantiation): Support 'extern template class - A;' syntax. - * decl.c (start_function): Don't modify the settings of TREE_PUBLIC - and DECL_EXTERNAL on explicit instantiations. - - * cvt.c (cp_convert): Replace constants with their values before - converting. - (cp_convert): Consistently use 'e' instead of 'expr'. - -Thu Jun 2 03:53:30 1994 Jason Merrill - - * typeck2.c (build_x_arrow): Resolve OFFSET_REFs first. - -Wed Jun 1 18:57:35 1994 Jason Merrill - - * typeck2.c (digest_init): Handle initializing a pmf with an - overloaded method. - * typeck.c (build_ptrmemfunc): Handle overloaded methods. - - * decl.c (pushtag): Use build_decl to make TYPE_DECLs. - (xref_defn_tag): Likewise. - * pt.c (process_template_parm): Likewise. - (lookup_template_class): Likewise. - (push_template_decls): Likewise. - (instantiate_class_template): Likewise. - (create_nested_upt): Likewise. - * class.c (finish_struct): Don't try to set DECL_CLASS_CONTEXT on - TYPE_DECLs. - - * typeck.c (convert_arguments): Make sure type is not NULL before - checking its TREE_CODE. - -Wed Jun 1 17:40:39 1994 Mike Stump - - * class.c (get_derived_offset): New routine. - * class.c (finish_base_struct): Make sure we set BINFO_VTABLE and - BINFO_VIRTUALS when we choose a new base class to inherit from. - * class.c (modify_one_vtable): Use get_derived_offset to get the - offset to the most base class subobject that we derived this binfo - from. - * class.c (finish_struct): Move code to calculate the - DECL_FIELD_BITPOS of the vfield up, as we need might need it for - new calls to get_derived_offset in modify_one_vtable. - -Wed Jun 1 16:50:59 1994 Jason Merrill - - * init.c (build_member_call): Use build_pointer_type instead of - TYPE_POINTER_TO. - -Wed Jun 1 11:11:15 1994 Brendan Kehoe - - * decl.c (grokdeclarator): Make sure we have a DNAME set before we - try to use it in an error. - -Wed Jun 1 09:48:49 1994 Mike Stump - - * typeck.c (convert_arguments, convert_for_initialization): Don't - strip NOP_EXPRs, when we are converting to a reference. - -Wed Jun 1 01:11:38 1994 Jason Merrill - - * typeck.c (build_modify_expr): Don't dereference references when - initializing them. - - * decl2.c (grokfield): Don't check for grokdeclarator returning - error_mark_node any more. - - * decl.c (grokfndecl): Return NULL_TREE instead of error_mark_node. - (start_method): Return void_type_node instead of error_mark_node. - - * typeck.c (build_modify_expr): Resolve offset refs earlier. - -Tue May 31 16:06:58 1994 Jason Merrill - - * call.c (build_method_call): Resolve OFFSET_REFs in the object. - - * typeck.c (build_modify_expr): Dereference references before trying - to assign to them. - - * call.c (build_method_call): Don't confuse type conversion - operators with constructors. - * typeck2.c (build_functional_cast): Just call build_c_cast if there - was only one parameter. - * method.c (build_typename_overload): Don't set - IDENTIFIER_GLOBAL_VALUE on these identifiers. - * decl.c (grok_op_properties): Warn about defining a type conversion - operator that converts to a base class (or reference to it). - * cvt.c (cp_convert): Don't try to use a type conversion operator - when converting to a base class. - (build_type_conversion_1): Don't call constructor_name_full on an - identifier. - * cp-tree.h (DERIVED_FROM_P): Should be self-explanatory. - - * decl.c (start_decl): Don't complain that error_mark_node is an - incomplete type. - (finish_decl): Check for type == error_mark_node. - -Mon May 30 23:38:55 1994 Jason Merrill - - * decl.c (start_function): Set DECL_DEFER_OUTPUT on implicit - instantiations and inline members. - - * spew.c (yylex): Set looking_for_template if the next token is a '<'. - - * lex.h: Declare looking_for_template. - - * decl.c (lookup_name_real): Use looking_for_template to arbitrate - between type and template interpretations of an identifier. - -Sat May 28 04:07:40 1994 Jason Merrill - - * pt.c (instantiate_template): Zero out p if we found a - specialization. - - * decl.c (grokdeclarator): Elucidate warning. - (grokdeclarator): If pedantic AND -ansi, complain about long long. - - Make explicit instantiation work reasonably. It is now appropriate - to deprecate the use of -fexternal-templates. - * pt.c (instantiate_template): Set DECL_TEMPLATE_SPECIALIZATION or - DECL_IMPLICIT_INSTANTIATION on fndecl as appropriate. - (end_template_instantiation): Reflect changes in USE_TEMPLATE - semantics. - (do_pending_expansions): if (!flag_implicit_templates) DECIDE(0); - (do_function_instantiation): Don't set EXPLICIT_INST if - flag_external_templates is set. Do set TREE_PUBLIC and DECL_EXTERN - appropriately otherwise. - (do_type_instantiation): Set interface info for class. Set - TREE_PUBLIC and DECL_EXTERN for methods. Do none of this if - flag_external_templates is set. - * parse.y: Reflect changes in USE_TEMPLATE semantics. - * decl2.c: New flag flag_implicit_templates determines whether or - not implicit instantiations get emitted. This flag currently - defaults to true, and must be true for -fexternal-templates to work. - (finish_file): Consider flag_implement_inlines when - setting DECL_EXTERNAL. Consider flag_implicit_templates when - deciding whether or not to emit a static copy. - * decl.c (start_function): Set TREE_PUBLIC and DECL_EXTERNAL - properly for template instantiations. - (start_method): Set DECL_IMPLICIT_INSTANTIATION on methods of a - template class. - * cp-tree.h (CLASSTYPE_USE_TEMPLATE): Change semantics. - (DECL_USE_TEMPLATE): Parallel macro for FUNCTION and VAR_DECLs. - (various others): Accessor macros for the above. - -Fri May 27 13:57:40 1994 Jason Merrill - - * typeck.c (build_binary_op_nodefault): Division by constant zero is - an error. - -Fri May 27 13:50:15 1994 Mike Stump - - * class.c (override_one_vtable): Don't modify things we don't own. - -Fri May 27 01:42:58 1994 Jason Merrill - - * decl.c (finish_decl): Don't postpone processing the initializer of - a decl with DECL_EXTERNAL set, and do call rest_of_compilation for a - PUBLIC const at toplevel. - (grokdeclarator): pedwarn about initializing non-const or - non-integral statics in the class body. - - * decl.c (pushtag): Don't try to set DECL_CLASS_CONTEXT on a - TYPE_DECL. - - * call.c (convert_harshness): Dereference reference on rhs before - proceeding, properly grok passing const things to non-const - references. - - * typeck.c (build_unary_op): Soften error about taking the address - of main() to a pedwarn. - - * lex.c (default_copy_constructor_body): Unambiguously specify base - classes (i.e. A((const class ::A&)_ctor_arg) ). - (default_assign_ref_body): Likewise. - -Thu May 26 13:13:55 1994 Gerald Baumgartner - - * decl2.c (grokfield): Don't complain about local signature - method declaration without definition. - - * call.c (convert_harshness): If `type' is a signature pointer - and `parmtype' is a pointer to a signature, just return 0. We - don't really convert in this case; it's a result of making the - `this' parameter of a signature method a signature pointer. - - * call.c (build_method_call): Distinguish calling the default copy - constructor of a signature pointer/reference from a signature - member function call. - -Thu May 26 12:56:25 1994 Jason Merrill - - * decl2.c (grokfield): Don't set TREE_PUBLIC on member function - declarations. - - * decl.c (duplicate_decls): A previous function declaration as - static overrides a subsequent non-static definition. - (grokdeclarator): Don't set TREE_PUBLIC on inline method - declarations. - -Wed May 25 14:36:38 1994 Jason Merrill - - * decl.c (grokdeclarator): Handle initialization of static const - members. - (finish_decl): Likewise. - - * decl2.c (grokfield): Allow initialization of static const members - even when pedantic. - - * decl2.c (grokfield): Deal with grokdeclarator returning - error_mark_node. - - * decl.c (grok_ctor_properties): Return 0 for A(A) constructor. - (grokfndecl): Check the return value of grok_ctor_properties. - (start_method): Likewise. - - * parse.y (absdcl): Expand type_quals inline. - -Tue May 24 19:10:32 1994 Jason Merrill - - * decl.c (pushtag): Use IS_AGGR_TYPE rather than checking for a - RECORD_TYPE. - -Tue May 24 18:09:16 1994 Per Bothner - - * cp-tree.h (VTABLE_NAME_FORMAT): If flag_vtable_thunks, - always use "__vt_%s". - * decl2.c (finish_vtable_vardecl): Don't consider abstract virtuals - when looking for a "sentinal" method (to decide on emitting vtables). - * decl2.c (finish_file): Scan all decls for thunks that need - to be emitted. - * decl2.c (finish_vtable_vardecl): Don't bother calling emit_thunk. - * method.c (make_thunk): Use a more meaningful label. If there - exists a matching top-level THUNK_DECL re-use it; otherwise - create a new THUNK_DECL (and declare it). - * method.c (emit_thunk): Make thunk external/public depending - on the underlying method. - -Tue May 24 00:22:04 1994 Jason Merrill - - * pt.c (tsubst): Use lookup_name_nonclass to find guiding decls, not - lookup_name. - - * call.c (build_overload_call_real): Don't immediately pick a - function which matches perfectly. - - * decl.c (grokdeclarator): Use c_build_type_variant for arrays. - (grokdeclarator): Warn about, and throw away, cv-quals attached to a - reference (like 'int &const j'). - - * typeck.c (convert_arguments): Don't mess with i for methods. - * call.c (build_method_call): Pass the function decl to - convert_arguments. - - * typeck.c (comp_ptr_ttypes_real): New function. Implements the - checking for which multi-level pointer conversions are allowed. - (comp_target_types): Call it. - (convert_for_assignment): Check const parity on the ultimate target - type, too. And make those warnings pedwarns. - -Mon May 23 14:11:24 1994 Jason Merrill - - * error.c (dump_char): Use TARGET_* for character constants. - -Mon May 23 13:03:03 1994 Brendan Kehoe - - * tree.c (debug_no_list_hash): Make static. - - * decl.c (decls_match): Say the types don't match if newdecl ends up - with a null type, after we've checked if olddecl does. - (pushdecl): Check if the decls themselves match before looking for - an extern redeclared as static, to avoid inappropriate and incorrect - warnings. - -Fri May 20 14:04:34 1994 Jason Merrill - - * decl.c (grokdeclarator): Make warning about duplicate short, etc. - a pedwarn. - - * typeck.c (build_c_cast): Casting to function or method type is an - error. - - * class.c (finish_struct): Make warning for anonymous class with no - instances a pedwarn. - - * Makefile.in (stamp-parse): Expect a s/r conflict. - - * typeck.c (build_modify_expr): pedwarn about using a non-lvalue - cast as an lvalue. - -Thu May 19 12:08:48 1994 Jason Merrill - - * cvt.c (type_promotes_to): Make sure bool promotes to int rather - than unsigned on platforms where sizeof(char)==sizeof(int). - -Wed May 18 14:27:06 1994 Jason Merrill - - * typeck.c (build_c_cast): Tack on a NOP_EXPR when casting to - another variant. - (build_modify_expr): Don't strip NOP_EXPRs, and don't get tricky - and treat them as lvalues. - - * decl.c (shadow_tag): Do complain about forward declarations of - enums and empty declarations. - * parse.y: Don't complain about forward declarations of enums and - empty declarations. - - * typeck.c (convert_for_assignment): Complain about changing - the signedness of a pointer's target type. - - * parse.y (stmt): Move duplicated code for checking case values from - here. - * decl2.c (check_cp_case_value): To here. And add a call to - constant_expression_warning. - - * typeck.c (convert_for_assignment): Don't complain about assigning - a negative value to bool. - - * decl.c (init_decl_processing): Make bool unsigned. - - * class.c (finish_struct): Allow bool bitfields. - -Wed May 18 12:35:27 1994 Ian Lance Taylor - - * Make-lang.in (c++.install-man): Get g++.1 from $(srcdir)/cp. - -Wed May 18 03:28:35 1994 Jason Merrill - - * cvt.c (build_type_conversion): Lose special handling of - truthvalues. - - * search.c (dfs_pushdecls): Improve shadowing warning. - -Tue May 17 13:34:46 1994 Jason Merrill - - * init.c (build_delete): Throw away const and volatile on `this'. - - * decl.c (finish_enum): Put the constants in TYPE_VALUES again, - rather than the enumerators. - (pushtag): s/cdecl/c_decl/g - -Mon May 16 23:04:01 1994 Stephen R. van den Berg - - * cp/typeck.c (common_type): Attribute merging. - (comp_types): Utilise COMP_TYPE_ATTRIBUTES macro. - - * cp/parse.y: Revamp attribute parsing. - -Mon May 16 01:40:34 1994 Jason Merrill - - * decl.c (shadow_tag): Also check for inappropriate use of auto and - register. - - * method.c (build_overload_name): Clarify that the illegal case is a - pointer or reference to array of unknown bound. - - * error.c (dump_type_prefix): Print references to arrays properly. - - * typeck.c (various): Be more helpful in pointer - comparison diagnostics. - - * tree.c (lvalue_p): MODIFY_EXPRs are lvalues again. Isn't this - fun? - - * parse.y: Also catch an error after valid stmts. - - * search.c (dfs_init_vbase_pointers): Don't abort because `this' is - const. - - * typeck.c (convert_for_initialization): If call to - convert_to_reference generated a diagnostic, print out the parm - number and function decl if any. - - * errfn.c (cp_thing): Check atarg1 to determine whether or not we're - specifying a line, not atarg. - - * tree.c (build_cplus_method_type): Always make `this' const. - - * decl2.c (grokclassfn): If -fthis-is-variable and this function is - a constructor or destructor, make `this' non-const. - - * typeck.c (build_modify_expr): Don't warn specially about - assignment to `this' here anymore, since it will be caught by the - usual machinery. - - * various: Disallow specific GNU extensions (variable-size arrays, - etc.) when flag_ansi is set, not necessarily when pedantic is set, - so that people can compile with -pedantic-errors for tighter const - checking and such without losing desirable extensions. - - * typeck2.c (build_functional_cast): Call build_method_call with - LOOKUP_PROTECT. - (process_init_constructor): Only process FIELD_DECLs. - - * decl.c (finish_decl): Also force static consts with no explicit - initializer that need constructing into the data segment. - - * init.c (build_delete): Undo last patch, as it interferes with - automatic cleanups. - -Sat May 14 01:59:31 1994 Jason Merrill - - * call.c, class.h, cp-tree.h, cvt.c, decl2.c: Lose old overloading - code. - - * init.c (build_delete): pedwarn about using plain delete to delete - an array. - -Fri May 13 16:45:07 1994 Jason Merrill - - * typeck.c (comp_target_types): Be more helpful in contravariance - warnings, and make them pedwarns. - - * decl.c (grokdeclarator): Use decl_context to decide whether or not - this is an access declaration. - - * class.c (finish_struct_bits): Set TYPE_HAS_INT_CONVERSION if it - has a conversion to enum or bool, too. - -Fri May 13 16:31:27 1994 Mike Stump - - * method.c (emit_thunk): Make declaration for - current_call_is_indirect local (needed for hppa). - -Fri May 13 16:16:37 1994 Jason Merrill - - * pt.c (uses_template_parms): Grok BOOLEAN_TYPE. - (tsubst): Likewise. - -Fri May 13 16:23:32 1994 Mike Stump - - * pt.c (tsubst): If there is already a function for this expansion, - use it. - * pt.c (instantiate_template): Likewise. - -Fri May 13 10:30:42 1994 Brendan Kehoe - - * parse.y (implicitly_scoped_stmt, simple_stmt case): Use - kept_level_p for MARK_ENDS argument to expand_end_bindings, to avoid - generating debug info for unemitted symbols on some systems. - - * cp-tree.h (build_static_cast, build_reinterpret_cast, - build_const_cast): Add declarations. - -Fri May 13 09:50:31 1994 Mike Stump - - * search.c (expand_indirect_vtbls_init): Fix breakage from Apr 27 - fix. We now try get_binfo, and if that doesn't find what we want, - we go back to the old method, which still sometimes fails. - -Fri May 13 01:43:18 1994 Jason Merrill - - * parse.y (initdcl): Call cplus_decl_attributes on the right - variable. - * decl2.c (cplus_decl_attributes): Don't call decl_attributes for - void_type_node. - - * typeck.c (build_binary_op_nodefault): Change result_type for - comparison ops to bool. - (build_binary_op): Convert args of && and || to bool. - * cvt.c (build_default_binary_type_conversion): Convert args of && - and || to bool. - (build_default_unary_type_conversion): Convert arg of ! to bool. - (type_promotes_to): bool promotes to int. - -Fri May 13 01:43:18 1994 Mike Stump - - Implement the new builtin `bool' type. - * typeck.c (build_binary_op_nodefault): Convert args of && and || to - bool. - (build_unary_op): Convert arg of ! to bool. - * parse.y: Know true and false. Use bool_truthvalue_conversion. - * method.c (build_overload_value): Know bool. - (build_overload_name): Likewise. - * lex.c (init_lex): Set up RID_BOOL. - * gxx.gperf: Add bool, true, false. - * error.c (*): Know bool. - * decl.c (init_decl_processing): Set up bool, true, false. - * cvt.c (cp_convert): Handle conversion to bool. - (build_type_conversion): Likewise. - * *.c: Accept bool where integers and enums are accepted (use - INTEGRAL_CODE_P macro). - -Thu May 12 19:13:54 1994 Richard Earnshaw - - * g++.c: Use #ifdef for __MSDOS__, not #if. - -Thu May 12 18:05:18 1994 Mike Stump - - * decl2.c (lang_f_options): Handle -fshort-temps. -fshort-temps - gives old behavior , and destroys temporaries earlier. Default - behavior now conforms to the ANSI working paper. - -Thu May 12 14:45:35 1994 Jason Merrill - - * typeck.c (build_modify_expr): Understand MODIFY_EXPR as an lvalue. - Use convert_force to convert the result of a recursive call when we - are dealing with a NOP_EXPR. Don't automatically wrap MODIFY_EXPRs - in COMPOUND_EXPRs any more. - (various): Lose pedantic_lvalue_warning. - (unary_complex_lvalue): Understand MODIFY_EXPR. - - * cvt.c (convert_to_reference): Allow DECL to be error_mark_node if - we don't know what we're initializing. - -Wed May 11 01:59:36 1994 Jason Merrill - - * cvt.c (convert_to_reference): Modify to use convtype parameter. - Only create temporaries when initializing a reference, not when - casting. - (cp_convert): New main function. - (convert): Call cp_convert. - * cvt.c, decl.c, typeck.c: Fix calls to convert_to_reference. - * cp-tree.h (CONV_*): New constants used by conversion code for - selecting conversions to perform. - - * tree.c (lvalue_p): MODIFY_EXPRs are no longer lvalues. - - * typeck.c (build_{static,reinterpret,const_cast): Stubs that just - call build_c_cast. - * parse.y: Add {static,reinterpret,const}_cast. - * gxx.gperf: Likewise. - - * typeck.c (common_type): Allow methods with basetypes of different - UPTs. - (comptypes): Deal with UPTs. - (build_modify_expr): Wrap all MODIFY_EXPRs in a COMPOUND_EXPR. - - * pt.c (end_template_decl): Check for multiple definitions of member - templates. - - * call.c (build_method_call): Complain about calling an abstract - virtual from a constructor. - - * typeck.c (pointer_int_sum): Check for the integer operand being 0 - after checking the validity of the pointer operand. - - * typeck2.c (digest_init): Pedwarn about string initializer being - too long. - -Tue May 10 12:10:28 1994 Jason Merrill - - * decl.c (push_overloaded_decl): Only throw away a builtin if the - decl in question is the artificial one. - - * parse.y (simple_stmt, switch): Use implicitly_scoped_stmt because - expand_{start,end}_case cannot happen in the middle of a block. - - * cvt.c (build_type_conversion_1): Use convert again. - -Tue May 10 11:52:04 1994 Brendan Kehoe - - * typeck2.c (digest_init): Make sure we check for signed and - unsigned chars as well when warning about string initializers. - - * init.c (emit_base_init): Check if there's a DECL_NAME on the - member before trying to do an initialization for it. - -Tue May 10 11:34:37 1994 Mike Stump - - * except.c: Don't do anything useful when cross compiling. - -Tue May 10 03:04:13 1994 Jason Merrill - - * decl.c (duplicate_decls): Fix up handling of builtins yet again. - (push_overloaded_decl): Likewise. - - * cvt.c (convert): Don't look for void type conversion. - -Mon May 9 18:05:41 1994 Jason Merrill - - * init.c (do_friend): Only do a pushdecl for friends, not - pushdecl_top_level. - -Mon May 9 13:36:34 1994 Jim Wilson - - * decl.c (lookup_name_current_level): Put empty statement after - the label OUT to make the code valid C. - -Mon May 9 12:20:57 1994 Jason Merrill - - * typeck.c (build_binary_op_nodefault): Only complain about - comparing void * and a function pointer if void * is smaller. - -Sun May 8 01:29:13 1994 Jason Merrill - - * decl.c (lookup_name_current_level): Move through temporary binding - levels. - - * parse.y (already_scoped_stmt): Revive. - (simple_stmt): Use it again. - - * decl.c (poplevel): Always call poplevel recursively if we're - dealing with a temporary binding level. - -Sat May 7 10:52:28 1994 Mike Stump - - * decl.c (finish_decl): Make sure we run cleanups for initial values - of decls. Cures memory leak. - * decl.c (expand_static_init): Likewise for static variables. - * decl2.c (finish_file): Likewise for globals. - -Sat May 7 03:57:44 1994 Jason Merrill - - * typeck.c (commonparms): Don't complain about redefining default - args. - - * decl.c (duplicate_decls): Don't complain twice about conflicting - function decls. - (decls_match): Don't look at default args. - (redeclaration_error_message): Complain about redefining default - args. - - * call.c (build_overload_call_real): Also deal with guiding - declarations coming BEFORE the template decl. - - * pt.c (unify): Allow different parms to have different - cv-qualifiers. - (unify): Allow trivial conversions on non-template parms. - -Fri May 6 03:53:23 1994 Jason Merrill - - * pt.c (tsubst): Support OFFSET_TYPEs. - (unify): Likewise. - - * decl2.c (finish_decl_parsing): Call push_nested_class with a type. - - * init.c (build_offset_ref): Fix error message. - * search.c (lookup_field): Likewise. - - * call.c (build_scoped_method_call): Pass binfo to - build_method_call. - * typeck.c (build_object_ref): Likewise. - - * typeck2.c (binfo_or_else): Don't return a _TYPE. - - * class.c (finish_struct): Don't complain about re-use of inherited - names or shadowing of type decls. - * decl.c (pushdecl_class_level): Likewise. - - * decl.c (finish_enum): Set the type of all the enums. - - * class.c (finish_struct): Don't get confused by access decls. - - * cp-tree.h (TYPE_MAIN_DECL): New macro to get the _DECL for a - _TYPE. You can stop using TYPE_NAME for that now. - - * parse.y: Lose doing_explicit (check $0 instead). - * gxx.gperf: 'template' now has a RID. - * lex.h (rid): Likewise. - * lex.c (init_lex): Set up the RID for 'template'. - - * parse.y (type_specifier_seq): typed_typespecs or - nonempty_type_quals. Use it. - (handler_args): Fix bogus syntax. - (raise_identifier{,s}, optional_identifier): Lose. - * except.c (expand_start_catch_block): Use grokdeclarator to parse - the catch variable. - (init_exception_processing): The second argument to - __throw_type_match is ptr_type_node. - - Fri May 6 07:18:54 1994 Chip Salzenberg - - [ change propagated from c-decl.c of snapshot 940429 ] - * cp/decl.c (finish_decl): Setting asmspec_tree should not - zero out the old RTL. - -Fri May 6 01:25:38 1994 Mike Stump - - Add alpha exception handling support to the compiler. - Quick and dirty backend in except.c. - - * cp/*: Remove most remnants of old exception handling support. - * decl.c (finish_function): Call expand_exception_blocks to put - the exception hanlding blocks at the end of the function. - * dec.c (hack_incomplete_structures): Make sure expand_decl_cleanup - comes after expand_decl_init. - * except.c: Reimplementation. - * expr.c (cplus_expand_expr): Handle THROW_EXPRs. - * lex.c (init_lex): Always have catch, try and throw be reserved - words, so that we may always parse exception handling. - * parse.y: Cleanup to support new interface into exception handling. - * tree.def (THROW_EXPR): Add. - -Thu May 5 17:35:37 1994 Jason Merrill - - * parse.y (simple_stmt, for loops): Use implicitly_scoped_stmt. - (various): Lose .kindof_pushlevel and partially_scoped_stmt. - -Thu May 5 16:17:27 1994 Kung Hsu - - * parse.y (already_scoped_stmt): move expand_end_binding() to - fix the unmatched LBB/LBE in stabs. - -Thu May 5 14:36:17 1994 Jason Merrill - - * decl.c (set_nested_typename): Set TREE_MANGLED on the new - identifiers. - (pushdecl): Check TREE_MANGLED. - (xref_tag): Likewise. - * cp-tree.h (TREE_MANGLED): This identifier is a - DECL_NESTED_TYPENAME (named to allow for future use to denote - mangled function names as well). - - Implement inconsistency checking specified in [class.scope0]. - * decl.c (lookup_name_real): Don't set ICV here after all. - (finish_enum): Also set the type of the enumerators themselves. - (build_enumerator): Put the CONST_DECL in the list instead of its - initial value. - (pushdecl_class_level): Check inconsistent use of a name in the - class body. - * class.c (finish_struct): Check inconsistent use of a name in the - class body. Don't set DECL_CONTEXT on types here anymore. - * parse.y (qualified_type_name): Note that the identifier has now - been used (as a type) in the class body. - * lex.c (do_identifier): Note that the identifier has now been used - (as a constant) in the class body. - * error.c (dump_decl): Print type and enum decls better. - -Thu May 5 09:35:35 1994 Brendan Kehoe - - * typeck.c (build_modify_expr): Warn about assignment to `this'. - -Wed May 4 15:55:49 1994 Jason Merrill - - * init.c (build_delete): Use the global operator delete when - requested. - - * decl.c (lookup_name_real): If we find the type we're looking in a - base class while defining a class, set IDENTIFIER_CLASS_VALUE for - the type. - - * class.c (finish_struct): Remove a couple of dependencies on - language linkage. - - * decl.c (pushtag): Classes do nest in extern "C" blocks. - (pushdecl): Only set DECL_NESTED_TYPENAME on the canonical one for - the type. - (pushtag): Remove another dependency on the language linkage. - - * lex.c (cons_up_default_function): Don't set DECL_CLASS_CONTEXT to - a const-qualified type. - - * decl.c (push_overloaded_decl): Throw away built-in decls here. - (duplicate_decls): Instead of here. - -Wed May 4 15:27:40 1994 Per Bothner - - * typeck.c (get_member_function_from_ptrfunc): Do The Right - Thing (I hope) if we're using thunks. - -Wed May 4 13:52:38 1994 Jason Merrill - - * parse.y (specialization): aggr template_type_name ';'. - (named_class_head_sans_basetype): Use it. - (explicit_instantiation): Likewise. - (tmpl.2): Revert. - - * cvt.c (build_type_conversion_1): Use convert_for_initialization, - rather than convert, to do conversions after the UDC. - - * cp-tree.h (SHARED_MEMBER_P): This member is shared between all - instances of the class. - - * search.c (lookup_field): If the entity found by two routes is the - same, it's not ambiguous. - -Wed May 4 12:10:00 1994 Per Bothner - - * decl.c (lookup_name_real): Check for a NULL TREE_VALUE, - to prevent the compiler from crashing ... - -Wed May 4 11:19:45 1994 Jason Merrill - - * call.c (build_method_call): If we don't have an object, check - basetype_path to figure out where to look up the function. - - * typeck.c (convert_for_initialization): Pass TYPE_BINFO (type) to - build_method_call in case exp is NULL_TREE. - -Tue May 3 16:02:53 1994 Per Bothner - - Give a vtable entries a unique named type, for the sake of gdb. - * class.c (build_vtable_entry): The addres of a thunk now has - type vtable_entry_type, not ptr_type_node. - * method.c (make_thunk): Fix type of THUNK_DECL. - * class.c (add_virtual_function, override_one_vtable): Use - vfunc_ptr_type_node, instead of ptr_type_node. - * cp-tree.h (vfunc_ptr_type_node): New macro. - * decl.c (init_decl_processing): Make vtable_entry_type - be a unique type of pointer to a unique function type. - -Tue May 3 09:20:44 1994 Jason Merrill - - * parse.y (do_explicit): Sets doing_explicit to 1. - (explicit_instantiation): Use do_explicit rather than TEMPLATE - directly, add "do_explicit error" rule. - (datadef): Set doing_explicit to 0 after an explicit instantiation. - (tmpl.2): Don't instantiate if we see a ';' unless we're doing an - explicit instantiation. - (named_class_head_sans_basetype): Remove aggr template_type_name - ';' again. - -Mon May 2 23:17:21 1994 Jason Merrill - - * search.c (lookup_nested_tag): Lose. - - * decl2.c (grokfield): Set DECL_CONTEXT on TYPE_DECLs. - (lookup_name_nonclass): Lose. - - * decl.c (poplevel_class): Add force parameter. - (lookup_name_real): Fix handling of explicit scoping which specifies - a class currently being defined. Add 'nonclass' argument. - (lookup_name, lookup_name_nonclass): Shells for lookup_name_real. - - * class.c (finish_struct): Don't unset IDENTIFIER_CLASS_VALUEs here. - (popclass): Force clearing of IDENTIFIER_CLASS_VALUEs if we're being - called from finish_struct. - -Mon May 2 19:06:21 1994 Per Bothner - - * decl.c (init_decl_processing), cp-tree.h: Removed memptr_type. - (It seeems redundant, given build_ptrmemfunc_type.) - * typeck.c (get_member_function_from_ptrfunc), gc.c (build_headof, - build_classof): Use vtable_entry_type instead of memptr_type. - * method.c (emit_thunk): Call poplevel with functionbody==0 - to prevent DECL_INITIAL being set to a BLOCK. - -Mon May 2 15:02:11 1994 Jason Merrill - - * parse.y (named_class_head_sans_basetype): Add "aggr - template_type_name ';'" rule for forward declaration of - specializations. - -Mon May 2 15:02:11 1994 Jason Merrill - - * class.c (instantiate_type): Deal with pmf's. - - * Make-lang.in (cc1plus): Don't depend on OBJS or BC_OBJS, since - stamp-objlist does. - - * Makefile.in (../cc1plus): Depend on OBJDEPS. - (OBJDEPS): Dependency version of OBJS. - -Mon May 2 12:51:31 1994 Kung Hsu - - * search.c (dfs_debug_mark): unmark TYPE_DECL_SUPPRESS_DEBUG, not - DECL_IGNORED_P. - -Fri Apr 29 12:29:56 1994 Jason Merrill - - * class.c (finish_struct): Clear out memory of local tags. And - typedefs. - - * decl2.c (grokclassfn): Don't set DECL_CONTEXT to a cv-qualified - type. - * search.c (get_matching_virtual): Be more helpful in error message. - - * *: Use DECL_ARTIFICIAL (renamed from DECL_SYNTHESIZED). - - * lex.c (default_assign_ref_body): Expect TYPE_NESTED_NAME to work. - (default_copy_constructor_body): Likewise. - - * class.c (finish_struct): Don't gratuitously create multiple decls - for nested classes. - -Thu Apr 28 23:39:38 1994 Jason Merrill - - Avoid clobbering the arg types of other functions when reverting - static member functions. - * decl.c (revert_static_member_fn): Rearrange arguments, don't - require values for 'fn' and 'argtypes', add warning to comment - above. - (decls_match): Rearrange arguments in call to rsmf. - (grok_op_properties): Don't pass values for fn and argtypes. - * pt.c (instantiate_template): Don't pass values for fn and argtypes. - -Thu Apr 28 16:29:11 1994 Doug Evans - - * Make-lang.in (cc1plus): Depend on stamp-objlist. - * Makefile.in (BC_OBJS): Delete. - (OBJS): Cat ../stamp-objlist to get language independent files. - Include ../c-common.o. - (../cc1plus): Delete reference to BC_OBJS. - -Thu Apr 28 02:12:08 1994 Jason Merrill - - * search.c (compute_access): No really, deal with static members - properly. Would I lie to you? - - Implement lexical hiding of function declarations. - * pt.c (tsubst): Use lookup_name to look for function decls to guide - instantiation. - * method.c (build_opfncall): Use lookup_name_nonclass to look for - non-member functions. - * init.c (do_friend): Use lookup_name_nonclass to look for - functions. - * error.c (ident_fndecl): Use lookup_name to look for functions. - * decl2.c (lookup_name_nonclass): New function, skips over - CLASS_VALUE. - * decl.c (struct binding_level): Lose overloads_shadowed field. - (poplevel): Don't deal with overloads_shadowed. - (push_overloaded_decl): Do lexical hiding for functions. - * class.c (instantiate_type): Don't check non-members if we have - members with the same name. - * call.c (build_method_call): Use lookup_name_nonclass instead of - IDENTIFIER_GLOBAL_VALUE to check for non-member functions. - (build_overload_call_real): Likewise. - - * decl.c (duplicate_decls): Check for ambiguous overloads here. - (push_overloaded_decl): Instead of here. - - * decl.c (pushdecl): Back out Chip's last change. - - * decl.c (grok_op_properties): operators cannot be static members. - - * cp-tree.h (DECL_SYNTHESIZED): DECL_SOURCE_LINE == 0 - (SET_DECL_SYNTHESIZED): DECL_SOURCE_LINE = 0 - * lex.c (cons_up_default_function): Use SET_DECL_SYNTHESIZED. - - * method.c (do_inline_function_hair): Don't put friends of local - classes into global scope, either. - - * typeck2.c (build_functional_cast): Don't look for a function call - interpretation. - -Thu Apr 28 15:19:46 1994 Mike Stump - - * cp-tree.h: disable use of backend EH. - -Wed Apr 27 21:01:24 1994 Doug Evans - - * Make-lang.in (c++.distdir): mkdir tmp/cp first. - * Makefile.in (INCLUDES): Move definition to same place as - parent makefile. - (ALLOCA): Define. - (OLDAR_FLAGS): Delete. - (OLDCC): Define. - (DIR): Delete. - (CLIB): Define. - (####site): Delete. - (SUBDIR_USE_ALLOCA): Don't use ALLOCA if compiling with gcc. - -Wed Apr 27 19:10:04 1994 Kung Hsu - - * decl.c (xref_tag): not to use strstr(), it's not available on - all platforms. - -Wed Apr 27 18:10:12 1994 Jason Merrill - - * class.c (finish_struct): Resolve yet another class/pmf confusion. - - * call.c (build_overload_call_real): Don't take the single-function - shortcut if we're dealing with an overloaded operator. - -Wed Apr 27 17:35:37 1994 Mike Stump - - * search.c (get_base_distance): Search the virtual base class - binfos, incase someone wants to convert to a real virtual base - class. - * search.c (expand_indirect_vtbls_init): Use convert_pointer_to_real - instead of convert_pointer_to, as it now will work. - -Wed Apr 27 15:36:49 1994 Jason Merrill - - * cvt.c (convert_to_reference): Don't complain about casting away - const and volatile. - - * typeck.c (build_unary_op): References are too lvalues. - -Wed Apr 27 13:58:05 1994 Mike Stump - - * class.c (override_one_vtable): We have to prepare_fresh_vtable - before we modify it, not after, also, we cannot reuse an old vtable, - once we commit to a new vtable. Implement ambiguous overrides in - virtual bases as abstract. Hack until we make the class - ill-formed. - -Wed Apr 27 01:17:08 1994 Jason Merrill - - * parse.y (unary_expr): Expand new_placement[opt] and - new_initializer[opt] inline. - - * search.c (lookup_fnfields): Don't throw away the inheritance - information here, either. - (compute_access): Handle static members properly. - - * init.c (build_member_call): Always set basetype_path, and pass it - to lookup_fnfields. - - * search.c (lookup_field): Deal properly with the case where - xbasetype is a chain of binfos; don't throw away the inheritance - information. - (compute_access): protected_ok always starts out at 0. - - * init.c (resolve_offset_ref): Don't cast `this' to the base type - until we've got our basetype_path. - - * cp-tree.h (IS_OVERLOAD_TYPE): aggregate or enum. - - * cvt.c (build_up_reference): Use build_pointer_type rather than - TYPE_POINTER_TO. - - * call.c (convert_harshness_ansi): Call type_promotes_to for reals - as well. - - * cvt.c (type_promotes_to): Retain const and volatile, add - float->double promotion. - - * decl.c (grokdeclarator): Don't bash references to arrays into - references to pointers in function parms. Use type_promotes_to. - -Tue Apr 26 23:44:36 1994 Mike Stump - - Finish off Apr 19th work. - - * class.c (finish_struct_bits): Rename has_abstract_virtuals to - might_have_abstract_virtuals. - * class.c (strictly_overrides, override_one_vtable, - merge_overrides): New routines to handle virtual base overrides. - * class.c (finish_struct): Call merge_overrides to handle overrides - in virtual bases. - -Tue Apr 26 12:45:53 1994 Jason Merrill - - * typeck.c (build_function_call): Call build_function_call_real with - LOOKUP_NORMAL. - - * *: Don't deal with TYPE_EXPRs. - - * tree.c (lvalue_p): If the type of the expression is a reference, - it's an lvalue. - - * cvt.c (convert_to_reference): Complain about passing const - lvalues to non-const references. - (convert_from_reference): Don't arbitrarily throw away const and - volatile on the target type. - - * parse.y: Simplify and fix rules for `new'. - - * decl.c (grok_op_properties): operator void is illegal. - -Mon Apr 25 02:36:28 1994 Jason Merrill - - * parse.y (components): Anonymous bitfields can still have declspecs. - - * decl.c (pushdecl): Postpone handling of function templates like we - do C functions. - - * search.c (expand_indirect_vtbls_init): Fix infinite loop when - convert_pointer_to fails. - - * call.c (compute_conversion_costs_ansi): A user-defined conversion - by itself is better than that UDC followed by standard conversions. - Don't treat integers and reals specially. - - * cp-tree.h: Declare flag_ansi. - - * typeck.c (c_expand_return): pedwarn on return in void function - even if the expression is of type void. - (build_c_cast): Don't do as much checking for casts to void. - (build_modify_expr): pedwarn about array assignment if this code - wasn't generated by the compiler. - - * tree.c (lvalue_p): A comma expression is an lvalue if its second - operand is. - - * typeck.c (default_conversion): Move code for promoting enums and - ints from here. - * cvt.c (type_promotes_to): To here. - * call.c (convert_harshness_ansi): Use type_promotes_to. Also fix - promotion semantics for reals. - -Sun Apr 24 16:52:51 1994 Doug Evans - - * Make-lang.in (c++.install-common): Check for g++-cross. - * Makefile.in: Remove Cygnus cruft. - (config.status): Delete. - (RTL_H): Define. - (TREE_H): Use complete pathname, some native makes have minimal - VPATH support. - (*.o): Use complete pathname to headers in parent dir. - (doc, info, dvi): Delete. - -Sun Apr 24 16:52:51 1994 Doug Evans - - * Make-lang.in (c++.install-common): Check for g++-cross. - * Makefile.in: Remove Cygnus cruft. - (config.status): Delete. - (RTL_H): Define. - (TREE_H): Use complete pathname, some native makes have minimal - VPATH support. - (*.o): Use complete pathname to headers in parent dir. - (doc, info, dvi): Delete. - -Sun Apr 24 00:47:49 1994 Jason Merrill - - * decl.c (pushdecl): Avoid redundant warning on redeclaring function - with different return type. - (decls_match): Compare return types strictly. - -Fri Apr 22 12:55:42 1994 Jason Merrill - - * cvt.c (build_type_conversion): Do try to convert through other - pointers. This will fail if the class defines multiple pointer - conversions. - - * error.c (dump_type_prefix): Print out pointers to arrays properly. - (dump_type_suffix): Likewise. (was 'int *[]', now 'int (*)[]') - - * typeck.c (build_unary_op): Disallow ++/-- on pointers to - incomplete type. - - * decl.c (duplicate_decls): Check mismatched TREE_CODES after - checking for shadowing a builtin. If we're redeclaring a builtin - function, bash the old decl to avoid an ambiguous overload. - - * cvt.c (convert_to_reference): Don't force arrays to decay here. - - * tree.c (lvalue_p): A MODIFY_EXPR is an lvalue. - - * decl.c (duplicate_decls): Don't assume that the decls will have - types. - - Mon Apr 18 11:35:32 1994 Chip Salzenberg - - [ cp/* changes propagated from c-* changes in 940318 snapshot ] - * c-decl.c (pushdecl): Warn if type mismatch with another external decl - in a global scope. - - Fri Apr 22 06:38:56 1994 Chip Salzenberg - - * cp/typeck2.c (signature_error): Use cp_error for "%T". - - Mon Apr 18 11:59:59 1994 Chip Salzenberg - - [ cp/* changes propagated from c-* changes in 940415 snapshot ] - * cp/decl.c (duplicate_decls, pushdecl, builtin_function): - Use DECL_FUNCTION_CODE instead of DECL_SET_FUNCTION_CODE. - - Mon Apr 18 11:55:18 1994 Chip Salzenberg - - [ cp/* changes propagated from c-* changes in 940409 snapshot ] - * cp/decl.c (duplicate_decls): Put new type in same obstack as - old ones, or permanent if old ones in different obstacks. - - Mon Apr 18 11:48:49 1994 Chip Salzenberg - - [ cp/* changes propagated from c-* changes in 940401 snapshot ] - * cp/parse.y (attrib): Handle string args as expressions, - merging the two rules. `mode' attribute now takes a string arg. - Delete the rule for an identifier as arg. - - Mon Apr 18 11:24:00 1994 Chip Salzenberg - - [ cp/* changes propagated from c-* changes in 940312 snapshot ] - * cp/typeck.c (pointer_int_sum): Multiplication should be done signed. - (pointer_diff): Likewise the division. - - Sun Mar 6 19:43:39 1994 Chip Salzenberg - - [ cp/* changes propagated from c-* changes in 940304 snapshot ] - * cp/decl.c (finish_decl): Issue warning for large objects, - if requested. - - Sat Feb 19 22:20:32 1994 Chip Salzenberg - - [ cp/* changes propagated from c-* changes in 940218 snapshot ] - * cp/parse.y (attrib): Handle attribute ((section ("string"))). - * cp/decl.c (duplicate_decls): Merge section name into new decl. - - Tue Feb 8 09:49:17 1994 Chip Salzenberg - - [ cp/* changes propagated from c-* changes in 940206 snapshot ] - * cp/typeck.c (signed_or_unsigned_type): Check for any - INTEGRAL_TYPE_P not just INTEGER_TYPE. - - Mon Dec 6 13:35:31 1993 Norbert Kiesel (norbert@i3.INformatik.rwth-aachen.DE) - - * cp/decl.c (finish_enum): Start from 0 when determining precision - for short enums. - - Fri Dec 3 17:07:58 1993 Ralph Campbell (ralphc@pyramid.COM) - - * cp/parse.y (unary_expr): Look at $1 for tree_code rather than - casting $$. - - Wed Nov 17 19:22:09 1993 Chip Salzenberg - - * cp/typeck.c (build_binary_op_nodefault): Propagate code - from C front-end to optimize unsigned short division. - (build_conditional_expr): Fix bug in "1 ? 42 : (void *) 8". - - Wed Nov 17 19:17:18 1993 Chip Salzenberg - - * cp/call.c (convert_harshness_ansi): Given an (e.g.) char - constant, prefer 'const char &' to 'int'. - - Wed Feb 3 13:11:48 1993 Chip Salzenberg - - * cp/class.c (finish_struct_methods): Handle multiple - constructors in fn_fields list. - -Fri Apr 22 12:48:10 1994 Kung Hsu - - * class.c (finish_struct): use TYPE_DECL_SUPPRESS_DEBUG to flag - types not to be dumped in stabs, like types in #pragma interface. - * decl.c (init_decl_processing): use TYPE_DECL_SUPPRESS_DEBUG to - mark unknown type. - -Fri Apr 22 03:27:26 1994 Doug Evans - - * Language directory reorganization. - See parent makefile. - -Thu Apr 21 18:27:57 1994 Per Bothner - - * cp-tree.h (THUNK_DELTA): It is normally negative, so - use signed .i variant of frame_size rather than unsigned .u. - * cp-tree.h (VTABLE_NAME_FORMAT): If flag_vtable_thunks, - use "VT" rather than "vt" due to binary incompatibility. - * class.c (get_vtable_name): Use strlen of VTABLE_NAME_FORMAT, - rather than sizeof, since it is now an expression. - * class.c (modify_one_vtable): Modify to skip initial element - containing a count of the vtable. - -Thu Apr 21 00:09:02 1994 Jason Merrill - - * lex.c (check_newline): Force interface_unknown on main input file. - - * pt.c (do_pending_expansions): Always emit functions that have been - explicitly instantiated. - (do_function_instantiation): Set DECL_EXPLICITLY_INSTANTIATED. - (do_type_instantiation): Set CLASSTYPE_VTABLE_NEEDS_WRITING and - DECL_EXPLICITLY_INSTANTIATED on all my methods. - * parse.y (explicit_instantiation): Call do_type_instantiation for - types. - * decl2.c (finish_vtable_vardecl): Call import_export_vtable. - * decl.c (start_function): Don't set DECL_EXTERNAL on a function - that has been explicitly instantiated. - * cp-tree.h (DECL_EXPLICITLY_INSTANTIATED): Alias for - DECL_LANG_FLAG_4. - * class.c: Move import_export_vtable to decl2.c, and comment out all - uses. - -Wed Apr 20 16:51:06 1994 Jason Merrill - - * lex.c (process_next_inline): Don't muck with DECL_INLINE. - (do_pending_inlines): Likewise. - -Tue Apr 19 22:25:41 1994 Mike Stump - - Reimplement vtable building, and most vtable pointer setting. - Allows for earier maintenance, easier understandability, and most - importantly, correct semantics. - - * class.c (build_vtable): Removed unneeded - SET_BINFO_VTABLE_PATH_MARKED. - * class.c (prepare_fresh_vtable): Likewise. Added argument. - * class.c (modify_vtable_entry): General cleanup. - * class.c (related_vslot, is_normal, modify_other_vtable_entries, - modify_vtable_entries): Removed. - * class.c (add_virtual_function): General cleanup. - * class.c (finish_base_struct): Setup BINFO_VTABLE and - BINFO_VIRTUALS as early as we can, so that modify_all_vtables can - work. - * class.c (finish_vtbls): New routine, mostly from - unmark_finished_struct. - * class.c (overrides): New routine. - * class.c (modify_one_vtable): New routine, mostly from - modify_other_vtable_entries and modify_vtable_entries. - * class.c (modify_all_direct_vtables, modify_all_indirect_vtables, - modify_all_vtables): New routines. - * class.c (finish_struct): Added arguemnt to prepare_fresh_vtable - call. General cleanup on how pending_hard_virtuals are handled. - General cleanup on modifying vtables. Use finish_vtbls, instead of - unmark_finished_struct. - * cp-tree.h (init_vtbl_ptrs, expand_direct_vtbls_init, - get_first_matching_virtual, get_matching_virtual, - expand_vbase_vtables_init, expand_indirect_vtbls_init): Update. - * cvt.c (convert_pointer_to_real): cleanup error message. - * decl.c (grokfndecl): General cleanup. - * decl.c (finish_function): Change init_vtbl_ptrs call to - expand_direct_vtbls_init. Change expand_vbase_vtables_init call to - expand_indirect_vtbls_init. - * init.c (expand_virtual_init): Remove unneeded argument. - * init.c (init_vtbl_ptrs): Rename to expand_direct_vtbls_init, added - two arguments to make more general. Made more general. Now can be - used for vtable pointer initialization from virtual bases. - * init.c (emit_base_init): Change expand_vbase_vtables_init call to - expand_indirect_vtbls_init. Change init_vtbl_ptrs call to - expand_direct_vtbls_init. - * init.c (expand_virtual_init): General cleanup. - * init.c (expand_default_init): Change expand_vbase_vtables_init - call to expand_indirect_vtbls_init. - * init.c (expand_recursive_init_1): Change expand_vbase_vtables_init - call to expand_indirect_vtbls_init. - * init.c (expand_recursive_init): Change expand_vbase_vtables_init - call to expand_indirect_vtbls_init. - * search.c (get_first_matching_virtual): Rename to - get_matching_virtual. General cleanup and remove setting of - DECL_CONTEXT. That is now done in a cleaner way in - modify_vtable_entry and add_virtual_function. - * search.c (expand_vbase_vtables_init): Rename to - expand_indirect_vtbls_init. General cleanup. Use - expand_direct_vtbls_init to do hard work. Ensures that _all_ vtable - pointers from virtual bases are set up. - * search.c (bfs_unmark_finished_struct, unmark_finished_struct): - Removed. - - * *.[chy]: Remove support for VTABLE_USES_MASK. - -Tue Apr 19 12:51:59 1994 Jason Merrill - - * cvt.c (convert_to_reference): Use NOP_EXPRs to switch between - reference and pointer types instead of bashing the types directly. - - * call.c (build_overload_call_real): Use the TREE_CODE to determine - whether the function is overloaded or not, rather than - TREE_OVERLOADED. - * *: Remove all uses of TREE_OVERLOADED. - - * decl.c (grokdeclarator): Only complain about initializing const - fields when -ansi or -pedantic. - -Tue Apr 19 12:42:42 1994 Doug Evans - - * cp-tree.h (THUNK_DELTA): frame_size is now a union. - -Mon Apr 18 00:17:13 1994 Jason Merrill - - Do overloading on a block-by-block basis, not function-by-function. - * decl.c: Lose overloads_to_forget. - (struct binding_level): Add overloads_shadowed field. - (poplevel): Restore overloads_shadowed. - (push_overloaded_decl): Use overloads_shadowed instead of - overloads_to_forget. - (finish_function): Don't look at overloads_to_forget. - - Copy enum_overflow logic from c-decl.c. - * decl.c (start_enum): Initialize enum_overflow. - (build_enumerator): Use enum_overflow. Also use current_scope(). - - * search.c (current_scope): Move Brendan's comment from - build_enumerator here. - - * typeck.c (convert_for_assignment): Change warnings to pedwarns for - discarding const/volatile. - -Sat Apr 16 01:18:21 1994 Jason Merrill - - * typeck.c (comp_target_parms): Accept TEMPLATE_TYPE_PARMs on the rhs. - (comp_target_types): Likewise. - - * decl.c (lookup_name): Don't unset got_scope here. - - * spew.c (yylex): Only replace yylval with the TYPE_NESTED_NAME if - got_scope != NULL_TREE. - -Fri Apr 15 16:36:33 1994 Jason Merrill - - Horrible kludge to prevent templates from being instantiated by - their base classes. - * parse.y (template_instantiate_once): Unset TYPE_BEING_DEFINED - before we get to left_curly. - * pt.c (instantiate_class_template): Set TYPE_BEING_DEFINED. - - * error.c (dump_decl): If it's a typedef, print out the name of the - decl, not just the underlying type. - - * decl.c (pushdecl): If the old duplicate decl was a TYPE_DECL, - update the IDENTIFIER_TYPE_VALUE of its name. - - * decl2.c (finish_file): When processing the initializer for a - static member, pretend that the dummy function is a member of the - same class. - -Fri Apr 15 15:56:35 1994 Kung Hsu - - * class.c (build_vtable_entry): revert Apr 4 change. - * decl2.c (mark_vtable_entries): replace pure virtual function - decl with abort's. - -Fri Apr 15 13:49:33 1994 Jason Merrill - - * typeck.c (build_conditional_expr): Pedwarn on pointer/integer - mismatch, and don't pedwarn on 0/function pointer mismatch. - - * typeck2.c (digest_init): Lose code for special handling of unions. - (process_init_constructor): Since they're handled just fine here. - Pedwarn on excess elements. - - * decl2.c (grokfield): Complain about local class method declaration - without definition. - -Fri Apr 15 13:19:40 1994 Per Bothner - - * method.c (emit_thunk): Add extern declaration for - current_call_is_indirect (needed for hppa). - -Thu Apr 14 16:12:31 1994 Jason Merrill - - Improve local class support; allow classes in different blocks to - have the same name. - * decl.c (pushtag): Support local classes better. - (pushdecl_nonclass_level): New function for pushing mangled decls of - nested types into the appropriate scope. - (xref_defn_tag): Use pushdecl_nonclass_level instead of - pushdecl_top_level. - (grokfndecl): Don't mess with IDENTIFIER_GLOBAL_VALUE for local - class methods. - * method.c (do_inline_function_hair): Likewise. - - * class.c (finish_struct): It is legal for a class with no - constructors to have nonstatic const and reference members. - -Thu Apr 14 07:15:11 1994 Brendan Kehoe - - * decl.c (push_overloaded_decl): Avoid giving errors about - built-ins, since duplicate_decls will have given warnings/errors - for them. - -Thu Apr 14 03:45:12 1994 Jason Merrill - - * cvt.c (convert_to_reference): Warn about casting pointer type to - reference type when this is probably not what they wanted. - -Wed Apr 13 13:12:35 1994 Per Bothner - - * decl.c (finish_decl): Don't mindlessly set TREE_USED for - static consts any more (toplev.c has now been modified to - not emit warnings if they are unused). - -Wed Apr 13 00:22:35 1994 Jason Merrill - - * decl.c (grok_op_properties): If op new/delete get here with - METHOD_TYPEs, do a revert_static_member_fn. - - * cp-tree.h (IDENTIFIER_CLASS_TYPE_VALUE): Lose. - * init.c (is_aggr_typedef): Don't look at - IDENTIFIER_CLASS_TYPE_VALUE. - (get_aggr_from_typedef): Likewise. - (get_type_value): Likewise. - * call.c (build_scoped_method_call): Don't rely on overloaded - template names having IDENTIFIER_CLASS_VALUE set. - - * parse.y (component_decl_1, fn.def2): Revert rules for - constructors. - (component_decl_1, fn.def2): Use $1 instead of $$, since $$ is being - clobbered. - - * decl.c (start_function): Only warn about `void main()' if pedantic - || warn_return_type. - -Tue Apr 12 02:14:17 1994 Jason Merrill - - Clean up overloading of the template name. - * class.c (pushclass): overload the template name whenever pushing - into the scope of a template class, not just if it is - uninstantiated. - (popclass): Correspondingly. - * search.c (push_class_decls): Don't overload_template_name. - * pt.c (overload_template_name): Don't set IDENTIFIER_LOCAL_VALUE or - DECL_CONTEXT on things. - * parse.y (left_curly): Don't overload_template_name. - * class.c (finish_struct): Don't undo_template_name_overload. - - * method.c (build_opfncall): Only pass one argument to global op - delete. - - * call.c (build_method_call): Use TYPE_VEC_DELETE_TAKES_SIZE to - decide how many arguments to use for vec delete. - - * decl.c (grok_op_properties): Be consistent in modifying - current_class_type. - (grokdeclarator): Only complain about function decls with no return - type if we're being pedantic. - -Mon Apr 11 00:10:53 1994 Jason Merrill - - Add support for operator new [] and operator delete []. - - * tree.def: Add VEC_NEW_EXPR and VEC_DELETE_EXPR. - * ptree.c (print_lang_type): Indicate vec new/delete. - * parse.y: Support vec new/delete. - * method.c (build_decl_overload): Deal with vec new/delete. - (build_opfncall): Likewise. - * lex.c (init_lex): Set up values of ansi_opname and opname_tab for - vec new/delete. vec new uses "__vn", and vec delete uses "__vd". - * init.c (init_init_processing): Set up BIVN and BIVD. - (do_friend): Don't clean up after mistaken setting of TREE_GETS_NEW, - since it doesn't happen any more. - (build_new): Support vec new. Always call something. - (build_x_delete): Support vec delete. - (build_vec_delete): Lose dtor_dummy argument, add use_global_delete, - and pass it to build_x_delete. - * decl2.c (delete_sanity): Don't change behavior by whether or not - the type has a destructor. Pass use_global_delete to - build_vec_delete. - (coerce_delete_type): Make sure that the type returned has a first - argument of ptr_type_node. - * decl.c (init_decl_processing): Also declare the global vec - new/delete. - (grokdeclarator): Also force vec new/delete to be static. - (grok_op_properties): Note presence of vec new/delete, and play with - their args. If vec delete takes the optional size_t argument, set - TYPE_VEC_DELETE_TAKES_SIZE. - * cp-tree.h (TYPE_GETS_{REG,VEC}_DELETE): New macros to simplify - checking for one delete or the other. - (lang_type): gets_new and gets_delete are now two bits long. The - low bit is for the non-array version. Lose gets_placed_new. - (TYPE_VEC_DELETE_TAKES_SIZE): New macro indicating that the vec - delete defined by this class wants to know how much space it is - deleting. - (TYPE_VEC_NEW_USES_COOKIE): New macro to indicate when vec new must - add a header containing the number of elements in the vector; i.e. - when the elements need to be destroyed or vec delete wants to know - the size. - * class.c (finish_struct_methods): Also check for overloading vec - delete. - * call.c (build_method_call): Also delete second argument for vec - delete. - - * decl.c (grokdeclarator): Correct complaints again. - (grokdeclarator): Fix segfault on null declarator. - (decls_match): Also accept redeclaration with no arguments if both - declarations were in C context. Bash TREE_TYPE (newdecl) here. - (duplicate_decls): Instead of here. - - * parse.y (nested_name_specifier_1): Lose rules for dealing with - syntax errors nicely, since they break parsing of 'const i;'. - - * decl.c (lookup_name): if (got_scope == current_class_type) - val = IDENTIFIER_CLASS_VALUE (name). - - * search.c (lookup_nested_tag): Look in enclosing classes, too. - - * spew.c (yylex): Only look one character ahead when checking for a - SCOPE. - - * lex.c (check_newline): Read first nonwhite char before - incrementing lineno. - - * decl.c (grokdeclarator): Don't claim that typedefs are variables - in warning. - - * parse.y: Divide up uses of unqualified_id into - notype_unqualified_id and unqualified_id, so that TYPENAME can be - used as an identifier after an object. - - * class.c (push_nested_class): Don't push into non-class scope. - - * decl.c (grokdeclarator): If an identifier could be a type - conversion operator, but has no associated type, it's not a type - conversion operator. - - * pt.c (unify): Check for equality of constants better. - - * decl.c (grokdeclarator): Don't complain about access decls. - -Sun Apr 10 02:39:55 1994 Jason Merrill - - * decl.c (grokdeclarator): pedwarn about data definitions without - types here. - - * parse.y (datadef): Don't pedwarn about decls without types here, - since that is valid for functions. - (fn.def2, component_decl): Support constructors with declmods again. - (nomods_initdecls): For decls without any mods, so that we don't try - to get declspecs from some arbitrary $0. - - * search.c (lookup_field): Use cp_error. - - * parse.y (nested_name_specifier_1): Don't check aggr/non-aggr type - here; it breaks destructors for non-aggr types. - - * decl.c (lookup_name): Only look for TYPE_DECLs in base classes of - a type being defined, like the comment says. - If got_scope is not an aggregate, just return NULL_TREE. - - * pt.c (create_nested_upt): Kung's code for creating types nested - within uninstantiated templates now lives here (it used to live in - hack_more_ids). It needs to be expanded. - - * parse.y: Stop calling see_typename so much. - - * decl.c (lookup_name): Deal with TTPs and UPTs. - - * lex.c (real_yylex): Don't set looking_for_typename just because we - saw a 'new'. - (dont_see_typename): #if 0 out. - - * spew.c (yylex): Increment looking_for_typename if the next - character is SCOPE, rather than setting it to 1; this way, the value - from seeing an aggr specifier will not be lost. This kinda relies - on looking_for_typename never being < 0, which is now true. - - * parse.y (nested_name_specifier_1): Accept TEMPLATE_TYPE_PARMs, - too. - (named_class_head_sans_basetype): Accept template types, too. Oops. - -Fri Apr 8 16:39:35 1994 Jason Merrill - - * decl2.c (reparse_decl_as_expr1): Handle SCOPE_REFs. - - * parse.y: Lose START_DECLARATOR. - - * search.c (lookup_nested_tag): New function to scan CLASSTYPE_TAGS - for a class. - - * parse.y: Simplify fn.def2 and component_decl. Support 'enum - A::foo' syntax. Catch invalid scopes better. - - * parse.y, lex.c: lose TYPENAME_COLON. - - * decl2.c (groktypefield): #if 0 out. - - * decl.c (lookup_name): If the type denoted by got_scope is - currently being defined, look in CLASSTYPE_TAGS rather than FIELDS. - - * class.c (push_nested_class): Don't try to push into - error_mark_node. - -Fri Apr 8 07:26:36 1994 Brendan Kehoe - - * Makefile.in (stamp-parse): Update count of conflicts to 33. - -Thu Apr 7 17:47:53 1994 Jason Merrill - - A saner implementation of nested types that treats template types - no differently from non-template types. There are still some - shortcomings of our system; most notably, it is difficult to look - for a nested type that is hidden by another name, because of the way - we keep track of hidden types. But this shouldn't be a problem for - just about anyone. Perhaps lookup_field should be fixed up a bit. - - * spew.c: Moved handling of nested types/scoping from the lexer - into the parser. Removed variable template_type_seen_before_scope. - Removed functions frob_identifier, hack_more_ids, and various cruft - that was #if 0'd out in the past, reducing the size of the file from - 1146 lines to 450 lines. We can't quite do away with spew.c yet, - though; we still need it for do_aggr () and checking for SCOPE after - the current identifier. And setting lastiddecl. - - * parse.y: Moved handling of nested types/scoping from the lexer - into the parser, using a new global variable `got_scope'. Reduced - the number of states by 53. Implemented all uses of explicit global - scope. Removed terminals SCOPED_TYPENAME and SCOPED_NAME. Removed - nonterminals tmpl.1, scoped_base_class, id_scope, typename_scope, - scoped_typename. Added nonterminals nested_type, - qualified_type_name, complete_type_name, qualified_id, ptr_to_mem, - nested_name_specifier, global_scope, overqualified_id, type_name. - Changed many others. Added 9 new reduce/reduce conflicts, which are - nested type parallels of 9 that were already in the grammar for - non-nested types. Eight of the now 33 conflicts should be removed - in the process of resolving the late binding between variable and - function decls. - - * gxxint.texi (Parser): Update. - - * cp-tree.h (IS_AGGR_TYPE_CODE): Add UNINSTANTIATED_P_TYPE. - - * lex.h: Add decl for got_scope. - - * lex.c (see_typename): Claim to be the lexer when calling - lookup_name. - - * decl.c (lookup_name): When called from the lexer, look at - got_scope and looking_at_typename; otherwise don't. - -Thu Apr 7 22:05:47 1994 Mike Stump - - 31th Cygnus<->FSF merge. - -Thu Apr 7 17:47:53 1994 Jason Merrill - - * decl2.c (mark_vtable_entries): Call this to mark all the - entries in the vtable addressable. - (finish_decl_parsing): Handle SCOPE_REFs. - - * decl.c (decls_match): Always call compparms with strict == 1. - Handle the special case of C function redecl here. - (duplicate_decls): Only keep the old type if the new decl takes no - arguments. - - * typeck.c (compparms): Also allow t1 to be ... if strict == 0. - -Thu Apr 7 16:17:50 1994 Mike Stump - - * class.c (build_vtable_entry): Fix breakage introduced Apr 5 - 17:48:41. - -Wed Apr 6 16:05:10 1994 Per Bothner - - * init.c (build_virtual_init), search.c (build_vbase_vtables_init), - ch-tree.h: Every place these functions were called, the result was - immediately passed to expand_expr_stmt. Reduce redundancy by - calling expand_expr_init *inside* these functions. These - makes for a simpler interface, and we don't have to build - compound expressions. Hence, rename these function to: - expand_virtual_init and expand_vbase_vtables_init respectively. - * init.c, decl.c: Change callers of these functions. - * init.c, cp-tree.h (expand_virtual_init): Make static. - - * decl2.c (finish_file): Check TREE_PUBLIC||TREE_ADDRESSABLE - rather than DECL_SAVED_INSNS before emitting inlines. - -Wed Apr 6 13:06:39 1994 Jason Merrill - - * spew.c (init_spew): #if 0 out stuff used by arbitrate_lookup. - - * decl.c (duplicate_decls): If this is a new declaration of an - extern "C" function, keep the type (for the argtypes). - (redeclaration_error_message): Don't check DECL_LANGUAGE here. - (decls_match): Call compparms with a value of strict dependent on - the value of strict_prototypes for DECL_LANGUAGE (oldecl). - - * typeck.c (compparms): ... is only equivalent to non-promoting - parms if we're not being strict. - - * parse.y (empty_parms): Don't check flag_ansi || pedantic here. - - * decl.c (init_decl_processing): if (flag_ansi || pedantic) - strict_prototypes_lang_c = strict_prototypes_lang_cplusplus; - - * decl2.c (grok_function_init): Don't set DECL_INITIAL on pure - virtuals. - -Tue Apr 5 17:48:41 1994 Per Bothner - - Support for implementing vtables with thunks. - * tree.def (THUNK_DECL): New TREE_CODE. - * cp-tree.h (FNADDR_FROM_VTABLE_ENTRY), tree.c - (fnaddr_from_vtable_entry): Handle flag_vtable_thunks case. - * cp-tree.h (memptr_type): New variable. - * class.c (build_vtable_entry): Build thunk if necessary. - * class.c (build_vfn_ref): If using thunks, don't need - to add delta field from vtable (there is none!). - * decl.c: Add memptr_type as well as vtable_entry_type. - If using thunks, the latter is just ptr_type_node. - * gc.c, typeck.c: Use memptr_typeChange, not vtable_entry_type. - * decl2.c (finish_vtable_vardecl): Handle thunks. - * expr.c (cplus_expand_expr): Support THUNK_DECL. - - * decl.c (grokdeclarator): Set DECL_THIS_EXTERN if "extern". - * decl.c (start_function): Set current_extern_inline based on - DECL_THIS_EXTERN, not TREE_PUBLIC. - * decl.c (finish_function): Call mark_inline_for_output if needed, - - Improve intelligence about when to emit inlines. - * cp-tree.h (lang_decl_flags): New field saved_inline. - * cp-tree.h (DECL_SAVED_INLINE): New macro. - * class.c (add_virtual_function): Don't set TREE_ADDRESSABLE. - * decl.h, decl.c (pending_addressable_inlines): Removed. - * decl2.c (pending_addressable_inlines): Renamed to saved_inlines. - * decl2.c (mark_inline_for_output): Do nothing if - DECL_SAVED_INLINE; otherwise set it (and add to saved_inlines list). - * decl2.c (finish_vtable_vardecl): SET_CLASSTYPE_INTERFACE_KNOWN - and set CLASSTYPE_INTERFACE_ONLY if there is a non-inline virtual. - * decl2.c (finish_file): Writing out inlines later, so we can - also handle the ones needed for vtbales. - * decl2.c (write_vtable_entries, finish_vtable_typedecl): Removed. - - * cp-tree.h, class.c, decl2.c, search.c: Remove -fvtable-hack - and flag_vtable_hack. Use -fvtable-thunks and flag_vtable_thunks - instead. (The rationale is that these optimizations both break binary - compatibility, but should become the default in a future release.) - -Wed Apr 6 10:53:56 1994 Mike Stump - - * class.c (modify_vtable_entries): Never reset the DECL_CONTEXT - of a fndecl, as we might not be from that vfield. - -Tue Apr 5 17:43:35 1994 Kung Hsu - - * class.c (add_virtual_function): fix bug for pure virtual, so - that DECL_VINDEX of the dummy decl copied won't be error. - (see also Apr 4 change) - -Tue Apr 5 17:23:45 1994 Per Bothner - - * typeck.c (c_expand_return): Before checking that we're not - returning the address of a local, make sure it's a VAR_DECL. - (And don't worry about it being a TREE_LIST.) - -Tue Apr 5 13:26:42 1994 Jason Merrill - - * parse.y (YYDEBUG): Always define. - * lex.c (YYDEBUG): Likewise. - -Mon Apr 4 11:28:17 1994 Kung Hsu - - * class.c (finish_struct): backup out the change below, put the - new change for the same purpose. The change below breaks code. - - * class.c (finish_struct): if pure virtual, copy node and make - RTL point to abort, then put in virtual table. - * decl2.c (grok_function_iit): reinstate Mar 31 change. - -Sat Apr 2 03:12:58 1994 Jason Merrill - - * init.c (build_new): pedwarn about newing const and volatile - types. - - * tree.c (get_identifier_list): Only do the special handling - thing if we're dealing with the main variant of the record type. - - * cvt.c (convert_to_reference): When converting between - compatible reference types, use the pointer conversion machinery. - Don't just blindly overwrite the old type. - -Fri Apr 1 17:14:42 1994 Jason Merrill - - * call.c (build_method_call): When looking at global functions, - be sure to use instance_ptr for the first argument, not some version - of it that has been cast to a base class. Also do this before - comparing candidates. - -Thu Mar 31 19:50:35 1994 Jason Merrill - - * call.c (build_method_call): Constructors can be called for - const objects. - -Thu Mar 31 16:20:16 1994 Kung Hsu - - * decl2.c (grok_func_init): do not abort as rtl for pur virtual - fucntions. They can be defined somewhere else. - -Sat Jan 23 23:23:26 1994 Stephen R. van den Berg (berg@pool.informatik.rwth-aachen.de) - - * decl.c (init_decl_processing): Declare __builtin_return_address - and __builtin_frame_address for C++ as well. - -Thu Mar 31 12:35:49 1994 Mike Stump - - * typeck2.c (store_init_value): Integral constant variables are - always constant, even when doing -fpic. - -Sat Jan 23 23:23:26 1994 Stephen R. van den Berg (berg@pool.informatik.rwth-aachen.de) - - * decl.c (redeclaration_error_message): Pass the types to - comptypes. - -Wed Mar 30 21:29:25 1994 Mike Stump - - Cures incorrect errors about pure virtuals in a class, when they - have been overridden in a derived class. - - * search.c (get_abstract_virtuals): Reimplement. - * search.c (get_abstract_virtuals_1): New routine. - -Wed Mar 30 14:10:04 1994 Jason Merrill - - * pt.c (push_template_decls): Make the pushed level pseudo - global. - - * parse.y (extdefs): Don't pop everything if the current binding - level is pseudo_global. - - * decl.c (pop_everything): Stop on reaching a pseudo-global - binding level. - - * cp-tree.h (DECL_FUNCTION_MEMBER_P): Change to more reliable test. - - * decl.c (duplicate_decls): Only copy DECL_SOURCE_{FILE_LINE} if - the old decl actually had an initializer. - - * {various}: Clean up gcc -W complaints. - - * cp-tree.h (DECL_FUNCTION_MEMBER_P): Currently defined to be - (DECL_CONTEXT (NODE) != NULL_TREE). - - * parse.y (lang_extdef): Call pop_everything if necessary. - - * decl.c (pop_everything): New function for popping binding - levels left over after a syntax error. - (pushdecl): Use DECL_FUNCTION_MEMBER_P to decide whether or not - a function is a member. - -Wed Mar 30 14:20:50 1994 Mike Stump - - Cures calling a more base base class function, when a more derived - base class member should be called in some MI situations. - - * search.c (make_binfo): Use more the more specialized base - binfos from the binfo given as the second argument to make_binfo, - instead of the unspecialized ones from the TYPE_BINFO. - * class.c (finish_base_struct): Likewise, update callers. - * search.c (dfs_get_vbase_types): Likewise. - * tree.c (propagate_binfo_offsets, layout_vbasetypes): Likewise. - * decl.c (xref_tag): Use NULL_TREE instead of 0. - * lex.c (make_lang_type): Likewise. - -Wed Mar 30 14:10:04 1994 Jason Merrill - - * decl.c (pushdecl): If pushing a C-linkage function, only do a - push_overloaded_decl. - (duplicate_decls): Standard overloading does not shadow built-ins. - -Tue Mar 29 00:54:18 1994 Jason Merrill - - * pt.c (end_template_decl): Don't call push_overloaded_decl. - - * init.c (do_friend): Don't call push_overloaded_decl. - - * decl.c (pushdecl): Call push_overloaded_decl for functions and - function templates. - (duplicate_decls): functions and function templates are not - duplicates, but don't complain about calling this function to - compare them. - (push_overloaded_decl): Don't deal with linkage. Call - duplicate_decls. - (redeclaration_error_message): Deal with linkage. - - * decl.c (start_function): If push_overloaded_decl returns an - older version of the function, deal with it. - - * decl.c (start_function): Be sure only to push_overloaded_decl - for non-members. - - * decl.c (grokfndecl): Put back clearing of DECL_CHAIN for - methods. - (start_function): Lose broken and redundant code for checking old - decl. - - * init.c (add_friend): Give line numbers of both friend decls - when warning about re-friending. - - * pt.c (tsubst): Use comptypes rather than == to compare the - types of the method as declared and as defined, since default - parameters may be different. - - * call.c (build_method_call): Use brendan's candidate printing - routine. - - * decl.c (start_method): Methods defined in the class body are - inline whether or not it's a template class. - -Mon Mar 28 16:39:26 1994 Jason Merrill - - * parse.y (initdcl0): Add "extern" to current_declspecs if - have_extern_spec && ! used_extern_spcec. - - * tree.c (really_overloaded_fn): A fn with more than one - overload. - - * pt.c (end_template_decl): Use really_overloaded_fn. - - * decl.c (duplicate_decls): When smashing a decl into a previous - definition, keep the old file and line. - Don't deal with overloaded functions. - Lose old code for checking arg types of functions. - Check for overloaded C functions. - (pushdecl): Deal with overloaded functions. - (start_decl): Expect pushdecl to return an appropriate function decl. - (start_function): Likewise. - (push_overloaded_decl): Don't check for overloaded C functions. - - * *.c: Stop using DECL_OVERLOADED, it being archaic. - TREE_OVERLOADED should probably go, too. - -Mon Mar 28 14:00:45 1994 Ron Guilmette - - * typeck.c (comp_target_types): Call comp_target_parms with - strict == 1. - -Sun Mar 27 00:07:45 1994 Jason Merrill - - * parse.y (empty_parms): Don't parse () as (...) in extern "C" - sections if we're compiling with -ansi or -pedantic. - - * decl.c (decls_match): Don't treat (int) and (int&) as matching. - - * decl2.c (grokfield): Don't pedwarn twice about initializing - field. - - * decl.c (push_overloaded_decl): Warn about shadowing - constructor. - (redeclaration_error_message): Don't allow 'int a; int a;' - - * cvt.c (build_up_reference): Only check for valid upcast if - LOOKUP_PROTECT is set, not just any flag. - -Fri Mar 25 01:22:31 1994 Jason Merrill - - * lex.c (check_newline): When we see a #pragma implementation, - also set it for the main input file. - - * init.c (build_new): Convert array size argument to size_t. - - * parse.y (primary): If we're doing a parenthesized type-id, call - groktypename before passing it to build_new. - - * call.c (build_method_call): Deal properly with const and - volatile for instances of reference type. - - * decl.c (store_return_init): Change 'if (pedantic) error' to 'if - (pedantic) pedwarn'. - - * decl.c (grokdeclarator): Don't complain about putting `static' - and `inline' on template function decls. - -Thu Mar 24 23:18:19 1994 Jason Merrill - - * call.c (build_method_call): Preserve const & volatile on - `this'. - -Thu Mar 24 16:21:52 1994 Mike Stump - - * init.c (build_new, build_vec_delete): Use global new and delete - for arrays. - * decl2.c (delete_sanity): Likewise. - -Thu Mar 24 02:10:46 1994 Jason Merrill - - * cvt.c (convert_to_reference): If i is an lvalue, - (int &)i -> *(int*)&i, as per 5.2.8p9 of the latest WP. - (convert_force): Call convert_to_reference with LOOKUP_COMPLAIN. - -Wed Mar 23 17:45:37 1994 Jason Merrill - - * decl.c (duplicate_decls): Also propagate DECL_TEMPLATE_MEMBERS - and DECL_TEMPLATE_INSTANTIATIONS. - - * init.c (build_new): Handle array typedefs properly. - -Wed Mar 23 18:23:33 1994 Mike Stump - - 30th Cygnus<->FSF merge. - -Wed Mar 23 00:46:24 1994 Mike Stump - - * class.c (modify_vtable_entries): Avoid running off the end of the - virtuals list when processing a virtual destructor. - * class.c (get_vtable_entry): Likewise. - -Wed Mar 23 00:23:59 1994 Jason Merrill - - * decl.c (duplicate_decls): If two template decls don't match, - just return 0. - -Tue Mar 22 23:49:41 1994 Jason Merrill - - * typeck.c (convert_for_assignment): Don't pedwarn about - converting function pointer to void *. - -Tue Mar 22 22:23:19 1994 Mike Stump - - Major revamp of pointer to member functions. Cures major - nonfunctionality when used in casts, and MI situations. - - * cvt.c (convert_force): Update call site of build_ptrmemfunc. - * typeck.c (convert_for_assignment): Likewise. - * typeck2.c (digest_init): Likewise. - * typeck2.c (process_init_constructor): Simplify by moving code into - digest_init. - * typeck2.c (digest_init): Do default_conversions on init value, if - we are processing pointer to member functions. - * class.c (get_vfield_offset): Now non-static. Convert bit offset - into byte offset. - * cp-tree.h (get_vfield_offset): Likewise. - * typeck.c (get_member_function_from_ptrfunc): Convert down to right - instance, before fetching vtable pointer. - * typeck.c (get_delta_difference): New routine. - * typeck.c (build_ptrmemfunc): Revamp to handle casting better, also - get vtable pointer out of right subobject. - -Tue Mar 22 17:56:48 1994 Mike Stump - - * search.c (get_binfo): Return NULL instead of aborting, when - passed a UNION_TYPE. - -Tue Mar 22 12:44:54 1994 Jason Merrill - - These patches implement handling of redefinition/redeclaration of - templates. - - * typeck.c (comptypes): Simplify. All TEMPLATE_TYPE_PARMs are - considered compatible. - - * parse.y (template_def): Pass defn argument to end_template_decl. - - * pt.c (end_template_decl): Add defn argument. Check for - redefinition. Simplify. - - * error.c (OB_UNPUT): New macro, to remove mistakes. - (aggr_variety): Subroutine of dump_aggr_type. - - * decl.c (decls_match): Support templates. - (duplicate_decls): No longer static. Don't try to lay out template - decls. - (pushdecl): Simplify. - - * cp-tree.h (DECL_TEMPLATE_MEMBERS): Use DECL_SIZE instead of - DECL_INITIAL. - -Mon Mar 21 11:46:55 1994 Jason Merrill - - * error.c (dump_decl): Support class template decls. - (dump_type): Don't adorn template type parms. - - * decl.c (duplicate_decls): Save DECL_TEMPLATE_INFO from old decl - if it was a definition. - (redeclaration_error_message): Do the cp_error thang, and reject - redefinition of templates. - -Mon Mar 21 19:36:06 1994 Per Bothner - - * decl.c (grokdeclarator): Set TREE_PUBLIC for METHOD_TYPE - in FIELD context, when appropriate. Also, - CLASSTYPE_INTERFACE_ONLY is irrelevant to setting TREE_PUBLIC. - Also, simplify check for bogus return specifiers. - -Mon Mar 21 11:46:55 1994 Jason Merrill - - * parse.y (after_type_declarator1): Expand type_quals. - (notype_declarator1): Likewise. - (absdcl1): Likewise. - -Sat Mar 19 01:05:17 1994 Jason Merrill - - * decl.c (grokdeclarator): Treat class-local typedefs like static - members; i.e. 'typedef int f();' means that f is a function type, - not a method type. - - * parse.y (decl): Change direct_* back to *. - (type_id): Change direct_abstract_declarator to absdcl. - (direct_declarator, direct_initdecls, direct_initdcl0): Remove again. - -Fri Mar 18 12:47:59 1994 Jason Merrill - - These two patches fix crashes on instantiating a template inside a - function with C linkage or containing labels. - - * class.c (current_lang_stacksize): No longer static. - - * decl.c (struct saved_scope): Add lang_base, lang_stack, - lang_name, lang_stacksize, and named_labels. - (push_to_top_level): Save them. - (pop_from_top_level): Restore them. - - * gxxint.texi (Parser): Update. - - These two patches finish moving the task of expr/declarator - ambiguity resolution from the lexer to the parser, and add one more - r/r conflict. START_DECLARATOR can now be nuked. - - * parse.y (decl): Add "direct_" in typespec X rules. - (direct_declarator): New nonterminal for - direct_after_type_declarator and direct_notype_declarator. - (direct_initdecls): Like initdecls, but uses direct_initdcl0. - (direct_initdcl0): Like initdcl0, but uses direct_declarator. - (named_parm): Add typespec direct_declarator rule. - - * spew.c (yylex): #if 0 out START_DECLARATOR insertion. - - These two patches disable some excessive cleverness on the part of - g++; a non-class declaration always hides a class declaration in the - same scope, and g++ was trying to unhide it depending on the - enclosing expression. - - * spew.c (arbitrate_lookup): #if 0 out. - - * decl.c (lookup_name): Never call arbitrate_lookup. - - * parse.y (complex_notype_declarator1): Add '*' - complex_notype_declarator1 and '&' complex_notype_declarator1 rules. - - * parse.y (complex_direct_notype_declarator): Restore id_scope - see_typename TYPENAME rule, remove all other rules beginning with - those tokens. - (notype_unqualified_id): Add '~' see_typename IDENTIFIER rule. - -Thu Mar 17 17:30:01 1994 Jason Merrill - - These changes fix the compiler's handling of the functional cast/ - object declaration ambiguities in section 6.8 of the ARM. They also - add 11 reduce/reduce conflicts. Sigh. - - * parse.y: Add precedence decls for OPERATOR and '~'. - (notype_unqualified_id): New nonterminal, encompasses all of the - ANSI unqualified-id nonterminal except TYPENAMEs. - (expr_or_declarator): New nonterminal to delay parsing of code like - `int (*a)'. - (primary): Use notype_unqualified_id. - (decl): Add typespec initdecls ';' and typespec declarator ';' - rules. - (initdcl0): Deal with the above. - (complex_notype_declarator1): A notype_declarator that is not also - an expr_or_declarator. - (complex_direct_notype_declarator): A direct_notype_declarator that - doesn't conflict with expr_or_declarator. Use - notype_unqualified_id. Remove id_scope see_typename TYPENAME rule. - (functional_cast): New nonterminal, for the three functional cast - rules. So that they can be moved after - complex_direct_notype_declarator. - (see_typename): Don't accept type_quals any more. - - * decl2.c (reparse_decl_as_expr): New function to deal with parse - nodes for code like `int (*a)++;'. - (reparse_decl_as_expr1): Recursive subroutine of the above. - (finish_decl_parsing): New function to deal with parse nodes for - code like `int (*a);'. See the difference? - -Thu Mar 17 12:16:10 1994 Mike Stump - - These changes break binary compatibility in code with classes - that use virtual bases. - - * search.c (dfs_get_vbase_types): Simplify and correct to make - sure virtual bases are initialized in dfs ordering. - * search.c (get_vbase_types): Simplify and make readable. - -Thu Mar 17 12:01:10 1994 Jason Merrill - - * parse.y: s/ typename / type_id /g - -Wed Mar 16 17:42:52 1994 Kung Hsu - - * parse.y (typespec): add SCOPE TYPENAME for global scoped - type. e.g. ::B x. - - * decl.c (complete_array_type): fix a bug that in -pendantic - mode even there's no initializer, it will continue to build - default index. - -Wed Mar 16 17:43:07 1994 Jason Merrill - - * parse.y (direct_notype_declarator): Add PTYPENAME rule, remove - all of the scoped PTYPENAME rules. - -Wed Mar 16 16:39:02 1994 Mike Stump - - * init.c (build_offset_ref): The value of A::typedef_name is - always the TYPE_DECL, and never an error. - -Tue Mar 15 20:02:35 1994 Jason Merrill - - * search.c (get_base_distance_recursive): Two binfos can only - represent the same object if they are both via_virtual. - - * class.c (finish_base_struct): Check vbases for ambiguity, too. - - * search.c (get_vbase_types): Accept binfo argument, too. - -Tue Mar 15 19:22:05 1994 Kung Hsu - - * decl.c (complete_array_type): complete TYPE_DOMAIN of the - initializer also, because back-end requires it. - -Tue Mar 15 15:33:31 1994 Jason Merrill - - * error.c (dump_expr): Support member functions (which show up as - OFFSET_REFs). - -Mon Mar 14 16:24:36 1994 Mike Stump - - * init.c (build_new): Set the return type of multidimensional - news correctly. - -Fri Mar 11 15:35:39 1994 Kung Hsu - - * call.c (build_method_call): if basetype not equal to type - of the instance, use the type of the instance in building - destructor. - -Thu Mar 10 17:07:10 1994 Kung Hsu - - * parse.y (direct_notype_declarator): add push_nested_type for - 'template_type SCOPED_NAME' rule. - -Tue Mar 8 00:19:58 1994 Jason Merrill - - * parse.y (parm): Add typed_declspec1 {absdcl, epsilon} rules. - -Sat Mar 5 04:47:48 1994 Jason Merrill - - * parse.y (regcast_or_absdcl): New nonterminal to implement late - reduction of constructs like `int ((int)(int)(int))'. - (cast_expr): Use it. - (sub_cast_expr): Everything that can come after a cast. - (typed_declspecs1): typed_declspecs that are not typed_typespecs. - (direct_after_type_declarator): Lose PAREN_STAR_PAREN rule. - (direct_abstract_declarator): Replace '(' parmlist ')' rule with - '(' complex_parmlist ')' and regcast_or_absdcl. - (parmlist): Split - (complex_parmlist): Parmlists that are not also typenames. - (parms_comma): Enabler. - (named_parm): A parm that is not also a typename. Use declarator - rather than dont_see_typename abs_or_notype_decl. Expand - typed_declspecs inline. - (abs_or_notype_decl): Lose. - (dont_see_typename): Comment out. - (bad_parm): Break out abs_or_notype_decl into two rules. - -Fri Mar 4 18:22:39 1994 Jason Merrill - - * decl2.c (reparse_decl_as_casts): New function to change parse - nodes for `(int)(int)(int)' from "function taking int and returning - function taking int and returning function taking int" to "... cast - to int, cast to int, cast to int". - - * decl2.c (reparse_decl_as_expr): Recursive function to change - parse nodes for `A()()' from "function returning function returning - A" to "A().operator()". - - * parse.y (primary): Replace `typespec LEFT_RIGHT' rule with - `typespec fcast_or_absdcl' rule. - (fcast_or_absdcl): New nonterminal to implement late reduction of - constructs like `A()()()()'. - (typename): Replace `typespec absdcl1' rule with - `typespec direct_abstract_declarator' rule. - (direct_abstract_declarator): Replace `LEFT_RIGHT type_quals' rule - with `fcast_or_absdcl type_quals' rule. - -Fri Mar 4 16:18:03 1994 Mike Stump - - * tree.c (lvalue_p): Improve OFFSET_REF handling, so that it - matches Section 5.5. - -Fri Mar 4 14:01:59 1994 Jason Merrill - - * error.c (dump_type_prefix): Don't print basetype twice for - pmfs. - -Fri Mar 4 13:24:33 1994 Mike Stump - - * typeck.c (convert_arguments): Handle setHandler(A::handlerFn) - so that it is like setHandler(&A::handlerFn). Cures an `invalid - lvalue in unary `&''. - -Fri Mar 4 11:15:59 1994 Jason Merrill - - * gxxint.texi (Copying Objects): New section discussing default - op= problems with virtual inheritance. - - * decl2.c (grokoptypename): Just does grokdeclarator and - build_typename_overload, since the parser can't call grokdeclarator - directly. - - * method.c (build_typename_overload): Set IDENTIFIER_GLOBAL_VALUE - and TREE_TYPE on generated identifiers. - - * decl.c (grokdeclarator): Don't deal with TYPE_EXPRs anymore. - - * parse.y (parm): Convert `const char *' to `__opPCc' here. - - * error.c (dump_decl): Say sorry rather than my_friendly_aborting - if we can't figure out what to do. - (dump_type*): Likewise. - - * typeck2.c (build_m_component_ref): 'component' is an expr, not - a decl. Also move the IS_AGGR_TYPE check after the stripping of - REFERENCE_TYPE. - -Fri Mar 4 04:46:05 1994 Mike Stump - - * call.c (build_method_call): Handle b->setHandler(A::handlerFn) - so that it is like b->setHandler(&A::handlerFn). Cures an `invalid - lvalue in unary `&''. - -Thu Mar 3 12:38:15 1994 Jason Merrill - - * parse.y: Add precedence specification for START_DECLARATOR. - (type_quals): Move before primary. - (typename): Move before typed_declspecs, add 'typespec absdcl1' rule. - - * decl2.c (grokoptypename): Lose. - - * decl.c (grokdeclarator): Parse TYPE_EXPRs in the initial scan, - rather than waiting until later. - -Wed Mar 2 14:12:23 1994 Jason Merrill - - * parse.y (unary_expr): Use 'typename' in 'new' rules, rather - than expanding it inline. - (typename): Expand empty option of (former) absdcl inline. - (abs_or_notype_decl): Likewise. - (absdcl): Lose empty rule. - (conversion_declarator): New nonterminal for 'typename' of 'operator - typename'. - (operator_name): Use it instead of absdcl. - - * parse.y: Add precedence declarations for SCOPED_TYPENAME, - TYPEOF, and SIGOF. - (typed_declspecs): Accept typed_typespecs, rather than typespec - directly. Add rules with reserved_typespecquals. - (reserved_declspecs): Don't accept typespecqual_reserved at the - beginning of the list. The typed_declspecs rule will deal with this - omission. - (declmods): Accept nonempty_type_quals, rather than TYPE_QUAL - directly. - - * parse.y (direct_notype_declarator, - direct_after_type_declarator, direct_abstract_declarator): Split up - the declarator1 nonterminals to match the draft standard and avoid - ambiguities. - (new_type_id, new_declarator, direct_new_declarator, - new_member_declarator): New nonterminals to implement the subset of - 'typename' allowed in new expressions. - (unary_expr): Use new_type_id instead of typename. - (after_type_declarator1, absdcl1): Fix semantics of member pointers. - (abs_member_declarator, after_type_member_declarator): Lose. - - * parse.y (absdcl1): Don't require parens around - abs_member_declarator. - (abs_member_declarator): Lose see_typename from rules. - (after_type_member_declarator): Likewise. - - * tree.c (get_identifier_list): New function, containing code - previously duplicated in get_decl_list and list_hash_lookup_or_cons. - (get_decl_list): Use it. - (list_hash_lookup_or_cons): Likewise. - - * parse.y (typed_declspecs, declmods): It's not necessary to hash - the declspecs on class_obstack, so don't. This way typed_typespecs - can reduce to typed_declspecs. - -Wed Mar 2 14:29:18 1994 Jason Merrill - - * cvt.c (build_up_reference): If we aren't checking visibility, - also allow base->derived conversions. - -Mon Feb 28 15:14:29 1994 Per Bothner - - * typeck.c (build_c_cast): Remove bogus hack when converting - to a reference type. - - * cp-tree.h (lang_decl::vbase_init_list, DECL_VBASE_INIT_LIST): - Removed, not used. - (lang_stype::methods, lang_decl::next_method): New fields. - (CLASSTYPE_METHODS, DECL_NEXT_METHOD): New macros. - * decl.c (duplicate_decls): Preserve DECL_NEXT_METHOD. - - * cp-tree.h, decl2.c (flag_vtable_hack): New flag. - * decl2.c (finish_vtable_vardecl): If flag_vtable_hack, - and !CLASSTYPE_INTERFACE_KNOWN, try to use the presence of - a non-inline virtual function to control emitting of vtables. - * class.c (finish_struct): Build CLASSTYPE_METHODS list. - * search.c (build_vbase_vtables_init): Don't assemble_external - (yet) if flag_vtable_hack. - * class.c (build_vfn_ref): Likewise. - -Mon Feb 28 14:54:13 1994 Jason Merrill - - * parse.y (component_decl): Don't include "typed_declspecs - declarator ';'" speedup, since it breaks enums. - -Fri Feb 25 15:43:44 1994 Per Bothner - - * class.c (finish_struct): Minor optimization for building - fn_fields list. - -Fri Feb 25 15:23:42 1994 Jason Merrill - - * decl.c (start_function): Fix detection of function overloading. - -Thu Feb 24 22:26:19 1994 Mike Stump - - * lex.c (check_newline): #pragma interface can take a string - argument, just like #pragma implementation. #pragma implementation - checks for garbage on the line, line #pragma interface does. Main - input files do not auto implement like named files, #pragma - implementation must be used explicitly. - -Thu Feb 24 17:09:01 1994 Jason Merrill - - * parse.y (components): Handle list of one again. - (notype_components): Likewise. - (after_type_declarator1): Take maybe_raises out again. - - * gxxint.texi (Parser): Document additional r/r conflict. - -Wed Feb 23 14:42:55 1994 Jason Merrill - - * gxxint.texi (Parser): Add node. - - * Makefile.in (stamp-parse): Update expected conflict count. - - * parse.y (various): Replace "declmods declarator" with "declmods - notype_declarator". The comment saying that "declmods declarator ';'" - corresponds to "int i;" was wrong; it corresponds to "const i;". - (component_decl): Add "typed_declspecs declarator ';'" rule; this - *does* correspond to "int i;". Change "declmods components" to - "declmods notype_components". - (components): Don't deal with a list of one anymore. - (notype_components): New nonterminal, corresponds to notype_declarator. - ({after_,no}type_component_decl{,0}): More new nonterminals. - ({after_,no}type_declarator): Fold in START_DECLARATOR token. - Eliminates four reduce/reduce conflicts. - - (expr): Depend on nontrivial_exprlist instead of nonnull_exprlist. - (nontrivial_exprlist): New nonterminal: A list of at least two - expr_no_commas's. - (nonnull_exprlist): Depend on nontrival_exprlist. - Eliminates four reduce/reduce conflicts. - - (named_class_head): Move intermediate code block into separate - nonterminal so that we can stick %prec EMPTY on it. - - Add more %prec EMPTY's to eliminate remaining shift/reduce - conflicts. - - (after_type_declarator): Add maybe_raises to fndecl rules. - (after_type_declarator_no_typename): Remove. - For correctness. - - Document remaining reduce/reduce conflicts. - -Tue Feb 22 12:10:32 1994 Jason Merrill - - * search.c (get_base_distance): Only bash BINFO_INHERITANCE_CHAIN - (TYPE_BINFO (type)) if we care about the path. - - * tree.c (lvalue_p): A COND_EXPR is an lvalue if both of the - options are. - -Mon Feb 21 19:59:40 1994 Mike Stump - - * Makefile.in (mostlyclean): lex.c is a source file, don't - remove. - -Sat Feb 19 01:27:14 1994 Jason Merrill - - * parse.y: Eliminate 20 shift/reduce conflicts. - -Fri Feb 18 11:49:42 1994 Jason Merrill - - * pt.c (type_unification): Add subr argument; if set, it means - that we are calling ourselves recursively, so a partial match is OK. - (unify): Support pointers to methods and functions. - (tsubst): Support method pointers. - * decl.c (build_ptrmemfunc_type): No longer static, so that - tsubst can get at it. - - * init.c (is_aggr_typedef): Pretend template type parms are - aggregates. - * decl2.c (build_push_scope): If cname refers to a template type - parm, just grin and nod. - - * call.c (build_overload_call_real): Pass subr argument to - type_unification. - * pt.c (do_function_instantiation): Likewise. - * class.c (instantiate_type): Likewise. - - * search.c (get_base_distance): If BINFO is a binfo, use it and - don't mess with its BINFO_INHERITANCE_CHAIN. - - * cvt.c (convert_to_reference): Fix temporary generation. - If ambiguous, return error_mark_node. - - * init.c (build_new): Put back some necessary code. - -Thu Feb 17 15:39:47 1994 Jason Merrill - - * init.c (build_new): Deal with array types properly. - - * search.c (get_binfo): Become a shell for get_base_distance. - (get_binfo_recursive): Lose. - (get_base_distance_recursive): Find the path to the via_virtual base - that provides the most access. - (get_base_distance): Likewise. - - * parse.y (explicit_instantiation): Syntax is 'template class - A', not 'template A'. - - * typeck.c (convert_for_initialization): Remove bogus warning. - - * parse.y (datadef): Revert patch of Oct 27. - -Thu Feb 17 15:12:29 1994 Per Bothner - - * class.c (build_vfn_ref): Cast delta field to ptrdiff_type_node, - rather than integer_type_node. Does wonders for the Alpha. - -Thu Feb 17 13:36:21 1994 Jason Merrill - - * decl.c (build_ptrmemfunc_type): Make sure that the pmf type - goes onto the same obstack as its target type. - -Wed Feb 16 00:34:46 1994 Jason Merrill - - * cvt.c (convert_to_reference): If converting via constructor - on local level, go back to build_cplus_new approach. - - * tree.c (build_cplus_new): If with_cleanup_p, set cleanup slot - to error_mark_node to prevent expand_expr from building a cleanup - for this variable. - - * lex.c (default_assign_ref_body): Return *this from the memcpy - version, too. - - * decl.c (grok_reference_init): Just return if called with - error_mark_node, don't worry about initializing non-const reference - with temporary. - - * cvt.c (convert_to_reference): Do the right thing for - non-aggregate reference conversions, pedwarn when generating a - non-const reference to a temporary. - - * class.c (finish_struct): TYPE_HAS_COMPLEX_{INIT,ASSIGN}_REF and - TYPE_NEEDS_CONSTRUCTING all depend on TYPE_USES_VIRTUAL_BASECLASSES - again. - -Tue Feb 15 19:47:19 1994 Jason Merrill - - * decl.c (grok_reference_init): Pawn off a lot of the work on - convert_to_reference. Generally do the right thing. - - * cvt.c (convert_to_reference): Conform to the initial comment; - i.e. don't create temps if decl != error_mark_node. Handle - cleanups better for temps that do get created. Don't pretend - that we can use an 'A' to initialize a 'const double &' just by - tacking on a NOP_EXPR. Support LOOKUP_SPECULATIVELY. - - * call.c (build_method_call): Set TREE_HAS_CONSTRUCTOR on - constructor calls. - -Mon Feb 14 14:50:17 1994 Jason Merrill - - * decl.c (grok_reference_init): Make a temporary for initializing - const reference from constant expression. - -Mon Feb 14 11:31:31 1994 Per Bothner - - * cp-tree.h, decl.c (set_identifier_local_value): Deleted function. - * decl.c (pushdecl): Define decl in correct binding_level - (which isn't always the inner_binding_level). - - * cvt.c (build_up_reference): Don't ever call expand_aggr_init. - It's ugly, and I don't think it's the right thing to do. - - * cp-tree.h, class.c, decl.c, decl2.c, sp/search.c: - Remove NEW_CLASS_SCOPING, assuming it is always 1. - * decl.c (pop_decl_level): Removed; manually inlined. - -Sun Feb 13 19:04:56 1994 Jason Merrill - - * class.h (candidate): Add basetypes field. - - * call.c (build_method_call): Do access checking after choosing a - function, not before. - - * Makefile.in (cvt.o, call.o, method.o): Depend on class.h. - (mostlyclean): Remove ../cc1plus. - -Fri Feb 11 11:52:26 1994 Jason Merrill - - * class.c (finish_struct): Don't allow adjusting access to a field - of a base class if a local field has the same name. - - * error.c (dump_type_prefix): Output basetype for METHOD_TYPEs. - -hu Jan 13 17:55:51 EST 1994 Gnanasekaran Swaminathan - - * cp-tree.h (DESTRUCTOR_NAME_P): do not confuse AUTO_TEMP names - with destructor names when either NO_DOLLAR_IN_LABEL or - NO_DOT_IN_LABEL are not defined. - - Now `template class A {...}' works. - - * pt.c (grok_template_type): substitute template parm types - with actual types in complex type as well. - (coerce_template_parms): update the grok_template_type () - function call. - - * pt.c (tsubst): Traverse method list using DECL_CHAIN. - - * decl.c (grok_op_properties): Allow operator++/-- to have - default arguments. - - * typeck2.c (store_init_value): Don't abort when called to - initialize a type that needs constructing with a CONSTRUCTOR. - - * init.c (expand_aggr_init_1, CONSTRUCTOR case): If - store_init_value fails, build and expand an INIT_EXPR. If - store_init_value succeeds, call expand_decl_init. - -Fri Feb 11 02:49:23 1994 Mike Stump - - * class.c (build_vbase_path): Use complete_type_p instead of - resolves_to_fixed_type_p to determine if the virtual bases are in - their right place for the type of expr. Cures problem of thinking a - virtual base class is one place, when it is in fact someplace else. - -Fri Feb 11 00:26:46 1994 Mike Stump - - * init.c (resolve_offset_ref): Make sure we first convert to - intermediate type, if given, when dealing with members off `this'. - Solves an incorrrect `type `foo' is not a base type for type - `multiple'' when it is infact, a base type. - -Thu Feb 10 21:49:35 1994 Mike Stump - - * class.c (modify_other_vtable_entries): Use get_binfo, instead - of binfo_value. Solves problem with compiler giving a `base class - `B' ambiguous in binfo_value (compiler error)' on complex MI - herarchies, when a virtual function is first defied in a virtual - base class. - -Thu Feb 10 17:19:32 1994 Mike Stump - - * class.c (build_vbase_path): Don't complain about ambiguous - intermediate conversion when converting down to a virtual base - class, even if they might seem to be ambiguous. - -Thu Feb 10 12:18:26 1994 Jason Merrill - - * typeck2.c (build_functional_cast): #if 0 out constructor - inheritance code, improve error messages. - - * class.c (finish_base_struct): Complain about base with only - non-default constructors in derived class with no constructors. - - * decl.c (grokdeclarator): Fix detection of virtual new/delete. - -Wed Feb 9 22:02:32 1994 Mike Stump - - * search.c (build_mi_virtuals, add_mi_virtuals, - report_ambiguous_mi_virtuals): Removed unneeded code. - * class.c (finish_struct_bits): Likewise. - -Wed Feb 9 11:27:17 1994 Jason Merrill - - * pt.c (end_template_instantiation): Push decl before - pop_from_top_level. - - * typeck2.c (build_m_component_ref): Make sure datum is of - aggregate type. - - * init.c (get_type_value): New function, returns - IDENTIFIER_TYPE_VALUE or IDENTIFIER_CLASS_TYPE_VALUE or NULL_TREE. - - * call.c (build_method_call): Don't die on call to destructor for - non-type. - - * decl.c (grokdeclarator): Complain about virtual op new and op - delete, make static virtuals unvirtual instead of unstatic. - - * typeck.c (build_c_cast): Also call default_conversion on - methods. - - * decl.c (grokdeclarator): Don't complain about anonymous - bitfields. - - * parse.y (simple_stmt, for loops): Move the continue point after - the cleanups. - - * class.c (finish_struct): Fix setting of - TYPE_HAS_COMPLEX_INIT_REF. - -Tue Feb 8 13:21:40 1994 Jason Merrill - - * init.c (build_new): Deal with `new double (1)'. - - * class.c (finish_struct): TYPE_HAS_COMPLEX_*_REF are supersets of - TYPE_HAS_REAL_*_REF, but TYPE_HAS_COMPLEX_INIT_REF is independent of - TYPE_NEEDS_CONSTRUCTING. - - * decl.c (duplicate_decls): Propagate access decls. - - * typeck2.c (process_init_constructor): Accept empty_init_node - for initializing unions. - - * class.c, lex.c, cp-tree.h: Use - TYPE_HAS_COMPLEX_ASSIGN_REF where TYPE_HAS_REAL_ASSIGN_REF was used - before, use TYPE_HAS_COMPLEX_INIT_REF for TYPE_NEEDS_CONSTRUCTING in - some places. - - * decl.c (finish_decl): Don't complain about uninitialized const - if it was initialized before. - -Mon Feb 7 18:12:34 1994 Jason Merrill - - * lex.c (default_assign_ref_body): Don't deal with vbases for - now. - - * decl.c (finish_decl): Fix reversed logic for objects and other - things that need to be constructed but have no initializer. - - * class.c (finish_struct): Don't set TYPE_HAS_* flags that are - set by grok_op_properties or finish_decl. - - * decl.c: Don't warn about extern redeclared inline unless - -Wextern-inline is given. - * decl2.c (lang_decode_option): Likewise. - * cp-tree.h: Likewise. - -Mon Feb 7 17:29:24 1994 Per Bothner - - * decl.c (pushdecl_with_scope): Fix thinko. Add forward - declaration. - - * decl.c (pushdecl_with_scope): New function. - * decl.c (pushdecl_top_level): Use new function. - * decl.c (pushtag): Initialize newdecl. - * decl.c (pushtag): Push new type decl into correct scope. - -Mon Feb 7 14:42:03 1994 Jason Merrill - - * call.c, cvt.c, init.c, search.c, cp-tree.h: - Eradicate LOOKUP_PROTECTED_OK. - -Mon Feb 7 13:57:19 1994 Per Bothner - - * decl.c (pushtag, xref_tag), cp-tree.h: Add extra parameter - 'globalize' to signify implicit declarations. - * decl.c (globalize_nested_type, maybe_globalize_type): Removed. - * decl.c (set_identifier_type_value_with_scope): New function. - * decl.c (set_identifier_local_value): Simplify. - * spew.c (yylex, do_addr): Modify to return a _DEFN if a - forward declaration (followed by ';' and not preceded by 'friend'). - * class.c, decl.c, except.c, init.c, parse.y, - pt.c, search.c: Add new argument to calls to xref_tag and - pushtag. - -Mon Feb 7 00:22:59 1994 Jason Merrill - - * cp-tree.h (ACCESSIBLY_UNIQUELY_DERIVED_P): New macro, means what - ACCESSIBLY_DERIVED_FROM_P meant before. - (ACCESSIBLY_DERIVED_FROM_P): Now disregards ambiguity. - - * cvt.c (build_up_reference): Call get_binfo with PROTECT == 1. - - * search.c (get_base_distance_recursive): Members and friends of - a class X can implicitly convert an X* to a pointer to a private or - protected immediate base class of X. - (get_binfo_recursive): Likewise. - (get_base_distance): Ignore ambiguity if PROTECT < 0. - (get_binfo): Lose multiple values of PROTECT. - (compute_access): Protected is OK if the start of the - search is an accessible base class of current_class_type. - - * method.c (build_opfncall): Do check access on operator new here. - - * decl.c (finish_function): Don't check access on operator new - here. - -Sun Feb 6 14:06:58 1994 Jason Merrill - - * decl.c (xref_tag): The base of a derived struct is NOT always - public. Duh. - - * pt.c (do_explicit_instantiation): New function, called from - parser to do explicit function instantiation. - (type_unification): Allow the args list to be terminated with - void_list_node. - (do_pending_expansions): Look at i->interface for non-member - templates. - - * parse.y (datadef): Move explicit_instantiation here. - (structsp): From here. - (datadef): Complain about `int;'. - -Sun Feb 6 12:33:18 1994 Per Bothner - - * pt.c (end_template_instantiation), cp-tree.h: Remove unused - second parameter, and simplify first from a TREE_LIST where - we only care about its TREE_VALUE to just the value (an IDENTIFIER). - * pt.c (instantiate_member_templates): Simplify argument list - from a TREE_LIST to just an IDENTIFIER. - * lex.c (yyprint): PRE_PARSED_CLASS_DECL is now just an IDENTIFIER. - * parse.y (template_instantiate_once): Simplify accordingly. - * decl.c (inner_binding_level): New. Use various places to - simplify. - -Sun Feb 6 02:49:37 1994 Jason Merrill - - * typeck2.c (build_functional_cast): int() -> int(0). - -Sat Feb 5 00:53:21 1994 Jason Merrill - - * class.c (finish_struct): Don't do a bitwise copy for op= if the - class has a virtual function table. - - * typeck.c (convert_for_initialization): Restore warnings about - not using defined op=. Should really be my_friendly_aborts, I - s'pose. - -Fri Feb 4 14:21:00 1994 Jason Merrill - - * class.c (finish_struct): Tidy up conditions for doing bitwise - copies of objects. - - * decl.c (build_default_constructor): #if 0 out. - - * *: Eradicate TYPE_GETS_{ASSIGNMENT,ASSIGN_REF,CONST_ASSIGN_REF, - CONST_INIT_REF}, TYPE_HAS_REAL_CONSTRUCTOR. - - * decl.c (grokdeclarator): Don't return void_type_node for - friends being defined here. - - * init.c (perform_member_init): Only do the init if it's useful. - - * lex.c (default_copy_constructor_body): If we don't need to do - memberwise init, just call __builtin_memcpy. - (default_assign_ref_body): Likewise. - - * decl.c (grokdeclarator): If friendp && virtualp, friendp = 0. - -Fri Feb 4 13:02:56 1994 Mike Stump - - * lex.c (reinit_parse_for_method, cons_up_default_function): - Don't give warn_if_unknown_interface warning when it came from a - system header file. - * pt.c (end_template_decl, instantiate_template): Likewise. - * decl.c (start_decl): Likewise. - -Fri Feb 4 00:41:21 1994 Jason Merrill - - * decl.c (grokdeclarator): Don't try to set TYPE_WAS_ANONYMOUS on - enums. - - * decl2.c (constructor_name_full): Use IS_AGGR_TYPE_CODE instead of - IS_AGGR_TYPE, since we don't know it's a type. - -Thu Feb 3 11:36:46 1994 Jason Merrill - - * decl.c (grokdeclarator): Don't complain about anonymous unions. - - * cp-tree.h (TYPE_WAS_ANONYMOUS): This struct was originally - anonymous, but had a name given to it by a typedef. - - * decl.c (grokdeclarator): When renaming an anonymous struct, set - TYPE_WAS_ANONYMOUS. - - * decl2.c (constructor_name_full): Use TYPE_WAS_ANONYMOUS. - - * cp-tree.h (DECL_UNDEFINED_FRIENDS): #if 0 out. - - * init.c (xref_friend): Don't set up DECL_UNDEFINED_FRIENDS. - (embrace_waiting_friends): Don't use DECL_UNDEFINED_FRIENDS. - - * decl.c (grokdeclarator): Set TYPE_NESTED_NAME properly on nested - anonymous structs that get typedef'd. - - * decl.c (grokdeclarator): Always return void_type_node for - friends. - - * error.c (dump_function_decl): Don't use DECL_CLASS_CONTEXT for - friends. - (dump_function_decl): Don't print out default args for - a function used in an expression. - - * decl.c (grokdeclarator): Give error on abstract declarator used - in an invalid context (i.e. `void (*)();'). - - * error.c (cp_line_of): Support _TYPE nodes. - (cp_file_of): Likewise. - - * cvt.c (build_up_reference): Don't abort if passed a SAVE_EXPR; - it can happen for the RHS of an assignment stmt where the LHS is - a COND_EXPR. - - * init.c (expand_aggr_init_1): Deal with bracketed initializer - lists properly. - - * class.c (finish_struct): Deal with enumerators and typedefs - again. - -Wed Feb 2 11:30:22 1994 Jason Merrill - - * class.c (finish_struct): Tidy up loop over fields. - - * errfn.c (cp_thing): Don't advance twice after a format. - - * class.c (finish_struct): Complain about needing a constructor - if a member has only non-default constructors, and don't try to - generate a default constructor. - - * decl.c (finish_decl): Also do the constructor thing if - TYPE_NEEDS_CONSTRUCTING is set (for arrays). - - * search.c (unuse_fields): New function: mark all fields in this - type unused. - (dfs_unuse_fields): Helper function. - - * class.c (pushclass): If the new class is the same as the old - class, still unuse the fields. - (unuse_fields): Move to search.c. - - * decl.c (grok_op_properties): Add friendp argument. - (grokfndecl): Pass it. - (start_method): Likewise. - - * decl2.c (delete_sanity): Add use_global_delete parameter to catch - ::delete calls. - - * parse.y (unary_expr): Pass new parameter to delete_sanity. - - * lex.c (default_copy_constructor_body): Don't choke if the union - has no fields. - (default_assign_ref_body): Likewise. - - * call.c (compute_conversion_costs_ansi): Do the right thing for - ellipsis matches. - - * decl.c (push_to_top_level): Optimize. - - * decl.c (start_function): Look for the lexical scope of a friend - in DECL_CLASS_CONTEXT. - - * init.c (do_friend): Set DECL_CLASS_CONTEXT on global friends. - -Tue Feb 1 15:59:24 1994 Jason Merrill - - * cp-tree.h (TREE_GETS_PLACED_NEW): New macro. - - * init.c (init_init_processing): Don't assign BIN/BID to the - IDENTIFIER_GLOBAL_VALUEs of their respective operators. - (build_new): Check TREE_GETS_PLACED_NEW. - - * decl.c (grok_op_properties): Don't set TREE_GETS_NEW for a decl of - op new with placement, set TREE_GETS_PLACED_NEW. - - * cp-tree.h (ANON_UNION_P): New macro. Applies to decls. - - * class.c (finish_struct): Don't treat anonymous unions like - other aggregate members. Do synthesize methods for unions without - a name, since they may or may not be "anonymous unions". - - * decl2.c (grok_x_components): Wipe out memory of synthesized methods - in anonymous unions. - - * lex.c (default_copy_constructor_body): Support unions. - (default_assign_ref_body): Likewise. - -Mon Jan 31 12:07:30 1994 Jason Merrill - - * cp-tree.h: Fix documentation of LOOKUP_GLOBAL, add prototypes. - - * error.c (args_as_string): New function (%A), like type_as_string - except NULL_TREE -> "..." - - * call.c (build_overload_call_real): Fix for new overloading. - - * decl.c (grok_op_properties): Set all of the TYPE_OVERLOADS_* flags - here. - - * parse.y (operator_name): Instead of here. - - * typeck2.c (build_functional_cast): Treat a TREE_LIST as a list - of functions. - - * call.c (build_overload_call_real): Support LOOKUP_SPECULATIVELY. - - * method.c (build_opfncall): Don't need to massage return value - any more, call build_overload_call with all flags. - - * typeck.c (build_x_binary_op): Put back speculative call to - build_opfncall. - (build_x_unary_op): Likewise. - (build_x_conditional_expr): Likewise. - -Mon Jan 31 10:00:30 1994 Mike Stump - - * cvt.c (build_type_conversion_1): Change call to pedwarn into - warning, and conditionalize upon warn_cast_qual. - -Fri Jan 28 11:48:15 1994 Jason Merrill - - * search.c (lookup_field): If xbasetype is a binfo, copy it to - avoid clobbering its inheritance info. - - * call.c (build_method_call): Don't overwrite basetype_path with - TYPE_BINFO (inst_ptr_basetype) if they have the same type. - - * search.c (compute_access): Fix handling of protected inheritance - and friendship with the enclosing class. - - * typeck2.c (store_init_value): Allow passing of TREE_CHAIN for - initialization of arbitrary variable. - - * typeck2.c (build_functional_cast): Only try calling a method if - one exists. - - * decl.c (grokdeclarator): Move handling of constructor syntax - initialization into first loop for generality. - (parmlist_is_random): Lose. - - * lex.c (cons_up_default_function): Set TREE_PARMLIST on arguments - to default function. - -Thu Jan 27 19:26:51 1994 Jason Merrill - - * decl.c (grokparms): Abort if we get called with something we don't - expect. - -Thu Jan 27 17:37:25 1994 Mike Stump - - * call.c (build_overload_call_real): Change argument complain to - flags to match style of rest of code. Pass it down to - build_function_call_real as necessary. - * call.c (build_overload_call, build_overload_call_maybe): Change - argument complain to flags to match style of rest of code. - * cp-tree.h (build_function_call_real): Added fourth flags - argument. - * cvt.c (convert_to_reference): Only give warning messages, if - LOOKUP_COMPLAIN is set. - * typeck.c (build_x_function_call): Change simple complain - argument to build_overload_call_maybe and build_overload_call, to - LOOKUP_COMPLAIN to match style of rest of code. - * typeck2.c (build_functional_cast): Likewise. - * typeck.c (build_function_call_real): Add flags, so that we can - not complain, if we don't want to complain. Complain about - arguments, if we are complaining, otherwise don't. - * typeck.c (build_function_call, build_function_call_maybe): - Stick in flags argument. - * typeck.c (build_x_binary_op, build_x_unary_op, - build_x_conditional_expr, build_x_compound_expr): Follow style of - build_x_indirect_ref, as it is more correct and more common. - -Thu Jan 27 14:36:20 1994 Jason Merrill - - * call.c (build_method_call): Don't check for being called with - a pointer. - - * decl2.c (finish_file): Don't play with DECL_CLASS_CONTEXT for the - static initializer function. - - * init.c (build_member_call): Use convert_force here, too. - - * search.c (compute_access): Only treat static members specially - if they are referenced directly. - -Wed Jan 26 18:28:14 1994 Jason Merrill - - * gxxint.texi (Access Control): New node. - - * search.c (current_scope): New function; returns whichever of - current_class_type and current_function_decl is the most nested. - (compute_access): Total overhaul to make it clearer and more - correct. Don't use the cache for now; in the only situation where - it was used before, it gained nothing. This frees up three of the - DECL_LANG_FLAGs for possible other use! - - * cp-tree.h: #if 0 out DECL_PUBLIC & friends. - - * typeck.c (build_component_ref_1): Don't check DECL_PUBLIC. - - * call.c (build_method_call): Use convert_force to cast `this' -- - rely on the access checking for the method itself. - - * init.c (is_friend): Do the nesting thing, handle types. I am - my own friend. - (is_friend_type): Become a shell for is_friend. - (add_friend): Never stick in ctype. - Why are the friendship functions in init.c, anyway? - -Wed Jan 26 17:50:00 1994 Mike Stump - - * cvt.c (build_type_conversion_1): Don't conditionalize call to - pedwarn upon pedantic. - -Wed Jan 26 17:20:46 1994 Mike Stump - - * cvt.c (convert_to_reference): Add 8.4.3 checking so that one - gets a warning if one tries to initialize a non-const & from a - non-lvalue. - * cvt.c (convert_to_reference): Use %P format for argument - numbers in warnings. - -Wed Jan 26 14:35:06 1994 Mike Stump - - * init.c (build_delete): Follow style in call.c to construct the - virtual call to the desctructor, as that code is right. Fixes a - problem of the compiler saying a pointer conversion is ambiguous. - -Wed Jan 26 11:28:14 1994 Jason Merrill - - * cp-tree.h (VTABLE_NAME_P): Change other occurrence of - VTABLE_NAME_FORMAT to VTABLE_NAME. - - * *: s/visibility/access/g - -Tue Jan 25 18:39:12 1994 Jason Merrill - - * typeck.c (build_modify_expr): Don't smash references if INIT_EXPR. - -Tue Jan 25 13:54:29 1994 Mike Stump - - * init.c (build_delete): Back out Jan 17th & 18th pacthes, as - they break libg++. - -Tue Jan 25 13:11:45 1994 Jason Merrill - - * decl.c (duplicate_decls): Fix pointer arithmetic. - -Mon Jan 24 15:50:06 1994 Chip Salzenberg - - [ cp-* changes propagated from c-* changes in 940114 snapshot ] - * cp-parse.y (maybe_attribute): Allow multiple __attribute__ - clauses on a declaration. - -Mon Jan 24 17:06:23 1994 Jason Merrill - - * class.c (finish_struct): Do synthesize methods for anon - structs, just not unions. - -Mon Jan 24 13:50:13 1994 Kung Hsu - - * decl.c (xref_tag): handle anonymous nested type. - * decl.c (globalize_nested_type): add no globalize bit check. - * spew.c (hack_more_ids) : templated nested decl not push top - level. - - * parse.y : get rid of 'goto do_components'. It is much better - for debugging. - - * decl.c (is_anon_name): get rid of the function and use the - macro ANON_AGGRNAME_P. - * pt.c : ditto. - -Fri Jan 21 14:06:02 1994 Jason Merrill - - * class.c (finish_struct): Don't synthesize any methods for - anonymous structs/unions. - - * typeck.c (build_modify_expr): Don't treat pmf's as class objects. - -Thu Jan 20 18:56:46 1994 Jason Merrill - - * method.c (build_opfncall): Call build_indirect_ref on - synthesized instance for operator delete. - - * pt.c (type_unification): Don't abort if called with a list of - types in ARGS. - - * class.c (instantiate_type): Deal with function templates. - -Thu Jan 20 16:55:35 1994 Jim Wilson - - * Makefile.in (CC): Default to cc not gcc. - -Thu Jan 20 13:47:54 1994 Jason Merrill - - * typeck.c (build_modify_expr): Call constructor if appropriate. - - * decl.c (push_to_top_level): Clear out class-level bindings cache. - -Wed Jan 19 13:51:22 1994 Jason Merrill - - * call.c (resolve_scope_to_name): Work recursively (previously only - looked down one level). - - * lex.c (do_pending_inlines): If we're still dealing with the last - batch of inlines, don't start working on a new one. - - * Makefile.in (stamp-parse): Update conflict count. - (TAGS): Fix. - - * parse.y (explicit_instantiation): New rule; implements - 'template A' syntax (though not 'template foo(int)' yet). - (structsp): Add explicit_instantiation. - -Tue Jan 18 13:53:05 1994 Jason Merrill - - * class.c (finish_struct, etc.): Simplify decision to synthesize - a destructor. - - * call.c, class.c, cp-tree.h, decl.c, init.c, - ptree.c, search.c, typeck.c, typeck2.c: Nuke - TYPE_NEEDS_CONSTRUCTOR (change all calls to TYPE_NEEDS_CONSTRUCTING). - * init.c (expand_aggr_init_1): Don't try non-constructor methods - of initializing objects. - (build_new): Don't try other methods if the constructor lookup fails. - - * class.c (finish_base_struct): Set cant_have_default_ctor and - cant_synth_copy_ctor properly. - (finish_struct): Likewise. - -Mon Jan 17 13:58:18 1994 Jason Merrill - - * typeck.c (build_modify_expr_1): #if 0 out again. - (build_modify_expr): #if 0 out memberwise init code again. - - * lex.c (default_copy_constructor_body): Be const-correct. - (default_assign_ref_body): Likewise. - - * init.c (perform_member_init): Use TYPE_HAS_CONSTRUCTOR to decide - whether or not to use it, rather than TYPE_NEEDS_CONSTRUCTING. - (expand_aggr_init): Disable silent conversion from initializer list - to list of args for a constructor. - - * class.c (base_info): Lose needs_default_ctor. - (finish_base_struct): Likewise. - (finish_struct): Likewise. - - * decl.c (init_decl_processing): Don't turn off flag_default_inline - just because flag_no_inline is on. - (finish_decl): Use TYPE_HAS_CONSTRUCTOR to decide to use - constructor. - - * class.c (finish_struct): Synthesize default ctor whenever - allowed. - - * Makefile.in (TAGS): Don't try to run etags on cp-parse.y. - -Sat Jan 15 18:34:33 1994 Mike Stump - - * Makefile.in, configure: Handle the C++ front-end in a - subdirectory. - * cp-*: Move C++ front-end to cp/*. - -Fri Jan 14 14:09:37 1994 Jason Merrill - - * cp-typeck.c (build_function_call_real): Modify to match other - instances of taking the address of the function. - - * cp-class.c (finish_struct): Set TYPE_HAS_REAL_CONSTRUCTOR to 1 if - there are non-synthesized constructors. - Only set TYPE_NEEDS_CONSTRUCTOR if TYPE_HAS_REAL_CONSTRUCTOR. - Always generate copy constructor if possible. - - * cp-tree.h (lang_type): Add has_real_constructor bitfield. - (TYPE_HAS_REAL_CONSTRUCTOR): Define. - - * cp-lex.c (default_copy_constructor_body): Use init syntax - for all bases. - - * cp-type2.c (store_init_value): Only give error for initializer list - if TYPE_HAS_REAL_CONSTRUCTOR. - -Thu Jan 13 15:38:29 1994 Jason Merrill - - * cp-tree.h (DECL_SYNTHESIZED): Add defn. - (lang_decl): Add synthesized bitfield to decl_flags. - - * cp-lex.c (cons_up_default_function): Use DECL_SYNTHESIZED to mark - artificial methods, rather than a line # of 0. - -Fri Jan 14 18:25:29 1994 Kung Hsu - - * cp-decl (xref_tag): fix a bug in conflict type. - * cp-parse.y : add SCOPED_NAME for uninstantiated template nested - type reference. - * cp-spew.c (yylex) : generated SCOPED_NAME token. - * cp-lex.c (yyprint): handle SCOPED_NAME. - -Fri Jan 14 17:00:29 1994 Mike Stump - - * cp-decl.c (pushdecl): Revert patch from Jan 11 19:33:03, as it is - not right. - -Thu Jan 13 14:00:35 1994 Kung Hsu - - * cp-decl2.c (grok_x_components): fix a bug that enum type does not - have type_flags. - -Thu Jan 13 11:39:34 1994 Mike Stump - - Ensure that all vtable pointers are initialized with all the right - values. - - * cp-class.c (is_normal): Changed to reflect new meaning of - CLASSTYPE_VFIELD_PARENT. - * cp-class.c (maybe_fixup_vptrs): Use of - CLASSTYPE_NEEDS_VIRTUAL_REINIT here is misguided. Use - BINFO_MODIFIED instead. - * cp-class.c (finish_struct): Changed to reflect new meaning of - CLASSTYPE_VFIELD_PARENT. - * cp-decl.c (get_binfo_from_vfield): Removed, unneeded now. - * cp-decl.c (finish_function): Use init_vtbl_ptrs, instead of open - coding it here. - * cp-init.c (init_vfields): Changed name to init_vtbl_ptrs, and - re-implement. - * cp-init.c (emit_base_init): Use new name init_vtbl_ptrs. - * cp-tree.h (vfield_parent): Changed to integer. - * cp-tree.h (CLASSTYPE_VFIELD_PARENT): Changed docs to reflect new - meaning. - * cp-tree.h (init_vtbl_ptrs): Added init_vtbl_ptrs. - -Wed Jan 12 18:24:16 1994 Kung Hsu - - * cp-decl.c (xref_tag): re-implement globalize nested type. - * cp-decl2.c (grok_x_components): ditto. - * cp-parse.y: ditto. - * cp-tree.h (lang_type): add no_globalize bit in type_flags. - -Wed Jan 12 14:08:09 1994 Jason Merrill - - * cp-decl.c (grokdeclarator): Don't set TREE_PUBLIC on friend - decls with a definition attached. - - * cp-typeck.c (build_modify_expr): Undo previous change in the case - of INIT_EXPRs. - -Tue Jan 11 19:33:03 1994 Jason Merrill - - * cp-typeck.c (build_modify_expr): Replace code for generating - assignment semantics for classes with an error. - (build_modify_expr_1): #if 0 out. - - * cp-decl.c (pushdecl): Patch bogus design of pushdecl - behavior for overloaded functions (it doesn't push anything). - - * cp-class.c (finish_struct): When generating default op=, - set TYPE_HAS_ASSIGNMENT. - -Mon Jan 10 18:48:06 1994 Mike Stump - - * cp-cvt.c (convert): Make {double, clashing enum} -> enum - invalid. - * cp-typeck.c (convert_for_assignment): Simplify. - * cp-decl2.c (warn_enum_clash): Removed. - * invoke.texi (-Wenum-clash): Removed. - * toplev.c (-Wenum-clash): Removed. - -Mon Jan 10 17:48:37 1994 Kung Hsu - - * cp-decl.c (finish_decl): fix incorrect popclass call. - - * cp-decl.c (is_anon_name): new function, check whether the name - is anonymous name generated by compiler. - * cp-decl.c (grokdeclarator): allow nested SCOPE_REF - * cp-spew.c (hack_more_ids): handle nested type in template. - * cp-parse.y : handle nested type reference in uninstantiated - template. - * cp-call.c (build_method_call): handle uninstantiated template - case. - * cp-pt.c (search_nested_type_in_tmpl): new function, search nested - type in template. - * cp-pt.c (lookup_nested_type_by_name): new function, lookup nested - type by name. - * cp-pt.c (tsubst): handle nested type search by name. - -Mon Jan 10 14:32:18 1994 Jason Merrill - - * cp-init.c (build_member_call): Propagate qualifiers to new type. - - * cp-call.c (build_method_call): Count functions the new way. - -Fri Jan 7 19:03:26 1994 Jason Merrill - - * cp-decl.c (pushtag): Set DECL_ASSEMBLER_NAME for nested classes, - too. - -Tue Jan 4 16:45:51 1994 Kung Hsu - - * cp-parse.y: change to handle whether to globalize nested class. - * cp-decl.c(xref_tag, maybe_globalize_type): Likewise. - -Mon Jan 3 22:22:32 1994 Gerald Baumgartner - - * Makefile.in cp-call.c cp-class.c cp-cvt.c cp-decl.c cp-decl2.c - cp-error.c cp-init.c cp-lex.c cp-lex.h cp-method.c cp-parse.y - cp-spew.c cp-tree.c cp-tree.h cp-type2.c cp-typeck.c cp-xref.c - gplus.gperf toplev.c: Incorporated C++ signature extension. - * cp-sig.c: New file, contains most of signature processing. - * cp-hash.h: Regenerated from gplus.gperf. - - * gcc.1 g++.1: Added explanation for the `-fhandle-signatures' - and `-fno-handle-signatures' command line flags. - - * gcc.texi: Changed the last-modification date. - * invoke.texi: Added `-fhandle-signatures' in the list of - C++ language options. Added explanation for this option. - -Tue Dec 28 21:10:03 1993 Mike Stump - - * cp-init.c (expand_vec_init): Remove comptypes test, as it is too - harsh here. - -Tue Dec 28 13:42:22 1993 Mike Stump - - * cp-pt.c (do_pending_expansions): Decide to expand a template - member function, based upon it's class type, not the class type of - the first place it was declared. - -Tue Dec 28 05:42:31 1993 Mike Stump - - * cp-class.c (is_normal): New routine, use to determine when the - given binfo is the normal one. (The one that should have the simple - vtable name.) - * cp-class.c (modify_other_vtable_entries): Use DECL_ASSEMBLER_NAME - to check if two fndecls are `the same'. Sometimes this routine can - modify the main vtable, and normal should be 1, in that case, so use - is_normal() to determine if this is the main vtable for the class. - Don't recurse down virtual bases, as they are shared, and we take - care of them elsewhere. - * cp-class.c (modify_vtable_entries): If we have already updated the - vtable with the new virtual, don't do it again. - * cp-class.c (finish_struct): Set CLASSTYPE_VFIELD_PARENT as - appropriate. Do virtual function overriding in virtual bases, after - normal overriding, so that the base function list in DECL_VINDEX is - not overridden, before we have a chance to run through the list. - Use DECL_ASSEMBLER_NAME to check if two fndecls are `the same'. - Make sure we pass the right address into modify_vtable_entries. - * cp-tree.h (CLASSTYPE_VFIELD_PARENT): New field to indicate which - binfo is the one that has the vtable that we based our vtable on. - -Fri Dec 24 09:40:52 1993 Michael Tiemann - - * cp-typeck.c (c_expand_start_case): Use default_conversion to - convert expression from reference type if necessary. - -Wed Dec 22 17:58:43 1993 Jason Merrill - - * cp-typeck.c (build_unary_op): Make sure that it's a TREE_LIST before - trying to read its TREE_VALUE. - - * cp-class.c (finish_struct_methods): Clear DECL_IN_AGGR_P here. - (finish_struct): Instead of here. - -Tue Dec 21 14:34:25 1993 Brendan Kehoe - - * cp-tree.c (list_hash_lookup_or_cons): Make sure the type doesn't - have TYPE_PTRMEMFUNC_P set before we try to build its - CLASSTYPE_ID_AS_LIST. - (get_decl_list): Likewise, when trying to read it. - - * cp-tree.h (VTABLE_NAME): No def with NO_{DOLLAR,DOT} defined. - (VTABLE_NAME_P): Use it instead of VTABLE_NAME_FORMAT. - -Mon Dec 20 13:35:03 1993 Brendan Kehoe - - * cp-typeck.c (rationalize_conditional_expr): New function. - (unary_complex_lvalue): Use it. - (build_modify_expr): Use it, since trying to do an ADDR_EXPR of it - with build_unary_op won't cut it. Don't wrap the COND_EXPR with a - SAVE_EXPR either. - - * cp-decl2.c (explicit_warn_return_type): Deleted variable. - (lang_decode_option): Set warn_return_type, not explicit_*, for - -Wreturn-type and -Wall. This is what rest_of_compilation uses to - decide if it should go into jump_optimize or not. - * cp-tree.h (explicit_warn_return_type): Deleted. - * cp-decl.c (grokdeclarator): Use warn_return_type, not explicit_*. - (finish_function): Also complain about no return in a non-void fn if - we're being pedantic (don't rely on use of -Wreturn-type). - -Fri Dec 17 15:45:46 1993 Brendan Kehoe - - * cp-decl.c (grokdeclarator): Forbid declaration of a function as - static if it's being done inside another function. - - * cp-search.c (compute_visibility): Check for friendship both ways. - -Fri Dec 17 14:28:25 1993 Jason Merrill - - * cp-cvt.c (build_default_binary_type_conversion): Make error - messages more helpful. - - * cp-error.c (op_as_string): New function, returns "operator ==" - given EQ_EXPR or suchlike. - -Fri Dec 17 13:28:11 1993 Brendan Kehoe - - * cp-call.c (print_n_candidates): New function. - (build_overload_call_real): Use it when we complain about a call - being ambiguous. - -Fri Dec 17 12:41:17 1993 Jason Merrill - - * cp-call.c (build_method_call): Fix checking for static call - context. - - * cp-method.c (build_opfncall): Call build_indirect_ref on argument - to operator new. - - * cp-init.c (build_new): Don't mess with rval when building - indirect ref. - -Thu Dec 16 16:48:05 1993 Kung Hsu - - * cp-lex.c (default_assign_ref_body): add check when TYPE_NESTED_ - NAME(type) may not be exist. It's not a problem for old compiler. - -Thu Dec 16 14:46:06 1993 Brendan Kehoe - - * cp-tree.h (CLASSTYPE_ALTERS_VISIBILITIES_P): Delete macro, it's - never used for anything. - (struct lang_type, member type_flags): Delete field - `alters_visibility', and up `dummy' by 1. - * cp-class.c (finish_base_struct): Delete code that copies the - setting of CLASSTYPE_ALTERS_VISIBILITIES_P. - (finish_struct): Delete code that sets it. - -Thu Dec 16 14:44:39 1993 Jason Merrill - - * cp-decl.c, cp-init.c, cp-typeck.c: Fix arguments to - build_method_call that I messed up before. - - * cp-search.c (get_base_distance): If protect > 1, allow immediate - private base. - - * cp-class.c (finish_base_struct): Set cant_synth_* correctly. - (finish_struct): Likewise. Well, nigh-correctly; it won't deal - properly with the case where a class contains an object of an - ambiguous base class which has a protected op=. Should be fixed - when the access control code gets overhauled. - (finish_struct_methods): Set TYPE_HAS_NONPUBLIC_* correctly. - -Thu Dec 16 12:17:06 1993 Brendan Kehoe - - * cp-lex.c (real_yylex): Turn the code back on that deals with - __FUNCTION__ and __PRETTY_FUNCTION__. Don't use lookup_name, to - avoid the ambiguity problems that led to it being turned off in the - first place. - - * cp-method.c (hack_identifier): Also check for a TYPE_PTRMEMFUNC_P - to see if something is a method. - -Wed Dec 15 18:35:58 1993 Mike Stump - - * cp-typeck.c (build_modify_expr): Avoid error messages on small - enum bit fields. - * cp-typeck.c (convert_for_assignment): Add missing argument to - cp_warning and cp_pedwarn calls. - -Wed Dec 15 18:25:32 1993 Jason Merrill - - * cp-parse.y (member_init): ANSI C++ doesn't forbid old-style base - initializers; it's just anachronistic. - - * cp-decl.c (finish_decl): Don't require external-linkage arrays - to have a complete type at declaration time when pedantic. - -Tue Dec 14 11:37:23 1993 Jason Merrill - - * cp-decl.c (pushdecl): Don't set DECL_CONTEXT if it's already set. - - * cp-call.c (build_method_call): Don't dereference pointer given - as instance. - - * cp-decl.c (finish_function): Don't pass pointer to - build_method_call. - (finish_function): Likewise. - - * cp-typeck.c (build_x_function_call): Likewise. - - * cp-method.c (build_component_type_expr): Likewise. - - * cp-init.c (build_member_call): Likewise. - (build_new): Likewise. - -Mon Dec 13 18:04:33 1993 Kung Hsu - - * cp-decl.c (xref_tag): fix regression created by changes made - in Dec. 7 1993. - * cp-decl.c (xref_defn_tag): fix parallel nested class problem. - -Fri Dec 10 12:40:25 1993 Brendan Kehoe - - * cp-call.c (compute_conversion_costs_ansi) [DEBUG_MATCHING]: Print - out the final evaluation of the function, so we can see if ELLIPSIS, - USER, and EVIL were set at the end. - - * cp-call.c (convert_harshness_ansi): When the parm isn't an lvalue, - only go for setting TRIVIAL_CODE if we are dealing with types that - are compatible. - -Thu Dec 9 18:27:22 1993 Mike Stump - - * cp-decl.c (flag_huge_objects): New flag to allow large objects. - * toplev.c (lang_options): Likewise. - * cp-decl2.c (flag_huge_objects, lang_f_options): Likewise. - * cp-decl.c (delta_type_node): New type for delta entries. - * cp-tree.h (delta_type_node): Likewise. - * cp-decl.c (init_decl_processing): Setup delta_type_node. - * cp-decl.c (init_decl_processing, build_ptrmemfunc_type): Use - delta_type_node instead of short_integer_type_node. - * cp-class.c (build_vtable_entry): Likewise. - -Thu Dec 9 16:19:05 1993 Brendan Kehoe - - * cp-tree.h (OPERATOR_TYPENAME_P): Define outside of - NO_{DOLLAR,DOT} macro checks, so it always gets defined. - (VTABLE_NAME_P): Define for NO_DOT && NO_DOLLAR_IN_LABEL. - -Wed Dec 8 17:38:06 1993 Mike Stump - - * cp-decl.c (finish_decl): Make sure things that can go into - "common", do go into common, if -fcommon is given. - -Wed Dec 8 13:01:54 1993 Brendan Kehoe - - * cp-call.c (print_harshness) [DEBUG_MATCHING]: New function. - (compute_conversion_costs_ansi) [DEBUG_MATCHING]: Print out - argument matching diagnostics to make instantly clear what the - compiler is doing. - - * cp-call.c (convert_harshness_ansi): If the parm isn't an lvalue, - then check to see if the penalty was increased due to - signed/unsigned mismatch, and use a TRIVIAL_CODE if it wasn't. - -Tue Dec 7 18:29:14 1993 Kung Hsu - - * cp-decl.c (xref_tag, pushtag): Fix nested class search/resolution - problem. - -Tue Dec 7 16:09:34 1993 Jason Merrill - - * cp-class.c (finish_struct): Before synthesizing methods, if no - methods have yet been declared then set nonprivate_method. Don't - set non_private method after synthesizing a method. - - * cp-lex.c (extract_interface_info): If flag_alt_external_templates - is set, tie emitted code to the location of template instantiation, - rather than definition. - - * cp-tree.h: Declare flag_alt_external_templates. - - * cp-decl2.c (lang_decode_option): Support -falt-external-templates. - - * toplev.c (lang_options): Likewise. - -Mon Oct 4 12:50:02 1993 Chip Salzenberg - - [changes propagated from 930810 snapshot] - * cp-decl.c (init_decl_processing): Make long long available for use - as SIZE_TYPE and PTRDIFF_TYPE. - (finish_decl): Allow file-scope static incomplete array. - (grokdeclarator): Don't pass on const and volatile fron function - value type to function type. - Warn here for volatile fn returning non-void type. - * cp-parse.y (attrib): Accept attributes `volatile' with alias - `noreturn', and `const'. - * cp-typeck.c (default_conversion): Don't lose const and volatile. - (build_binary_op_nodefault): Generate pedantic warning for comparison - of complete pointer type with incomplete pointer type. - (build_c_cast): Be careful that null pointer constant be INTEGER_CST. - -Tue Dec 7 10:46:48 1993 Jason Merrill - - * cp-init.c (expand_vec_init): When creating a temporary for copying - arrays, use the type of the source, not the target. - - * cp-cvt.c (convert): Pass an argument for errtype to - convert_to_reference. - - * cp-error.c (dump_expr, COMPONENT_REF & CALL_EXPR): Deal with - methods, -> and `this'. - -Mon Dec 6 17:12:33 1993 Jason Merrill - - * cp-error.c (parm_as_string): New function; returns `this' or arg - number. Corresponds to %P. - (dump_expr): Deal with method calls. - - * cp-cvt.c (convert_to_reference): Stop using warn_for_assignment. - * cp-typeck.c (convert_for_assignment): Likewise. - (warn_for_assignment): Lose. - -Mon Dec 6 11:33:35 1993 Brendan Kehoe - - * cp-call.c (ideal_candidate_ansi): Delete code that was never - doing anything useful. Instead, sort once, and DO NOT wipe - out any codes with EVIL_CODE, since that's what we use as a - marker for the end of the list of candidates. - - * cp-cvt.c (convert_to_aggr): Make sure to always set H_LEN. - -Mon Dec 6 12:49:17 1993 Jason Merrill - - * cp-init.c (get_aggr_from_typedef): New function, like - is_aggr_typedef but returns the _TYPE. - - * cp-call.c, cp-init.c, cp-method.c: Eradicate err_name. - -Sun Dec 5 18:12:48 1993 Brendan Kehoe - - * cp-lex.c (readescape): Pedwarn when a hex escape is out of range. - -Thu Nov 25 23:50:19 1993 Chip Salzenberg - - Delay language context change until beginning of next decl. - - * cp-lex.h (c_header_level): Removed. - (pending_lang_change): Declared. - * cp-lex.c (c_header_level): Renamed from in_c_header, made static. - (pending_lang_change): Defined. - (check_newline): Rework code that recognizes line number and - filename changes. Instead of pushing and popping lang context, - increment and decrement pending_lang_change. - (do_pending_lang_change): Push and pop lang context according - to value of pending_lang_change. - * cp-parse.y (extdefs): Use lang_extdef instead of extdef. - (extdef): Same as extdef, but call do_pending_lang_change() first. - -Mon Nov 15 15:39:15 1993 Chip Salzenberg - - * cp-typeck.c (build_binary_op_nodefault): Warn for ordered - compare of ptr with 0 only if pedantic in both cases. - -Thu Nov 25 13:31:37 1993 Chip Salzenberg - - Reinstate the below patch, which got lost in the Cygnus merge: - Tue Nov 23 13:59:24 1993 Hallvard B Furuseth (hbf@durin.uio.no) - * cp-parse.y (maybe_type_qual): Don't fail to set $$. - -Wed Nov 17 19:03:30 1993 Chip Salzenberg - - * cp-parse.y (attrib): Allow "ident(ident)" like the C front end. - -Fri Oct 22 20:43:37 1993 Paul Eggert - - * cp-lex.c (real_yylex): Diagnose floating point constants - that are too large. - -Wed Nov 17 19:10:37 1993 Chip Salzenberg - - * cp-type2.c (build_functional_cast): ARM page 16: When a class - and an object, function or enumerator are declared in the same - scope with the same name, the class name is hidden. - -Wed Nov 17 19:07:18 1993 Chip Salzenberg - - * cp-call.c (convert_harshness_ansi): Distinguish float, double, - and long double from each other when overloading. - (compute_conversion_costs_{ansi,old}, build_method_call, - build_overlay_call_real, convert_to_aggr): Always set and - always use H_LEN member of candidate structure. - -Mon Oct 11 23:10:53 1993 Chip Salzenberg - - * cp-decl.c (duplicate_decls): Note redeclarations of library - functions, and generate distinct warnings for them. - -Mon Oct 4 12:26:49 1993 Chip Salzenberg - - Support format warnings in G++. - - * cp-tree.h: Protect against multiple inclusion. - Declare all public functions in c-common.c (copy from c-tree.h). - (STDIO_PROTO): Define. - (warn_format): Declare. - (record_format_info): Remove declaration. - * cp-decl.c (init_decl_processing): Call init_function_format_info. - * cp-decl2.c (lang_decode_option): Make "-Wall" include warn_format. - * cp-typeck.c (build_function_call_real): Call check_function_format. - (record_format_info): Remove -- obsolete stub. - -Sat Jul 24 12:04:29 1993 Chip Salzenberg - - * cp-decl.c (duplicate_decls): Don't warn for non-extern var decl - following an extern one (for -Wredundant-decls). - * cp-parse.y (primary): In statement expression case, if compstmt - returns something other than a BLOCK, return it unchanged. - -Thu Dec 2 20:44:58 1993 Chip Salzenberg - - * cp-decl.c (warn_extern_redeclared_static): New function made - from code extracted from pushdecl. - (duplicate_decls, pushdecl): Call new function. - (lookup_name_current_level): Allow for IDENTIFIER_GLOBAL_VALUE - to be a TREE_LIST when function is declared in 'extern "C" {}'. - -Fri Dec 3 16:01:10 1993 Jason Merrill - - * cp-class.c (duplicate_tag_error): Use cp_error. - (finish_base_struct): Check for ambiguity with direct base, and don't - generate op= or copy ctor if it exists. - -Fri Dec 3 15:32:34 1993 Kung Hsu - - * cp-init.c (expand_member_init): when initializer name is null, - don't try to build it now because emit_base_init will handle it. - -Fri Dec 3 12:28:59 1993 Jason Merrill - - * cp-lex.c (init_lex): Initialize input_filename to "" for - code such as ExceptionHandler::operator=. - -Fri Dec 3 10:32:08 1993 Jason Merrill - - * cp-decl.c (grokdeclarator): Don't try to print out dname when - complaining about arrays of references if decl_context==TYPENAME, - since it will be null. - - * cp-decl2.c: Default to flag_ansi_overloading. - -Thu Dec 2 18:05:56 1993 Kung Hsu - - * cp-call.c (build_method_call): use binfo from instance if it's - different from binfo (basetype_path) passed from above. - -Wed Nov 17 19:14:29 1993 Chip Salzenberg - - cp-error.c (dump_expr): Use unsigned chars to output a - TREE_REAL_CST in hex. - -Thu Dec 2 11:05:48 1993 Jason Merrill - - * cp-class.c (finish_struct): Fix typo in setting - cant_synth_asn_ref. - - * cp-tree.h (TYPE_NESTED_NAME): New macro, does - DECL_NESTED_TYPENAME (TYPE_NAME (NODE)). - - * cp-lex.c (default_copy_constructor_body): Change - DECL_NAME (TYPE_NAME (btype)) to TYPE_NESTED_NAME (btype). - (default_assign_ref_body): Likewise. - (default_copy_constructor_body): Call operator= explicitly for - base classes that have no constructor. - -Thu Dec 2 10:47:15 1993 Michael Tiemann - - * cp-call.c (build_method_call): If the instance variable is - converted to error_mark_node when we're trying to convert it to the - base type of a method we're looking up, return error_mark_node. - -Thu Dec 2 10:41:16 1993 Torbjorn Granlund - - * cp-typeck.c (build_binary_op_nodefault): In *_DIV_EXPR *_MOD_EXPR - cases, tests for unsigned operands by peeking inside a NOP_EXPR. - -Wed Dec 1 13:33:34 1993 Brendan Kehoe - - * cp-call.c (compute_conversion_costs_ansi): Use the size of struct - harshness_code, not the size of short, for clearing out the - ansi_harshness. - - * cp-call.c (print_candidates): New function. - (build_method_call): When we had some candidates, but didn't get a - usable match, don't report that we got an error with the first - candidate. Instead, say there were no matches, and list the - candidates with print_candidates. In the second pass, make sure we - clear out ever_seen, so we can accurately count the number of - functions that qualified. - -Wed Dec 1 09:53:59 1993 Torbjorn Granlund - - * cp-typeck.c (build_binary_op_nodefault): Shorten for *_MOD_EXPR - only if op1 is known to be != -1. - (build_binary_op_nodefault): Handle *_DIV_EXPR likewise. - -Tue Nov 30 14:07:26 1993 Brendan Kehoe - - * cp-method.c (hack_identifier): If the field itself is private, and - not from a private base class, say so. - -Mon Nov 29 03:00:56 1993 Jason Merrill - - * cp-decl.c (grokdeclarator): Always warn on initialization of - const member. - -Wed Nov 24 00:49:35 1993 Jason Merrill - - * cp-class.c (finish_struct): Set TYPE_GETS_CONST_* properly. - (finish_base_struct): Set cant_synth_asn_ref properly. - - * cp-lex.c (cons_up_default_function): Add section for operator=. - (default_assign_ref_body): New function, mostly cribbed from - default_copy_constructor_body. - - * cp-class.c (base_info): Add members cant_synth_copy_ctor, - cant_synth_asn_ref, no_const_asn_ref. - (finish_base_struct): Update no_const_asn_ref, note that you should - update cant_synth_*, propagate TYPE_GETS_ASSIGN_REF. - (finish_struct): Add decls for cant_synth_*, no_const_asn_ref, and - initialize them properly. Set no_const_asn_ref properly. Set - cant_synth_* in some of the situations where they should be set. - Propagate TYPE_GETS_ASSIGN_REF. Use cant_synth_copy_ctor. Add call - to cons_up_default_function for operator=. - -Tue Nov 23 20:24:58 1993 Mike Stump - - * cp-cvt.c (convert_force): Add code to perform casting of pointer - to member function types. - * cp-typeck.c (build_ptrmemfunc): Add FORCE parameter to indicate - when the conversion should be done, regardless. - * cp-tree.h (build_ptrmemfunc): Likewise. - * cp-type2.c (digest_init): Likewise. - * cp-typeck.c (convert_for_assignment): Likewise. - -Tue Nov 23 18:06:58 1993 Jason Merrill - - * cp-error.c (dump_expr): Do the right thing for variables of - reference type. - - * cp-decl.c (grok_op_properties): Set TYPE_HAS_ASSIGN_REF - and its kin properly. - (xref_tag): Propagate TYPE_GETS_ASSIGN_REF. - -Tue Nov 23 12:26:13 1993 Mike Stump - - * cp-method.c (build_opfncall): Don't count pointer to member - functions as aggregates here, as we don't want to look up methods in - them. The compiler would core dump if we did, as they don't have - normal names. - * cp-typeck.c (build_indirect_ref): Improve wording on error - message. - -Mon Nov 22 14:22:23 1993 Jason Merrill - - * cp-decl.c (grok_op_properties): Allow operator?: with pedwarn - (since it's supported in other compiler bits). - - * cp-method.c (report_type_mismatch): Use cp_error; ignore err_name - argument. - - * cp-error.c (dump_function_decl): Don't print return type for - constructors and destructors. - - * cp-cvt.c (cp_convert_to_pointer): Import code from - convert_to_pointer so we can return error_mark_node in the case of an - error, and to allow more meaningful error messages. - (build_type_conversion): Don't go through void* when trying - to convert to a pointer type. - - * cp-decl.c (grokfndecl): Move call to grok_op_properties back - after grokclassfn so that it's dealing with the right decl. - (grok_op_properties): Don't assert !methodp for op new and op delete. - - * cp-init.c (build_delete): Don't use TYPE_BUILT_IN (there are now - no uses of it in the compiler). - - * cp-call.c (build_scoped_method_call): Fix for destructors of simple - types. - (build_method_call): Likewise. - -Fri Nov 19 12:59:38 1993 Jason Merrill - - * cp-tree.c (count_functions): Abstraction function. - - * cp-call.c (build_overload_call_real): Deal with new overloading - properly, remove dead code. - - * gcc.c (default_compilers): Generate and use .ii files in the - intermediate stage of compiling C++ source. - -Fri Nov 19 11:26:09 1993 Jim Wilson - - * cp-expr.c (cplus_expand_expr): Make call_target a valid memory - address before using it, so it can be later safely compared. - -Fri Nov 12 15:30:27 1993 Jason Merrill - - * cp-pt.c (tsubst): Deal with new overloading. - - * cp-typeck.c (fntype_p): is the arg function type? - (comp_target_parms): pedwarn on conversion from (anything) to (...). - (build_x_function_call): Deal with new overloading. - - * cp-tree.c (decl_list_length): Deal with new overloading. - (decl_value_member): Like value_member, but for DECL_CHAINs. - - * cp-decl.c (duplicate_decls): Deal with new overloading. - (start_decl): Likewise. - - * cp-class.c (instantiate_type): Deal with new overloading. - - * cp-call.c (convert_harshness_ansi): Deal with new overloading. - (convert_harshness_old): Deal with new overloading. - (build_overload_call_real): Likewise. - -Mon Nov 8 13:50:49 1993 Jason Merrill - - * cp-tree.c (get_unique_fn): New function; returns FUNCTION_DECL - if unambiguous, NULL_TREE otherwise. - (get_first_fn): Returns the first appropriate FUNCTION_DECL. - (is_overloaded_fn): Returns whether or not the passed tree is - a function or list of functions. - - * cp-init.c (init_init_processing): use `get_first_fn' to find - the FUNCTION_DEFN for new and delete. - - * cp-decl.c (push_overloaded_decl): Use new overloading strategy, cut - code size in half (I spit on special cases). - -Tue Sep 7 20:03:33 1993 Jason Merrill - - * cp-decl.c: Allow references and template type parameters as well diff --git a/gcc/cp/ChangeLog.Cygnus b/gcc/cp/ChangeLog.Cygnus deleted file mode 100755 index 6f43ebf..0000000 --- a/gcc/cp/ChangeLog.Cygnus +++ /dev/null @@ -1,93 +0,0 @@ -1999-01-15 Brendan Kehoe - - * typeck2.c (my_friendly_abort): Adjust where to report bugs as a - cygnus-local change. - -Fri Jan 15 12:32:23 1999 Dave Brolley (brolley@cygnus.com) - - * lex.c (lang_init_options): Fix typo: data->opts. - -Tue Oct 27 23:48:33 1998 Jeffrey A Law (law@cygnus.com) - - * lang-specs.h (default_compilers): Remove spurious backslashes. - -Thu Oct 8 11:00:50 1998 Nick Clifton - - * decl.c (duplicate_decls): Remove code to copy data_area - field of struct tree_decl. - -1998-08-27 Benjamin Kosnik - - * decl.c (duplicate_decls): Add DECL_DATA_AREA bits. - - -Thu May 21 10:21:04 EDT 1998 Andrew MacLeod - - * TODO: Updated the exception handling todo list a bit. - -Wed Feb 18 12:18:23 1998 Michael Tiemann - - * inc/new: (__THROW, __nothing): New macros, for making libgcc2 - functionality conditional on -fembedded-cxx. - (operator new*, operator delete*): Change type signatures to be - correct when -fembedded-cxx is specified. - - * new1.cc (operator new): Change `throw' to __THROW, so that file - can be compiled with -fembedded-cxx. Also, don't try to call - `handler' if __EMBEDDED_CXX__ is defined. - * new2.cc (operator new[], operator delete, operator delete []): - Likewise. - - * new.cc (nothrow): Only define if not __EMBEDDED_CXX__. - - * exception.cc: Contents of this file depend on __EMBEDDED_CXX__ - not being defined. - * tinfo2.cc: Ditto. - -Mon Feb 9 17:28:39 EST 1998 Andrew MacLeod - - * TODO: Add new file with G++ todo items. - -Tue Jan 27 12:04:38 1998 Jason Merrill - - * decl2.c (lang_decode_option): -fembedded-cxx implies - -fvtable-thunks. - -Wed Jan 21 10:01:32 1998 Benjamin Kosnik - - * inc/new: Remove orphan C-style end comment. - -1997-10-31 Brendan Kehoe - - * lex.c (embedded_pedwarn): Change its return type to void. - -1997-10-14 Brendan Kehoe - - Compliance with the Embedded C++ language specification. - By default we generate warnings; use -pedantic-errors to turn them - into hard errors. - * decl2.c (flag_embedded_cxx): Define. - (struct lang_f_options): Add -fembedded-cxx. - (lang_decode_option): If -fembedded-cxx, set FLAG_EMBEDDED_CXX, - and clear FLAG_RTTI and FLAG_EXCEPTIONS. - * lang-options.h: Add -fembedded-cxx and -fno-embedded-cxx. - * lang-specs.h: If -fembedded-cxx, define __EMBEDDED_CXX__. - * cp-tree.h (flag_embedded_cxx): Add decl. - * parse.y (base_class_list): Give a pedwarn about inheritance if - FLAG_EMBEDDED_CXX. - (base_class): Likewise for the base_class_access_list case. - - * lex.c (real_yylex): Give pedwarns if FLAG_EMBEDDED_CXX is true and - the token VALUE is any of TRY, CATCH, THROW, TEMPLATE, TYPENAME, - USING, or NAMESPACE. Likewise for DYNAMIC_CAST, STATIC_CAST, - REINTERPRET_CAST, CONST_CAST, or TYPEID. - (embedded_{template,eh,namespace}_error): New global variables to - make us only give a warning/error about each once. - (embedded_pedwarn): New fn to do the actual pedwarn. - * decl.c (grokdeclarator): Give a pedwarn for using mutable. - - * inc/new: Only make the EH stuff appear if !__EMBEDDED_CXX__. - (new, new[]) [__EMBEDDED_CXX__]: For placement versions, take out - the default throw. This particular bit is under discussion with - the EC++ committee currently. - diff --git a/gcc/cp/Make-lang.in b/gcc/cp/Make-lang.in deleted file mode 100755 index bd2e939..0000000 --- a/gcc/cp/Make-lang.in +++ /dev/null @@ -1,317 +0,0 @@ -# Top level makefile fragment for GNU C++. -# Copyright (C) 1994, 1995, 1997, 1998, 1999 Free Software Foundation, Inc. - -#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 -#the Free Software Foundation, 59 Temple Place - Suite 330, -#Boston, MA 02111-1307, USA. - -# This file provides the language dependent support in the main Makefile. -# Each language makefile fragment must provide the following targets: -# -# foo.all.build, foo.all.cross, foo.start.encap, foo.rest.encap, -# foo.info, foo.dvi, -# foo.install-normal, foo.install-common, foo.install-info, foo.install-man, -# foo.uninstall, foo.distdir, -# foo.mostlyclean, foo.clean, foo.distclean, foo.extraclean, -# foo.maintainer-clean, foo.stage1, foo.stage2, foo.stage3, foo.stage4 -# -# where `foo' is the name of the language. -# -# It should also provide rules for: -# -# - making any compiler driver (eg: g++) -# - the compiler proper (eg: cc1plus) -# - define the names for selecting the language in LANGUAGES. -# -# Extra flags to pass to recursive makes. -CXX_FLAGS_TO_PASS = \ - "CXX_FOR_BUILD=$(CXX_FOR_BUILD)" \ - "CXXFLAGS=$(CXXFLAGS)" \ - "CXX_FOR_TARGET=$(CXX_FOR_TARGET)" - -# Actual names to use when installing a native compiler. -CXX_INSTALL_NAME = `t='$(program_transform_name)'; echo c++ | sed $$t` -GXX_INSTALL_NAME = `t='$(program_transform_name)'; echo g++ | sed $$t` -DEMANGLER_INSTALL_NAME = `t='$(program_transform_name)'; echo c++filt | sed $$t` - -# Actual names to use when installing a cross-compiler. -CXX_CROSS_NAME = `t='$(program_transform_cross_name)'; echo c++ | sed $$t` -GXX_CROSS_NAME = `t='$(program_transform_cross_name)'; echo g++ | sed $$t` -DEMANGLER_CROSS_NAME = `t='$(program_transform_cross_name)'; echo c++filt | sed $$t` - -# The name to use for the demangler program. -DEMANGLER_PROG = c++filt$(exeext) - -# Extra headers to install. -CXX_EXTRA_HEADERS = $(srcdir)/cp/inc/typeinfo $(srcdir)/cp/inc/exception \ - $(srcdir)/cp/inc/new $(srcdir)/cp/inc/new.h - -# Extra code to include in libgcc2. -CXX_LIB2FUNCS = tinfo.o tinfo2.o new.o opnew.o opnewnt.o opvnew.o opvnewnt.o \ - opdel.o opdelnt.o opvdel.o opvdelnt.o exception.o -CXX_LIB2SRCS = $(srcdir)/cp/new.cc $(srcdir)/cp/new1.cc $(srcdir)/cp/new2.cc \ - $(srcdir)/cp/exception.cc $(srcdir)/cp/tinfo.cc \ - $(srcdir)/cp/tinfo2.cc $(srcdir)/cp/tinfo.h -# -# Define the names for selecting c++ in LANGUAGES. -# Note that it would be nice to move the dependency on g++ -# into the C++ rule, but that needs a little bit of work -# to do the right thing within all.cross. -C++ c++: cc1plus$(exeext) - -# Tell GNU make to ignore these if they exist. -.PHONY: C++ c++ - -g++.c: $(srcdir)/gcc.c - -rm -f $@ - $(LN_S) $(srcdir)/gcc.c $@ - -g++spec.o: $(srcdir)/cp/g++spec.c - $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(srcdir)/cp/g++spec.c - -# N.B.: This is a copy of the gcc.o rule, with -DLANG_SPECIFIC_DRIVER added. -# It'd be nice if we could find an easier way to do this---rather than have -# to track changes to the toplevel gcc Makefile as well. -# We depend on g++.c last, to make it obvious where it came from. -g++.o: $(CONFIG_H) multilib.h config.status $(lang_specs_files) g++.c \ - system.h prefix.h - $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \ - $(DRIVER_DEFINES) \ - -DLANG_SPECIFIC_DRIVER \ - -c g++.c - -# Create the compiler driver for g++. -g++$(exeext): g++.o g++spec.o version.o choose-temp.o pexecute.o prefix.o mkstemp.o $(LIBDEPS) $(EXTRA_GCC_OBJS) - $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ g++.o g++spec.o prefix.o \ - version.o choose-temp.o pexecute.o mkstemp.o $(EXTRA_GCC_OBJS) $(LIBS) - -# Create a version of the g++ driver which calls the cross-compiler. -g++-cross$(exeext): g++$(exeext) - -rm -f g++-cross$(exeext) - cp g++$(exeext) g++-cross$(exeext) - -cxxmain.o: $(srcdir)/../libiberty/cplus-dem.c $(DEMANGLE_H) - rm -f cxxmain.c - $(LN_S) $(srcdir)/../libiberty/cplus-dem.c cxxmain.c - $(CC) -c -DMAIN $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \ - -DVERSION=\"$(version)\" cxxmain.c - -# Apparently OpenVM needs the -o to be at the beginning of the link line. -$(DEMANGLER_PROG): cxxmain.o underscore.o getopt.o getopt1.o $(LIBDEPS) - $(CC) -o $@ $(ALL_CFLAGS) $(LDFLAGS) \ - cxxmain.o underscore.o getopt.o getopt1.o $(LIBS) - -CXX_SRCS = $(srcdir)/cp/call.c $(srcdir)/cp/decl2.c \ - $(srcdir)/cp/except.c $(srcdir)/cp/input.c $(srcdir)/cp/pt.c \ - $(srcdir)/cp/spew.c $(srcdir)/cp/xref.c $(srcdir)/cp/class.c \ - $(srcdir)/cp/expr.c $(srcdir)/cp/lex.c \ - $(srcdir)/cp/ptree.c $(srcdir)/cp/tree.c $(srcdir)/cp/cvt.c \ - $(srcdir)/cp/errfn.c $(srcdir)/cp/rtti.c $(srcdir)/cp/method.c \ - $(srcdir)/cp/search.c $(srcdir)/cp/typeck.c $(srcdir)/cp/decl.c \ - $(srcdir)/cp/error.c $(srcdir)/cp/friend.c $(srcdir)/cp/init.c \ - $(srcdir)/cp/parse.y $(srcdir)/cp/sig.c $(srcdir)/cp/typeck2.c \ - $(srcdir)/cp/repo.c $(srcdir)/cp/semantics.c - -cc1plus$(exeext): $(P) $(CXX_SRCS) $(LIBDEPS) stamp-objlist c-common.o c-pragma.o \ - $(srcdir)/cp/cp-tree.h $(srcdir)/cp/cp-tree.def hash.o - cd cp; $(MAKE) $(FLAGS_TO_PASS) $(CXX_FLAGS_TO_PASS) ../cc1plus$(exeext) -# -# Build hooks: - -c++.all.build: g++$(exeext) -c++.all.cross: g++-cross$(exeext) $(DEMANGLER_PROG) -c++.start.encap: g++$(exeext) -c++.rest.encap: $(DEMANGLER_PROG) - -c++.info: -c++.dvi: - -# C++ language-support library pieces for libgcc. -tinfo.o: cc1plus$(exeext) $(srcdir)/cp/tinfo.cc - $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(CXXFLAGS) $(INCLUDES) \ - -c $(srcdir)/cp/tinfo.cc -tinfo2.o: cc1plus$(exeext) $(srcdir)/cp/tinfo2.cc - $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(CXXFLAGS) $(INCLUDES) \ - -c $(srcdir)/cp/tinfo2.cc -exception.o: cc1plus$(exeext) $(srcdir)/cp/exception.cc - $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(CXXFLAGS) $(INCLUDES) \ - -c -fexceptions $(srcdir)/cp/exception.cc -new.o: cc1plus$(exeext) $(srcdir)/cp/new.cc - $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(CXXFLAGS) $(INCLUDES) \ - -c $(srcdir)/cp/new.cc -opnew.o: cc1plus$(exeext) $(srcdir)/cp/new1.cc - $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(CXXFLAGS) $(INCLUDES) \ - -c $(srcdir)/cp/new1.cc -DL_op_new -o opnew.o -opnewnt.o: cc1plus$(exeext) $(srcdir)/cp/new1.cc - $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(CXXFLAGS) $(INCLUDES) \ - -c $(srcdir)/cp/new1.cc -DL_op_newnt -o opnewnt.o -opvnew.o: cc1plus$(exeext) $(srcdir)/cp/new2.cc - $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(CXXFLAGS) $(INCLUDES) \ - -c $(srcdir)/cp/new2.cc -DL_op_vnew -o opvnew.o -opvnewnt.o: cc1plus$(exeext) $(srcdir)/cp/new2.cc - $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(CXXFLAGS) $(INCLUDES) \ - -c $(srcdir)/cp/new2.cc -DL_op_vnewnt -o opvnewnt.o -opdel.o: cc1plus$(exeext) $(srcdir)/cp/new2.cc - $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(CXXFLAGS) $(INCLUDES) \ - -c $(srcdir)/cp/new2.cc -DL_op_delete -o opdel.o -opdelnt.o: cc1plus$(exeext) $(srcdir)/cp/new2.cc - $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(CXXFLAGS) $(INCLUDES) \ - -c $(srcdir)/cp/new2.cc -DL_op_delnt -o opdelnt.o -opvdel.o: cc1plus$(exeext) $(srcdir)/cp/new2.cc - $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(CXXFLAGS) $(INCLUDES) \ - -c $(srcdir)/cp/new2.cc -DL_op_vdel -o opvdel.o -opvdelnt.o: cc1plus$(exeext) $(srcdir)/cp/new2.cc - $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(CXXFLAGS) $(INCLUDES) \ - -c $(srcdir)/cp/new2.cc -DL_op_vdelnt -o opvdelnt.o - -# We want to update cplib2.txt if any of the source files change... -cplib2.txt: $(CXX_LIB2SRCS) $(CXX_EXTRA_HEADERS) cplib2.ready - case " $(LANGUAGES) " in \ - *" "[cC]"++ "*) \ - echo $(CXX_LIB2FUNCS) > cplib2.new;; \ - *) \ - echo "" > cplib2.new;; \ - esac - mv -f cplib2.new cplib2.txt - -# Or if it would be different. -cplib2.ready: $(GCC_PASSES) $(LANGUAGES) $(LIBGCC2_DEPS) stmp-int-hdrs - @if [ -r cplib2.txt ]; then \ - case " $(LANGUAGES) " in \ - *" "[cC]"++ "*) \ - echo $(CXX_LIB2FUNCS) > cplib2.new;; \ - *) \ - echo "" > cplib2.new;; \ - esac; \ - if cmp -s cplib2.new cplib2.txt; then true; else \ - touch cplib2.ready; \ - fi; \ - rm -f cplib2.new; \ - else true ; \ - fi - @if [ -f cplib2.ready ]; then true; else \ - touch cplib2.ready; \ - fi -# -# Install hooks: -# cc1plus is installed elsewhere as part of $(COMPILERS). - -# Nothing to do here. -c++.install-normal: - -# Install the driver program as $(target)-g++ -# and also as either g++ (if native) or $(tooldir)/bin/g++. -c++.install-common: - -if [ -f cc1plus$(exeext) ] ; then \ - if [ -f g++-cross$(exeext) ] ; then \ - rm -f $(bindir)/$(GXX_CROSS_NAME)$(exeext); \ - $(INSTALL_PROGRAM) g++-cross$(exeext) $(bindir)/$(GXX_CROSS_NAME)$(exeext); \ - chmod a+x $(bindir)/$(GXX_CROSS_NAME)$(exeext); \ - rm -f $(bindir)/$(CXX_CROSS_NAME)$(exeext); \ - $(LN) $(bindir)/$(GXX_CROSS_NAME)$(exeext) $(bindir)/$(CXX_CROSS_NAME)$(exeext); \ - else \ - rm -f $(bindir)/$(GXX_INSTALL_NAME)$(exeext); \ - $(INSTALL_PROGRAM) g++$(exeext) $(bindir)/$(GXX_INSTALL_NAME)$(exeext); \ - chmod a+x $(bindir)/$(GXX_INSTALL_NAME)$(exeext); \ - rm -f $(bindir)/$(CXX_INSTALL_NAME)$(exeext); \ - $(LN) $(bindir)/$(GXX_INSTALL_NAME)$(exeext) $(bindir)/$(CXX_INSTALL_NAME)$(exeext); \ - fi ; \ - if [ x$(DEMANGLER_PROG) != x ] && [ -x "$(DEMANGLER_PROG)" ]; then \ - if [ -f g++-cross$(exeext) ] ; then \ - rm -f $(bindir)/$(DEMANGLER_CROSS_NAME)$(exeext); \ - $(INSTALL_PROGRAM) $(DEMANGLER_PROG) $(bindir)/$(DEMANGLER_CROSS_NAME)$(exeext); \ - chmod a+x $(bindir)/$(DEMANGLER_CROSS_NAME)$(exeext); \ - else \ - rm -f $(bindir)/$(DEMANGLER_INSTALL_NAME)$(exeext); \ - $(INSTALL_PROGRAM) $(DEMANGLER_PROG) $(bindir)/$(DEMANGLER_INSTALL_NAME)$(exeext); \ - chmod a+x $(bindir)/$(DEMANGLER_INSTALL_NAME)$(exeext); \ - fi ; \ - fi ; \ - fi - -c++.install-info: - -c++.install-man: $(srcdir)/cp/g++.1 - -if [ -f cc1plus$(exeext) ] ; then \ - if [ -f g++-cross$(exeext) ] ; then \ - rm -f $(man1dir)/$(GXX_CROSS_NAME)$(manext); \ - $(INSTALL_DATA) $(srcdir)/cp/g++.1 $(man1dir)/$(GXX_CROSS_NAME)$(manext); \ - chmod a-x $(man1dir)/$(GXX_CROSS_NAME)$(manext); \ - else \ - rm -f $(man1dir)/$(GXX_INSTALL_NAME)$(manext); \ - $(INSTALL_DATA) $(srcdir)/cp/g++.1 $(man1dir)/$(GXX_INSTALL_NAME)$(manext); \ - chmod a-x $(man1dir)/$(GXX_INSTALL_NAME)$(manext); \ - fi; \ - else true; fi - -c++.uninstall: - -rm -rf $(bindir)/$(CXX_INSTALL_NAME)$(exeext) - -rm -rf $(bindir)/$(CXX_CROSS_NAME)$(exeext) - -rm -rf $(bindir)/$(GXX_INSTALL_NAME)$(exeext) - -rm -rf $(bindir)/$(GXX_CROSS_NAME)$(exeext) - -rm -rf $(bindir)/$(DEMANGLER_INSTALL_NAME)$(exeext) - -rm -rf $(bindir)/$(DEMANGLER_CROSS_NAME)$(exeext) - -rm -rf $(man1dir)/$(GXX_INSTALL_NAME)$(manext) - -rm -rf $(man1dir)/$(GXX_CROSS_NAME)$(manext) -# -# Clean hooks: -# A lot of the ancillary files are deleted by the main makefile. -# We just have to delete files specific to us. - -c++.mostlyclean: - -rm -f cp/*$(objext) $(DEMANGLER_PROG) -# CYGNUS LOCAL - Delete these files here instead of in realclean because they -# are now created in the build subdirectories. - -rm -f cp/parse.c cp/parse.h cp/parse.output cp/y.tab.c -c++.clean: - -rm -f cplib2.txt cplib2.ready -c++.distclean: - -rm -f cp/config.status cp/Makefile - -rm -f cp/parse.output - -rm -f g++.c -c++.extraclean: -c++.maintainer-clean: - -rm -f cp/parse.c cp/parse.h -# -# Stage hooks: -# The main makefile has already created stage?/cp. - -c++.stage1: stage1-start - -mv cp/*$(objext) stage1/cp -c++.stage2: stage2-start - -mv cp/*$(objext) stage2/cp -c++.stage3: stage3-start - -mv cp/*$(objext) stage3/cp -c++.stage4: stage4-start - -mv cp/*$(objext) stage4/cp -# -# Maintenance hooks: - -# This target creates the files that can be rebuilt, but go in the -# distribution anyway. It then copies the files to the distdir directory. -c++.distdir: - mkdir tmp/cp - mkdir tmp/cp/inc - cd cp ; $(MAKE) $(FLAGS_TO_PASS) $(CXX_FLAGS_TO_PASS) parse.c hash.h - cd cp; \ - for file in *[0-9a-zA-Z+]; do \ - $(LN) $$file ../tmp/cp; \ - done - cd cp/inc; \ - for file in *[0-9a-zA-Z+]; do \ - ln $$file ../../tmp/cp/inc >/dev/null 2>&1 \ - || cp $$file ../../tmp/cp/inc; \ - done diff --git a/gcc/cp/Makefile.in b/gcc/cp/Makefile.in deleted file mode 100755 index 6d0f450..0000000 --- a/gcc/cp/Makefile.in +++ /dev/null @@ -1,343 +0,0 @@ -# Makefile for GNU C++ compiler. -# Copyright (C) 1987, 88, 90-5, 1998 Free Software Foundation, Inc. - -#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 -#the Free Software Foundation, 59 Temple Place - Suite 330, -#Boston, MA 02111-1307, USA. - -# The makefile built from this file lives in the language subdirectory. -# Its purpose is to provide support for: -# -# 1) recursion where necessary, and only then (building .o's), and -# 2) building and debugging cc1 from the language subdirectory, and -# 3) nothing else. -# -# The parent makefile handles all other chores, with help from the -# language makefile fragment, of course. -# -# The targets for external use are: -# all, TAGS, ???mostlyclean, ???clean. - -# Suppress smart makes who think they know how to automake Yacc files -.y.c: - -# It defines the c++ interface name. It should be changed when the -# c++ interface is changed. -INTERFACE = 1 - -# Variables that exist for you to override. -# See below for how to change them for certain systems. - -ALLOCA = - -# Various ways of specifying flags for compilations: -# CFLAGS is for the user to override to, e.g., do a bootstrap with -O2. -# BOOT_CFLAGS is the value of CFLAGS to pass -# to the stage2 and stage3 compilations -# XCFLAGS is used for most compilations but not when using the GCC just built. -XCFLAGS = -CFLAGS = -g -BOOT_CFLAGS = -O $(CFLAGS) -# These exists to be overridden by the x-* and t-* files, respectively. -X_CFLAGS = -T_CFLAGS = - -X_CPPFLAGS = -T_CPPFLAGS = - -CC = @CC@ -BISON = `if [ -f ../../bison/bison ] ; then echo ../../bison/bison -L $(srcdir)/../../bison/ ; else echo bison ; fi` -BISONFLAGS = -LEX = `if [ -f ../../flex/flex ] ; then echo ../../flex/flex ; else echo flex ; fi` -LEXFLAGS = -AR = ar -AR_FLAGS = rc -SHELL = /bin/sh -MAKEINFO = makeinfo -TEXI2DVI = texi2dvi - -# Define this as & to perform parallel make on a Sequent. -# Note that this has some bugs, and it seems currently necessary -# to compile all the gen* files first by hand to avoid erroneous results. -P = - -# This is used in the definition of SUBDIR_USE_ALLOCA. -# ??? Perhaps it would be better if it just looked for *gcc*. -OLDCC = cc - -# This is used instead of ALL_CFLAGS when compiling with GCC_FOR_TARGET. -# It omits XCFLAGS, and specifies -B./. -# It also specifies -B$(tooldir)/ to find as and ld for a cross compiler. -GCC_CFLAGS=$(INTERNAL_CFLAGS) $(X_CFLAGS) $(T_CFLAGS) $(CFLAGS) - -# Tools to use when building a cross-compiler. -# These are used because `configure' appends `cross-make' -# to the makefile when making a cross-compiler. - -# We don't use cross-make. Instead we use the tools -# from the build tree, if they are available. -# program_transform_name and objdir are set by configure.in. -program_transform_name = -objdir = . - -target=@target@ -xmake_file=@dep_host_xmake_file@ -tmake_file=@dep_tmake_file@ -#version=`sed -e 's/.*\"\([^ \"]*\)[ \"].*/\1/' < $(srcdir)/version.c` -#mainversion=`sed -e 's/.*\"\([0-9]*\.[0-9]*\).*/\1/' < $(srcdir)/version.c` - -# Directory where sources are, from where we are. -srcdir = @srcdir@ -VPATH = @srcdir@ - -# Additional system libraries to link with. -CLIB= - -# Change this to a null string if obstacks are installed in the -# system library. -OBSTACK=obstack.o - -# Choose the real default target. -ALL=all - -# End of variables for you to override. - -# Definition of `all' is here so that new rules inserted by sed -# do not specify the default target. -all: all.indirect - -# This tells GNU Make version 3 not to put all variables in the environment. -.NOEXPORT: - -# sed inserts variable overrides after the following line. -####target overrides -@target_overrides@ -####host overrides -@host_overrides@ -####cross overrides -@cross_defines@ -@cross_overrides@ -####build overrides -@build_overrides@ - -# CYGNUS LOCAL --site -####site overrides -# END CYGNUS LOCAL -# -# Now figure out from those variables how to compile and link. - -all.indirect: Makefile ../cc1plus$(exeext) - -# IN_GCC tells obstack.h that we are using gcc's file. -INTERNAL_CFLAGS = $(CROSS) -DIN_GCC @extra_c_flags@ - -# This is the variable actually used when we compile. -ALL_CFLAGS = $(INTERNAL_CFLAGS) $(X_CFLAGS) $(T_CFLAGS) $(CFLAGS) $(XCFLAGS) - -# Likewise. -ALL_CPPFLAGS = $(CPPFLAGS) $(X_CPPFLAGS) $(T_CPPFLAGS) - -# CYGNUS LOCAL: SUBDIR_USE_ALLOCA is different from FSF. -# Even if ALLOCA is set, don't use it if compiling with GCC. - -SUBDIR_OBSTACK = `if [ x$(OBSTACK) != x ]; then echo ../$(OBSTACK); else true; fi` -#SUBDIR_USE_ALLOCA = `case "${CC}" in "${OLDCC}") if [ x$(ALLOCA) != x ]; then echo ../$(ALLOCA); else true; fi ;; esac` -SUBDIR_USE_ALLOCA = `if [ x$(ALLOCA) != x ]; then echo ../$(ALLOCA); else true; fi` -SUBDIR_MALLOC = `if [ x$(MALLOC) != x ]; then echo ../$(MALLOC); else true; fi` - -# How to link with both our special library facilities -# and the system's installed libraries. -LIBS = $(SUBDIR_OBSTACK) $(SUBDIR_USE_ALLOCA) $(SUBDIR_MALLOC) $(CLIB) - -# Specify the directories to be searched for header files. -# Both . and srcdir are used, in that order, -# so that tm.h and config.h will be found in the compilation -# subdirectory rather than in the source directory. -INCLUDES = -I. -I.. -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../config -I$(srcdir)/../../include - -# Always use -I$(srcdir)/config when compiling. -.c.o: - $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $< - -# The only suffixes we want for implicit rules are .c and .o. -.SUFFIXES: -.SUFFIXES: .c .o - -# This tells GNU make version 3 not to export all the variables -# defined in this file into the environment. -.NOEXPORT: -# -# Lists of files for various purposes. - -# Language-specific object files for g++ - -CXX_OBJS = call.o decl.o errfn.o expr.o pt.o sig.o typeck2.o \ - class.o decl2.o error.o lex.o parse.o ptree.o rtti.o spew.o typeck.o cvt.o \ - except.o friend.o init.o method.o search.o semantics.o tree.o xref.o \ - repo.o @extra_cxx_objs@ - -# Language-independent object files. -OBJS = `cat ../stamp-objlist` ../c-common.o ../c-pragma.o ../hash.o -OBJDEPS = ../stamp-objlist ../c-common.o ../c-pragma.o ../hash.o - -compiler: ../cc1plus$(exeext) -../cc1plus$(exeext): $(P) $(OBJDEPS) $(CXX_OBJS) $(LIBDEPS) - $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(CXX_OBJS) $(LIBS) - -Makefile: $(srcdir)/Makefile.in $(srcdir)/../configure - cd ..; $(SHELL) config.status - -native: config.status ../cc1plus$(exeext) -# -# Compiling object files from source files. - -# Note that dependencies on obstack.h are not written -# because that file is not part of GCC. - -# C++ language specific files. - -RTL_H = $(srcdir)/../rtl.h $(srcdir)/../rtl.def \ - $(srcdir)/../machmode.h $(srcdir)/../machmode.def -TREE_H = $(srcdir)/../tree.h $(srcdir)/../real.h $(srcdir)/../tree.def \ - $(srcdir)/../machmode.h $(srcdir)/../machmode.def -CXX_TREE_H = $(TREE_H) cp-tree.h cp-tree.def -EXPR_H = $(srcdir)/../expr.h ../insn-codes.h -# CYGNUS LOCAL: We build parse.[ch] in the build directory. -PARSE_H = parse.h -PARSE_C = parse.c - -parse.o : $(PARSE_C) $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h lex.h \ - $(srcdir)/../except.h $(srcdir)/../output.h $(srcdir)/../system.h \ - $(srcdir)/../toplev.h - $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(BIG_SWITCHFLAG) \ - `echo $(PARSE_C) | sed 's,^\./,,'` - -CONFLICTS = expect 36 shift/reduce conflicts and 42 reduce/reduce conflicts. -# CYGNUS LOCAL build in build tree -$(PARSE_H) : $(PARSE_C) -$(PARSE_C) : $(srcdir)/parse.y - @echo $(CONFLICTS) - $(BISON) $(BISONFLAGS) -d -o $(PARSE_C) $(srcdir)/parse.y - grep '^#define[ ]*YYEMPTY' $(PARSE_C) >>$(PARSE_H) -# END CYGNUS LOCAL - -# We used to try to protect people from having to rerun gperf. But, -# the C front-end already requires this if c-parse.gperf is changed, -# so we should be consistent. -$(srcdir)/hash.h: $(srcdir)/gxx.gperf - gperf -L KR-C -F ', 0, 0' -p -j1 -g -o -t -N is_reserved_word \ - '-k1,4,7,$$' $(srcdir)/gxx.gperf >$(srcdir)/hash.h - -spew.o : spew.c $(CONFIG_H) $(CXX_TREE_H) $(PARSE_H) $(srcdir)/../flags.h \ - lex.h $(srcdir)/../system.h $(srcdir)/../toplev.h -lex.o : lex.c $(CONFIG_H) $(CXX_TREE_H) \ - $(PARSE_H) input.c $(srcdir)/../flags.h hash.h lex.h \ - $(srcdir)/../c-pragma.h $(srcdir)/../system.h $(srcdir)/../toplev.h \ - $(srcdir)/../output.h $(srcdir)/../mbchar.h -decl.o : decl.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h \ - lex.h decl.h $(srcdir)/../stack.h $(srcdir)/../output.h \ - $(srcdir)/../except.h $(srcdir)/../system.h $(srcdir)/../toplev.h \ - $(srcdir)/../hash.h -decl2.o : decl2.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h \ - lex.h decl.h $(EXPR_H) $(srcdir)/../except.h \ - $(srcdir)/../output.h $(srcdir)/../except.h $(srcdir)/../system.h \ - $(srcdir)/../toplev.h $(srcdir)/../dwarf2out.h $(srcdir)/../dwarfout.h -typeck2.o : typeck2.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h \ - $(srcdir)/../system.h $(srcdir)/../toplev.h -typeck.o : typeck.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h $(RTL_H) \ - $(EXPR_H) $(srcdir)/../system.h $(srcdir)/../toplev.h -class.o : class.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h \ - $(srcdir)/../system.h $(srcdir)/../toplev.h -call.o : call.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h \ - $(srcdir)/../system.h $(srcdir)/../toplev.h -friend.o : friend.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h $(RTL_H) \ - $(srcdir)/../system.h $(srcdir)/../toplev.h -init.o : init.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h $(RTL_H) \ - $(EXPR_H) $(srcdir)/../system.h $(srcdir)/../toplev.h -method.o : method.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../system.h \ - $(srcdir)/../toplev.h -cvt.o : cvt.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../system.h decl.h \ - $(srcdir)/../flags.h $(srcdir)/../toplev.h $(srcdir)/../convert.h -search.o : search.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../stack.h \ - $(srcdir)/../flags.h $(srcdir)/../system.h $(srcdir)/../toplev.h -tree.o : tree.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h \ - $(srcdir)/../system.h $(srcdir)/../toplev.h -ptree.o : ptree.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../system.h -rtti.o : rtti.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h \ - $(srcdir)/../system.h $(srcdir)/../toplev.h -except.o : except.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h $(RTL_H) \ - $(srcdir)/../except.h $(srcdir)/../system.h $(srcdir)/../toplev.h -expr.o : expr.c $(CONFIG_H) $(CXX_TREE_H) $(RTL_H) $(srcdir)/../flags.h \ - $(EXPR_H) $(srcdir)/../system.h $(srcdir)/../toplev.h -xref.o : xref.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../input.h \ - $(srcdir)/../system.h $(srcdir)/../toplev.h -pt.o : pt.c $(CONFIG_H) $(CXX_TREE_H) decl.h $(PARSE_H) lex.h \ - $(srcdir)/../system.h $(srcdir)/../toplev.h -error.o : error.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../system.h \ - $(srcdir)/../toplev.h -errfn.o : errfn.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../system.h \ - $(srcdir)/../toplev.h -sig.o : sig.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h \ - $(srcdir)/../system.h $(srcdir)/../toplev.h -repo.o : repo.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../system.h \ - $(srcdir)/../toplev.h -semantics.o: semantics.c $(CONFIG_H) $(CXX_TREE_H) lex.h \ - $(srcdir)/../except.h $(srcdir)/../system.h $(srcdir)/../toplev.h - - -# -# These exist for maintenance purposes. - -# Update the tags table. -TAGS: force - cd $(srcdir) ; \ - etags *.c *.h ; \ - echo 'l' | tr 'l' '\f' >> TAGS ; \ - echo 'parse.y,0' >> TAGS ; \ - etags -a ../*.h ../*.c; - -.PHONY: TAGS - -force: - -g++FAQ.info: $(srcdir)/g++FAQ.texi - $(MAKEINFO) --no-split -o ./g++FAQ.info $(srcdir)/g++FAQ.texi - -# Preprocess the texi file so that the final document will have -# hyperlinks. -# It would be nice if texi2html could do something like this itself. - -# Assumption 1: the FAQ puts all http: and ftp: links in a @file{...}. -# Assumption 2: newsgroups are like @file{comp.foo} -# Assumption 3: email addresses match the regexp shown. - -g++FAQ.html: $(srcdir)/g++FAQ.texi - mkdir work - sed -e 's?@file{\([fth]*p://[^}]*\)}?@strong{\1}?' \ - -e 's?@file{\(comp\.[-a-z+.]*\)}?\1?' \ - -e 's?@file{\(gnu\.[-a-z+.]*\)}?\1?' \ - -e 's?\([.+a-zA-Z0-9-]*@@[.a-zA-Z0-9-]*[a-zA-Z0-9]\)?\1?' \ - $(srcdir)/g++FAQ.texi > work/g++FAQ.texi - cd work; texi2html g++FAQ.texi - mv work/*.html . - rm -r work - -# Make plain-text form. - -g++FAQ.txt: $(srcdir)/g++FAQ.texi - $(MAKEINFO) --no-split --no-headers -o - $(srcdir)/g++FAQ.texi |\ - sed '/^Concept Index/,$$d' > g++FAQ.txt - diff --git a/gcc/cp/NEWS b/gcc/cp/NEWS deleted file mode 100755 index 0cdcc22..0000000 --- a/gcc/cp/NEWS +++ /dev/null @@ -1,232 +0,0 @@ -*** Changes since EGCS 1.1: - -* Messages about non-conformant code that we can still handle ("pedwarns") - are now errors by default, rather than warnings. This can be reverted - with -fpermissive, and is overridden by -pedantic or -pedantic-errors. - -*** Changes in EGCS 1.1: - -* Namespaces are fully supported. The library has not yet been converted - to use namespace std, however, and the old std-faking code is still on by - default. To turn it off, you can use -fhonor-std. - -* Massive template improvements: - + member template classes are supported. - + template friends are supported. - + template template parameters are supported. - + local classes in templates are supported. - + lots of bugs fixed. - -* operator new now throws bad_alloc where appropriate. - -* Exception handling is now thread safe, and supports nested exceptions and - placement delete. Exception handling overhead on x86 is much lower with - GNU as 2.9. - -* protected virtual inheritance is now supported. - -* Loops are optimized better; we now move the test to the end in most - cases, like the C frontend does. - -* For class D derived from B which has a member 'int i', &D::i is now of - type 'int B::*' instead of 'int D::*'. - -* An _experimental_ new ABI for g++ can be turned on with -fnew-abi. The - current features of this are more efficient allocation of base classes - (including the empty base optimization), and more compact mangling of C++ - symbol names (which can be turned on separately with -fsquangle). This - ABI is subject to change without notice, so don't use it for anything - that you don't want to rebuild with every release of the compiler. - - As with all ABI-changing flags, this flag is for experts only, as all - code (including the library code in libgcc and libstdc++) must be - compiled with the same ABI. - -*** Changes in EGCS 1.0: - -* A public review copy of the December 1996 Draft of the ISO/ANSI C++ - standard is now available. See - - http://www.cygnus.com/misc/wp/ - - for more information. - -* g++ now uses a new implementation of templates. The basic idea is that - now templates are minimally parsed when seen and then expanded later. - This allows conformant early name binding and instantiation controls, - since instantiations no longer have to go through the parser. - - What you get: - - + Inlining of template functions works without any extra effort or - modifications. - + Instantiations of class templates and methods defined in the class - body are deferred until they are actually needed (unless - -fexternal-templates is specified). - + Nested types in class templates work. - + Static data member templates work. - + Member function templates are now supported. - + Partial specialization of class templates is now supported. - + Explicit specification of template parameters to function templates - is now supported. - - Things you may need to fix in your code: - - + Syntax errors in templates that are never instantiated will now be - diagnosed. - + Types and class templates used in templates must be declared - first, or the compiler will assume they are not types, and fail. - + Similarly, nested types of template type parameters must be tagged - with the 'typename' keyword, except in base lists. In many cases, - but not all, the compiler will tell you where you need to add - 'typename'. For more information, see - - http://www.cygnus.com/misc/wp/dec96pub/template.html#temp.res - - + Guiding declarations are no longer supported. Function declarations, - including friend declarations, do not refer to template instantiations. - You can restore the old behavior with -fguiding-decls until you fix - your code. - - Other features: - - + Default function arguments in templates will not be evaluated (or - checked for semantic validity) unless they are needed. Default - arguments in class bodies will not be parsed until the class - definition is complete. - + The -ftemplate-depth-NN flag can be used to increase the maximum - recursive template instantiation depth, which defaults to 17. If you - need to use this flag, the compiler will tell you. - + Explicit instantiation of template constructors and destructors is - now supported. For instance: - - template A::A(const A&); - - Still not supported: - - + Member class templates. - + Template friends. - -* Exception handling support has been significantly improved and is on by - default. The compiler supports two mechanisms for walking back up the - call stack; one relies on static information about how registers are - saved, and causes no runtime overhead for code that does not throw - exceptions. The other mechanism uses setjmp and longjmp equivalents, and - can result in quite a bit of runtime overhead. You can determine which - mechanism is the default for your target by compiling a testcase that - uses exceptions and doing an 'nm' on the object file; if it uses __throw, - it's using the first mechanism. If it uses __sjthrow, it's using the - second. - - You can turn EH support off with -fno-exceptions. - -* RTTI support has been rewritten to work properly and is now on by default. - This means code that uses virtual functions will have a modest space - overhead. You can use the -fno-rtti flag to disable RTTI support. - -* On ELF systems, duplicate copies of symbols with 'initialized common' - linkage (such as template instantiations, vtables, and extern inlines) - will now be discarded by the GNU linker, so you don't need to use -frepo. - This support requires GNU ld from binutils 2.8 or later. - -* The overload resolution code has been rewritten to conform to the latest - C++ Working Paper. Built-in operators are now considered as candidates - in operator overload resolution. Function template overloading chooses - the more specialized template, and handles base classes in type deduction - and guiding declarations properly. In this release the old code can - still be selected with -fno-ansi-overloading, although this is not - supported and will be removed in a future release. - -* Standard usage syntax for the std namespace is supported; std is treated - as an alias for global scope. General namespaces are still not supported. - -* New flags: - - + New warning -Wno-pmf-conversion (don't warn about - converting from a bound member function pointer to function - pointer). - - + A flag -Weffc++ has been added for violations of some of the style - guidelines in Scott Meyers' _Effective C++_ books. - - + -Woverloaded-virtual now warns if a virtual function in a base - class is hidden in a derived class, rather than warning about - virtual functions being overloaded (even if all of the inherited - signatures are overridden) as it did before. - - + -Wall no longer implies -W. The new warning flag, -Wsign-compare, - included in -Wall, warns about dangerous comparisons of signed and - unsigned values. Only the flag is new; it was previously part of - -W. - - + The new flag, -fno-weak, disables the use of weak symbols. - -* Synthesized methods are now emitted in any translation units that need - an out-of-line copy. They are no longer affected by #pragma interface - or #pragma implementation. - -* __FUNCTION__ and __PRETTY_FUNCTION__ are now treated as variables by the - parser; previously they were treated as string constants. So code like - `printf (__FUNCTION__ ": foo")' must be rewritten to - `printf ("%s: foo", __FUNCTION__)'. This is necessary for templates. - -* local static variables in extern inline functions will be shared between - translation units. - -* -fvtable-thunks is supported for all targets, and is the default for - Linux with glibc 2.x (also called libc 6.x). - -* bool is now always the same size as another built-in type. Previously, - a 64-bit RISC target using a 32-bit ABI would have 32-bit pointers and a - 64-bit bool. This should only affect Irix 6, which was not supported in - 2.7.2. - -* new (nothrow) is now supported. - -* Synthesized destructors are no longer made virtual just because the class - already has virtual functions, only if they override a virtual destructor - in a base class. The compiler will warn if this affects your code. - -* The g++ driver now only links against libstdc++, not libg++; it is - functionally identical to the c++ driver. - -* (void *)0 is no longer considered a null pointer constant; NULL in - is now defined as __null, a magic constant of type (void *) - normally, or (size_t) with -ansi. - -* The name of a class is now implicitly declared in its own scope; A::A - refers to A. - -* Local classes are now supported. - -* __attribute__ can now be attached to types as well as declarations. - -* The compiler no longer emits a warning if an ellipsis is used as a - function's argument list. - -* Definition of nested types outside of their containing class is now - supported. For instance: - - struct A { - struct B; - B* bp; - }; - - struct A::B { - int member; - }; - -* On the HPPA, some classes that do not define a copy constructor - will be passed and returned in memory again so that functions - returning those types can be inlined. - -*** The g++ team thanks everyone that contributed to this release, - but especially: - -* Joe Buck , the maintainer of the g++ FAQ. -* Brendan Kehoe , who coordinates testing of g++. -* Jason Merrill , the g++ maintainer. -* Mark Mitchell , who implemented member function - templates and explicit qualification of function templates. -* Mike Stump , the previous g++ maintainer, who did most of - the exception handling work. diff --git a/gcc/cp/call.c b/gcc/cp/call.c deleted file mode 100755 index c478a50..0000000 --- a/gcc/cp/call.c +++ /dev/null @@ -1,4515 +0,0 @@ -/* Functions related to invoking methods and overloaded functions. - Copyright (C) 1987, 92-97, 1998, 1999 Free Software Foundation, Inc. - Contributed by Michael Tiemann (tiemann@cygnus.com) and - modified by Brendan Kehoe (brendan@cygnus.com). - -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 -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - - -/* High-level class interface. */ - -#include "config.h" -#include "system.h" -#include "tree.h" -#include "cp-tree.h" -#include "output.h" -#include "flags.h" -#include "rtl.h" -#include "toplev.h" - -#include "obstack.h" -#define obstack_chunk_alloc xmalloc -#define obstack_chunk_free free - -extern int inhibit_warnings; -extern tree ctor_label, dtor_label; - -static tree build_new_method_call PROTO((tree, tree, tree, tree, int)); - -static tree build_field_call PROTO((tree, tree, tree, tree)); -static tree find_scoped_type PROTO((tree, tree, tree)); -static struct z_candidate * tourney PROTO((struct z_candidate *)); -static int joust PROTO((struct z_candidate *, struct z_candidate *, int)); -static int compare_ics PROTO((tree, tree)); -static tree build_over_call PROTO((struct z_candidate *, tree, int)); -static tree convert_like PROTO((tree, tree)); -static void op_error PROTO((enum tree_code, enum tree_code, tree, tree, - tree, char *)); -static tree build_object_call PROTO((tree, tree)); -static tree resolve_args PROTO((tree)); -static struct z_candidate * build_user_type_conversion_1 - PROTO ((tree, tree, int)); -static void print_z_candidates PROTO((struct z_candidate *)); -static tree build_this PROTO((tree)); -static struct z_candidate * splice_viable PROTO((struct z_candidate *)); -static int any_viable PROTO((struct z_candidate *)); -static struct z_candidate * add_template_candidate - PROTO((struct z_candidate *, tree, tree, tree, tree, int, - unification_kind_t)); -static struct z_candidate * add_template_candidate_real - PROTO((struct z_candidate *, tree, tree, tree, tree, int, - tree, unification_kind_t)); -static struct z_candidate * add_template_conv_candidate - PROTO((struct z_candidate *, tree, tree, tree, tree)); -static struct z_candidate * add_builtin_candidates - PROTO((struct z_candidate *, enum tree_code, enum tree_code, - tree, tree *, int)); -static struct z_candidate * add_builtin_candidate - PROTO((struct z_candidate *, enum tree_code, enum tree_code, - tree, tree, tree, tree *, tree *, int)); -static int is_complete PROTO((tree)); -static struct z_candidate * build_builtin_candidate - PROTO((struct z_candidate *, tree, tree, tree, tree *, tree *, - int)); -static struct z_candidate * add_conv_candidate - PROTO((struct z_candidate *, tree, tree, tree)); -static struct z_candidate * add_function_candidate - PROTO((struct z_candidate *, tree, tree, int)); -static tree implicit_conversion PROTO((tree, tree, tree, int)); -static tree standard_conversion PROTO((tree, tree, tree)); -static tree reference_binding PROTO((tree, tree, tree, int)); -static tree strip_top_quals PROTO((tree)); -static tree non_reference PROTO((tree)); -static tree build_conv PROTO((enum tree_code, tree, tree)); -static int is_subseq PROTO((tree, tree)); -static int is_properly_derived_from PROTO((tree, tree)); -static int maybe_handle_ref_bind PROTO((tree*, tree*)); -static void maybe_handle_implicit_object PROTO((tree*)); - -tree -build_vfield_ref (datum, type) - tree datum, type; -{ - tree rval; - - if (datum == error_mark_node) - return error_mark_node; - - if (TREE_CODE (TREE_TYPE (datum)) == REFERENCE_TYPE) - datum = convert_from_reference (datum); - - if (! TYPE_USES_COMPLEX_INHERITANCE (type)) - rval = build (COMPONENT_REF, TREE_TYPE (CLASSTYPE_VFIELD (type)), - datum, CLASSTYPE_VFIELD (type)); - else - rval = build_component_ref (datum, DECL_NAME (CLASSTYPE_VFIELD (type)), NULL_TREE, 0); - - return rval; -} - -/* Build a call to a member of an object. I.e., one that overloads - operator ()(), or is a pointer-to-function or pointer-to-method. */ - -static tree -build_field_call (basetype_path, instance_ptr, name, parms) - tree basetype_path, instance_ptr, name, parms; -{ - tree field, instance; - - if (name == ctor_identifier || name == dtor_identifier) - return NULL_TREE; - - if (instance_ptr == current_class_ptr) - { - /* Check to see if we really have a reference to an instance variable - with `operator()()' overloaded. */ - field = IDENTIFIER_CLASS_VALUE (name); - - if (field == NULL_TREE) - { - cp_error ("`this' has no member named `%D'", name); - return error_mark_node; - } - - if (TREE_CODE (field) == FIELD_DECL || TREE_CODE (field) == VAR_DECL) - { - /* If it's a field, try overloading operator (), - or calling if the field is a pointer-to-function. */ - instance = build_component_ref_1 (current_class_ref, field, 0); - if (instance == error_mark_node) - return error_mark_node; - - if (TYPE_LANG_SPECIFIC (TREE_TYPE (instance))) - return build_opfncall (CALL_EXPR, LOOKUP_NORMAL, instance, parms, NULL_TREE); - - if (TREE_CODE (TREE_TYPE (instance)) == POINTER_TYPE) - { - if (TREE_CODE (TREE_TYPE (TREE_TYPE (instance))) == FUNCTION_TYPE) - return build_function_call (instance, parms); - else if (TREE_CODE (TREE_TYPE (TREE_TYPE (instance))) == METHOD_TYPE) - return build_function_call (instance, expr_tree_cons (NULL_TREE, current_class_ptr, parms)); - } - } - return NULL_TREE; - } - - /* Check to see if this is not really a reference to an instance variable - with `operator()()' overloaded. */ - field = lookup_field (basetype_path, name, 1, 0); - - /* This can happen if the reference was ambiguous or for access - violations. */ - if (field == error_mark_node) - return error_mark_node; - - if (field && (TREE_CODE (field) == FIELD_DECL || - TREE_CODE (field) == VAR_DECL)) - { - tree basetype; - tree ftype = TREE_TYPE (field); - - if (TREE_CODE (ftype) == REFERENCE_TYPE) - ftype = TREE_TYPE (ftype); - - if (TYPE_LANG_SPECIFIC (ftype)) - { - /* Make the next search for this field very short. */ - basetype = DECL_FIELD_CONTEXT (field); - instance_ptr = convert_pointer_to (basetype, instance_ptr); - - instance = build_indirect_ref (instance_ptr, NULL_PTR); - return build_opfncall (CALL_EXPR, LOOKUP_NORMAL, - build_component_ref_1 (instance, field, 0), - parms, NULL_TREE); - } - if (TREE_CODE (ftype) == POINTER_TYPE) - { - if (TREE_CODE (TREE_TYPE (ftype)) == FUNCTION_TYPE - || TREE_CODE (TREE_TYPE (ftype)) == METHOD_TYPE) - { - /* This is a member which is a pointer to function. */ - tree ref - = build_component_ref_1 (build_indirect_ref (instance_ptr, - NULL_PTR), - field, LOOKUP_COMPLAIN); - if (ref == error_mark_node) - return error_mark_node; - return build_function_call (ref, parms); - } - } - else if (TREE_CODE (ftype) == METHOD_TYPE) - { - error ("invalid call via pointer-to-member function"); - return error_mark_node; - } - else - return NULL_TREE; - } - return NULL_TREE; -} - -static tree -find_scoped_type (type, inner_name, inner_types) - tree type, inner_name, inner_types; -{ - tree tags = CLASSTYPE_TAGS (type); - - while (tags) - { - /* The TREE_PURPOSE of an enum tag (which becomes a member of the - enclosing class) is set to the name for the enum type. So, if - inner_name is `bar', and we strike `baz' for `enum bar { baz }', - then this test will be true. */ - if (TREE_PURPOSE (tags) == inner_name) - { - if (inner_types == NULL_TREE) - return TYPE_MAIN_DECL (TREE_VALUE (tags)); - return resolve_scope_to_name (TREE_VALUE (tags), inner_types); - } - tags = TREE_CHAIN (tags); - } - - /* Look for a TYPE_DECL. */ - for (tags = TYPE_FIELDS (type); tags; tags = TREE_CHAIN (tags)) - if (TREE_CODE (tags) == TYPE_DECL && DECL_NAME (tags) == inner_name) - { - /* Code by raeburn. */ - if (inner_types == NULL_TREE) - return tags; - return resolve_scope_to_name (TREE_TYPE (tags), inner_types); - } - - return NULL_TREE; -} - -/* Resolve an expression NAME1::NAME2::...::NAMEn to - the name that names the above nested type. INNER_TYPES - is a chain of nested type names (held together by SCOPE_REFs); - OUTER_TYPE is the type we know to enclose INNER_TYPES. - Returns NULL_TREE if there is an error. */ - -tree -resolve_scope_to_name (outer_type, inner_stuff) - tree outer_type, inner_stuff; -{ - register tree tmp; - tree inner_name, inner_type; - - if (outer_type == NULL_TREE && current_class_type != NULL_TREE) - { - /* We first try to look for a nesting in our current class context, - then try any enclosing classes. */ - tree type = current_class_type; - - while (type && (TREE_CODE (type) == RECORD_TYPE - || TREE_CODE (type) == UNION_TYPE)) - { - tree rval = resolve_scope_to_name (type, inner_stuff); - - if (rval != NULL_TREE) - return rval; - type = DECL_CONTEXT (TYPE_MAIN_DECL (type)); - } - } - - if (TREE_CODE (inner_stuff) == SCOPE_REF) - { - inner_name = TREE_OPERAND (inner_stuff, 0); - inner_type = TREE_OPERAND (inner_stuff, 1); - } - else - { - inner_name = inner_stuff; - inner_type = NULL_TREE; - } - - if (outer_type == NULL_TREE) - { - tree x; - /* If we have something that's already a type by itself, - use that. */ - if (IDENTIFIER_HAS_TYPE_VALUE (inner_name)) - { - if (inner_type) - return resolve_scope_to_name (IDENTIFIER_TYPE_VALUE (inner_name), - inner_type); - return inner_name; - } - - x = lookup_name (inner_name, 0); - - if (x && TREE_CODE (x) == NAMESPACE_DECL) - { - x = lookup_namespace_name (x, inner_type); - return x; - } - return NULL_TREE; - } - - if (! IS_AGGR_TYPE (outer_type)) - return NULL_TREE; - - /* Look for member classes or enums. */ - tmp = find_scoped_type (outer_type, inner_name, inner_type); - - /* If it's not a type in this class, then go down into the - base classes and search there. */ - if (! tmp && TYPE_BINFO (outer_type)) - { - tree binfos = TYPE_BINFO_BASETYPES (outer_type); - int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0; - - for (i = 0; i < n_baselinks; i++) - { - tree base_binfo = TREE_VEC_ELT (binfos, i); - tmp = resolve_scope_to_name (BINFO_TYPE (base_binfo), inner_stuff); - if (tmp) - return tmp; - } - tmp = NULL_TREE; - } - - return tmp; -} - -/* Returns nonzero iff the destructor name specified in NAME - (a BIT_NOT_EXPR) matches BASETYPE. The operand of NAME can take many - forms... */ - -int -check_dtor_name (basetype, name) - tree basetype, name; -{ - name = TREE_OPERAND (name, 0); - - /* Just accept something we've already complained about. */ - if (name == error_mark_node) - return 1; - - if (TREE_CODE (name) == TYPE_DECL) - name = TREE_TYPE (name); - else if (TREE_CODE_CLASS (TREE_CODE (name)) == 't') - /* OK */; - else if (TREE_CODE (name) == IDENTIFIER_NODE) - { - if ((IS_AGGR_TYPE (basetype) && name == constructor_name (basetype)) - || (TREE_CODE (basetype) == ENUMERAL_TYPE - && name == TYPE_IDENTIFIER (basetype))) - name = basetype; - else - name = get_type_value (name); - } - else - my_friendly_abort (980605); - - if (name && TYPE_MAIN_VARIANT (basetype) == TYPE_MAIN_VARIANT (name)) - return 1; - return 0; -} - -/* Build a method call of the form `EXP->SCOPES::NAME (PARMS)'. - This is how virtual function calls are avoided. */ - -tree -build_scoped_method_call (exp, basetype, name, parms) - tree exp, basetype, name, parms; -{ - /* Because this syntactic form does not allow - a pointer to a base class to be `stolen', - we need not protect the derived->base conversion - that happens here. - - @@ But we do have to check access privileges later. */ - tree binfo, decl; - tree type = TREE_TYPE (exp); - - if (type == error_mark_node - || basetype == error_mark_node) - return error_mark_node; - - if (processing_template_decl) - { - if (TREE_CODE (name) == BIT_NOT_EXPR - && TREE_CODE (TREE_OPERAND (name, 0)) == IDENTIFIER_NODE) - { - tree type = get_aggr_from_typedef (TREE_OPERAND (name, 0), 0); - if (type) - name = build_min_nt (BIT_NOT_EXPR, type); - } - name = build_min_nt (SCOPE_REF, basetype, name); - return build_min_nt (METHOD_CALL_EXPR, name, exp, parms, NULL_TREE); - } - - if (TREE_CODE (type) == REFERENCE_TYPE) - type = TREE_TYPE (type); - - if (TREE_CODE (basetype) == TREE_VEC) - { - binfo = basetype; - basetype = BINFO_TYPE (binfo); - } - else - binfo = NULL_TREE; - - /* Check the destructor call syntax. */ - if (TREE_CODE (name) == BIT_NOT_EXPR) - { - /* We can get here if someone writes their destructor call like - `obj.NS::~T()'; this isn't really a scoped method call, so hand - it off. */ - if (TREE_CODE (basetype) == NAMESPACE_DECL) - return build_method_call (exp, name, parms, NULL_TREE, LOOKUP_NORMAL); - - if (! check_dtor_name (basetype, name)) - cp_error ("qualified type `%T' does not match destructor name `~%T'", - basetype, TREE_OPERAND (name, 0)); - - /* Destructors can be "called" for simple types; see 5.2.4 and 12.4 Note - that explicit ~int is caught in the parser; this deals with typedefs - and template parms. */ - if (! IS_AGGR_TYPE (basetype)) - { - if (TYPE_MAIN_VARIANT (type) != TYPE_MAIN_VARIANT (basetype)) - cp_error ("type of `%E' does not match destructor type `%T' (type was `%T')", - exp, basetype, type); - - return cp_convert (void_type_node, exp); - } - } - - if (! is_aggr_type (basetype, 1)) - return error_mark_node; - - if (! IS_AGGR_TYPE (type)) - { - cp_error ("base object `%E' of scoped method call is of non-aggregate type `%T'", - exp, type); - return error_mark_node; - } - - if (! binfo) - { - binfo = get_binfo (basetype, type, 1); - if (binfo == error_mark_node) - return error_mark_node; - if (! binfo) - error_not_base_type (basetype, type); - } - - if (binfo) - { - if (TREE_CODE (exp) == INDIRECT_REF) - decl = build_indirect_ref - (convert_pointer_to_real - (binfo, build_unary_op (ADDR_EXPR, exp, 0)), NULL_PTR); - else - decl = build_scoped_ref (exp, basetype); - - /* Call to a destructor. */ - if (TREE_CODE (name) == BIT_NOT_EXPR) - { - if (! TYPE_HAS_DESTRUCTOR (TREE_TYPE (decl))) - return cp_convert (void_type_node, exp); - - return build_delete (TREE_TYPE (decl), decl, integer_two_node, - LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, - 0); - } - - /* Call to a method. */ - return build_method_call (decl, name, parms, binfo, - LOOKUP_NORMAL|LOOKUP_NONVIRTUAL); - } - return error_mark_node; -} - -/* We want the address of a function or method. We avoid creating a - pointer-to-member function. */ - -tree -build_addr_func (function) - tree function; -{ - tree type = TREE_TYPE (function); - - /* We have to do these by hand to avoid real pointer to member - functions. */ - if (TREE_CODE (type) == METHOD_TYPE) - { - tree addr; - - type = build_pointer_type (type); - - if (mark_addressable (function) == 0) - return error_mark_node; - - addr = build1 (ADDR_EXPR, type, function); - - /* Address of a static or external variable or function counts - as a constant */ - if (staticp (function)) - TREE_CONSTANT (addr) = 1; - - function = addr; - } - else - function = default_conversion (function); - - return function; -} - -/* Build a CALL_EXPR, we can handle FUNCTION_TYPEs, METHOD_TYPEs, or - POINTER_TYPE to those. Note, pointer to member function types - (TYPE_PTRMEMFUNC_P) must be handled by our callers. */ - -tree -build_call (function, result_type, parms) - tree function, result_type, parms; -{ - int is_constructor = 0; - tree tmp; - tree decl; - - function = build_addr_func (function); - - if (TYPE_PTRMEMFUNC_P (TREE_TYPE (function))) - { - sorry ("unable to call pointer to member function here"); - return error_mark_node; - } - - if (TREE_CODE (function) == ADDR_EXPR - && TREE_CODE (TREE_OPERAND (function, 0)) == FUNCTION_DECL) - decl = TREE_OPERAND (function, 0); - else - decl = NULL_TREE; - - if (decl && DECL_CONSTRUCTOR_P (decl)) - is_constructor = 1; - - if (decl) - my_friendly_assert (TREE_USED (decl), 990125); - - /* Don't pass empty class objects by value. This is useful - for tags in STL, which are used to control overload resolution. - We don't need to handle other cases of copying empty classes. */ - if (! decl || ! DECL_BUILT_IN (decl)) - for (tmp = parms; tmp; tmp = TREE_CHAIN (tmp)) - if (is_empty_class (TREE_TYPE (TREE_VALUE (tmp))) - && ! TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (tmp)))) - { - tree t = make_node (RTL_EXPR); - TREE_TYPE (t) = TREE_TYPE (TREE_VALUE (tmp)); - RTL_EXPR_RTL (t) = const0_rtx; - RTL_EXPR_SEQUENCE (t) = NULL_RTX; - TREE_VALUE (tmp) = build (COMPOUND_EXPR, TREE_TYPE (t), - TREE_VALUE (tmp), t); - } - - function = build_nt (CALL_EXPR, function, parms, NULL_TREE); - TREE_HAS_CONSTRUCTOR (function) = is_constructor; - TREE_TYPE (function) = result_type; - TREE_SIDE_EFFECTS (function) = 1; - - return function; -} - -/* Build something of the form ptr->method (args) - or object.method (args). This can also build - calls to constructors, and find friends. - - Member functions always take their class variable - as a pointer. - - INSTANCE is a class instance. - - NAME is the name of the method desired, usually an IDENTIFIER_NODE. - - PARMS help to figure out what that NAME really refers to. - - BASETYPE_PATH, if non-NULL, contains a chain from the type of INSTANCE - down to the real instance type to use for access checking. We need this - information to get protected accesses correct. This parameter is used - by build_member_call. - - FLAGS is the logical disjunction of zero or more LOOKUP_ - flags. See cp-tree.h for more info. - - If this is all OK, calls build_function_call with the resolved - member function. - - This function must also handle being called to perform - initialization, promotion/coercion of arguments, and - instantiation of default parameters. - - Note that NAME may refer to an instance variable name. If - `operator()()' is defined for the type of that field, then we return - that result. */ - -tree -build_method_call (instance, name, parms, basetype_path, flags) - tree instance, name, parms, basetype_path; - int flags; -{ - tree basetype, instance_ptr; - -#ifdef GATHER_STATISTICS - n_build_method_call++; -#endif - - if (instance == error_mark_node - || name == error_mark_node - || parms == error_mark_node - || (instance != NULL_TREE && TREE_TYPE (instance) == error_mark_node)) - return error_mark_node; - - if (processing_template_decl) - { - /* We need to process template parm names here so that tsubst catches - them properly. Other type names can wait. */ - if (TREE_CODE (name) == BIT_NOT_EXPR) - { - tree type = NULL_TREE; - - if (TREE_CODE (TREE_OPERAND (name, 0)) == IDENTIFIER_NODE) - type = get_aggr_from_typedef (TREE_OPERAND (name, 0), 0); - else if (TREE_CODE (TREE_OPERAND (name, 0)) == TYPE_DECL) - type = TREE_TYPE (TREE_OPERAND (name, 0)); - - if (type && TREE_CODE (type) == TEMPLATE_TYPE_PARM) - name = build_min_nt (BIT_NOT_EXPR, type); - } - - return build_min_nt (METHOD_CALL_EXPR, name, instance, parms, NULL_TREE); - } - - /* This is the logic that magically deletes the second argument to - operator delete, if it is not needed. */ - if (name == ansi_opname[(int) DELETE_EXPR] && list_length (parms)==2) - { - tree save_last = TREE_CHAIN (parms); - - /* get rid of unneeded argument */ - TREE_CHAIN (parms) = NULL_TREE; - if (build_method_call (instance, name, parms, basetype_path, - (LOOKUP_SPECULATIVELY|flags) & ~LOOKUP_COMPLAIN)) - { - /* If it finds a match, return it. */ - return build_method_call (instance, name, parms, basetype_path, flags); - } - /* If it doesn't work, two argument delete must work */ - TREE_CHAIN (parms) = save_last; - } - /* We already know whether it's needed or not for vec delete. */ - else if (name == ansi_opname[(int) VEC_DELETE_EXPR] - && TYPE_LANG_SPECIFIC (TREE_TYPE (instance)) - && ! TYPE_VEC_DELETE_TAKES_SIZE (TREE_TYPE (instance))) - TREE_CHAIN (parms) = NULL_TREE; - - if (TREE_CODE (name) == BIT_NOT_EXPR) - { - if (parms) - error ("destructors take no parameters"); - basetype = TREE_TYPE (instance); - if (TREE_CODE (basetype) == REFERENCE_TYPE) - basetype = TREE_TYPE (basetype); - - if (! check_dtor_name (basetype, name)) - cp_error - ("destructor name `~%T' does not match type `%T' of expression", - TREE_OPERAND (name, 0), basetype); - - if (! TYPE_HAS_DESTRUCTOR (complete_type (basetype))) - return cp_convert (void_type_node, instance); - instance = default_conversion (instance); - instance_ptr = build_unary_op (ADDR_EXPR, instance, 0); - return build_delete (build_pointer_type (basetype), - instance_ptr, integer_two_node, - LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 0); - } - - return build_new_method_call (instance, name, parms, basetype_path, flags); -} - -/* New overloading code. */ - -struct z_candidate { - tree fn; - tree convs; - tree second_conv; - int viable; - tree basetype_path; - tree template; - tree warnings; - struct z_candidate *next; -}; - -#define IDENTITY_RANK 0 -#define EXACT_RANK 1 -#define PROMO_RANK 2 -#define STD_RANK 3 -#define PBOOL_RANK 4 -#define USER_RANK 5 -#define ELLIPSIS_RANK 6 -#define BAD_RANK 7 - -#define ICS_RANK(NODE) \ - (ICS_BAD_FLAG (NODE) ? BAD_RANK \ - : ICS_ELLIPSIS_FLAG (NODE) ? ELLIPSIS_RANK \ - : ICS_USER_FLAG (NODE) ? USER_RANK \ - : ICS_STD_RANK (NODE)) - -#define ICS_STD_RANK(NODE) TREE_COMPLEXITY (NODE) - -#define ICS_USER_FLAG(NODE) TREE_LANG_FLAG_0 (NODE) -#define ICS_ELLIPSIS_FLAG(NODE) TREE_LANG_FLAG_1 (NODE) -#define ICS_THIS_FLAG(NODE) TREE_LANG_FLAG_2 (NODE) -#define ICS_BAD_FLAG(NODE) TREE_LANG_FLAG_3 (NODE) - -#define USER_CONV_CAND(NODE) \ - ((struct z_candidate *)WRAPPER_PTR (TREE_OPERAND (NODE, 1))) -#define USER_CONV_FN(NODE) (USER_CONV_CAND (NODE)->fn) - -int -null_ptr_cst_p (t) - tree t; -{ - if (t == null_node - || (integer_zerop (t) && TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE)) - return 1; - return 0; -} - -static tree -build_conv (code, type, from) - enum tree_code code; - tree type, from; -{ - tree t = build1 (code, type, from); - int rank = ICS_STD_RANK (from); - switch (code) - { - case PTR_CONV: - case PMEM_CONV: - case BASE_CONV: - case STD_CONV: - if (rank < STD_RANK) - rank = STD_RANK; - break; - - case QUAL_CONV: - if (rank < EXACT_RANK) - rank = EXACT_RANK; - - default: - break; - } - ICS_STD_RANK (t) = rank; - ICS_USER_FLAG (t) = ICS_USER_FLAG (from); - ICS_BAD_FLAG (t) = ICS_BAD_FLAG (from); - return t; -} - -static tree -non_reference (t) - tree t; -{ - if (TREE_CODE (t) == REFERENCE_TYPE) - t = TREE_TYPE (t); - return t; -} - -static tree -strip_top_quals (t) - tree t; -{ - if (TREE_CODE (t) == ARRAY_TYPE) - return t; - return TYPE_MAIN_VARIANT (t); -} - -/* Returns the standard conversion path (see [conv]) from type FROM to type - TO, if any. For proper handling of null pointer constants, you must - also pass the expression EXPR to convert from. */ - -static tree -standard_conversion (to, from, expr) - tree to, from, expr; -{ - enum tree_code fcode, tcode; - tree conv; - int fromref = 0; - - if (TREE_CODE (to) == REFERENCE_TYPE) - to = TREE_TYPE (to); - if (TREE_CODE (from) == REFERENCE_TYPE) - { - fromref = 1; - from = TREE_TYPE (from); - } - to = strip_top_quals (to); - from = strip_top_quals (from); - - if ((TYPE_PTRFN_P (to) || TYPE_PTRMEMFUNC_P (to)) - && expr && type_unknown_p (expr)) - { - expr = instantiate_type (to, expr, 0); - if (expr == error_mark_node) - return NULL_TREE; - from = TREE_TYPE (expr); - } - - fcode = TREE_CODE (from); - tcode = TREE_CODE (to); - - conv = build1 (IDENTITY_CONV, from, expr); - - if (fcode == FUNCTION_TYPE) - { - from = build_pointer_type (from); - fcode = TREE_CODE (from); - conv = build_conv (LVALUE_CONV, from, conv); - } - else if (fcode == ARRAY_TYPE) - { - from = build_pointer_type (TREE_TYPE (from)); - fcode = TREE_CODE (from); - conv = build_conv (LVALUE_CONV, from, conv); - } - else if (fromref || (expr && real_lvalue_p (expr))) - conv = build_conv (RVALUE_CONV, from, conv); - - if (from == to) - return conv; - - if ((tcode == POINTER_TYPE || TYPE_PTRMEMFUNC_P (to)) - && expr && null_ptr_cst_p (expr)) - { - conv = build_conv (STD_CONV, to, conv); - } - else if (tcode == POINTER_TYPE && fcode == POINTER_TYPE) - { - enum tree_code ufcode = TREE_CODE (TREE_TYPE (from)); - enum tree_code utcode = TREE_CODE (TREE_TYPE (to)); - - if (same_type_p (TYPE_MAIN_VARIANT (TREE_TYPE (from)), - TYPE_MAIN_VARIANT (TREE_TYPE (to)))) - ; - else if (utcode == VOID_TYPE && ufcode != OFFSET_TYPE - && ufcode != FUNCTION_TYPE) - { - from = build_pointer_type - (cp_build_qualified_type (void_type_node, - CP_TYPE_QUALS (TREE_TYPE (from)))); - conv = build_conv (PTR_CONV, from, conv); - } - else if (ufcode == OFFSET_TYPE && utcode == OFFSET_TYPE) - { - tree fbase = TYPE_OFFSET_BASETYPE (TREE_TYPE (from)); - tree tbase = TYPE_OFFSET_BASETYPE (TREE_TYPE (to)); - - if (DERIVED_FROM_P (fbase, tbase) - && (same_type_p - (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (from))), - TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (to)))))) - { - from = build_offset_type (tbase, TREE_TYPE (TREE_TYPE (from))); - from = build_pointer_type (from); - conv = build_conv (PMEM_CONV, from, conv); - } - } - else if (IS_AGGR_TYPE (TREE_TYPE (from)) - && IS_AGGR_TYPE (TREE_TYPE (to))) - { - if (DERIVED_FROM_P (TREE_TYPE (to), TREE_TYPE (from))) - { - from = - cp_build_qualified_type (TREE_TYPE (to), - CP_TYPE_QUALS (TREE_TYPE (from))); - from = build_pointer_type (from); - conv = build_conv (PTR_CONV, from, conv); - } - } - - if (same_type_p (from, to)) - /* OK */; - else if (comp_ptr_ttypes (TREE_TYPE (to), TREE_TYPE (from))) - conv = build_conv (QUAL_CONV, to, conv); - else if (expr && string_conv_p (to, expr, 0)) - /* converting from string constant to char *. */ - conv = build_conv (QUAL_CONV, to, conv); - else if (ptr_reasonably_similar (TREE_TYPE (to), TREE_TYPE (from))) - { - conv = build_conv (PTR_CONV, to, conv); - ICS_BAD_FLAG (conv) = 1; - } - else - return 0; - - from = to; - } - else if (TYPE_PTRMEMFUNC_P (to) && TYPE_PTRMEMFUNC_P (from)) - { - tree fromfn = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (from)); - tree tofn = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (to)); - tree fbase = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fromfn))); - tree tbase = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (tofn))); - - if (! DERIVED_FROM_P (fbase, tbase) - || ! same_type_p (TREE_TYPE (fromfn), TREE_TYPE (tofn)) - || ! compparms (TREE_CHAIN (TYPE_ARG_TYPES (fromfn)), - TREE_CHAIN (TYPE_ARG_TYPES (tofn))) - || CP_TYPE_QUALS (fbase) != CP_TYPE_QUALS (tbase)) - return 0; - - from = cp_build_qualified_type (tbase, CP_TYPE_QUALS (fbase)); - from = build_cplus_method_type (from, TREE_TYPE (fromfn), - TREE_CHAIN (TYPE_ARG_TYPES (fromfn))); - from = build_ptrmemfunc_type (build_pointer_type (from)); - conv = build_conv (PMEM_CONV, from, conv); - } - else if (tcode == BOOLEAN_TYPE) - { - if (! (INTEGRAL_CODE_P (fcode) || fcode == REAL_TYPE - || fcode == POINTER_TYPE || TYPE_PTRMEMFUNC_P (from))) - return 0; - - conv = build_conv (STD_CONV, to, conv); - if (fcode == POINTER_TYPE - || (TYPE_PTRMEMFUNC_P (from) && ICS_STD_RANK (conv) < PBOOL_RANK)) - ICS_STD_RANK (conv) = PBOOL_RANK; - } - /* We don't check for ENUMERAL_TYPE here because there are no standard - conversions to enum type. */ - else if (tcode == INTEGER_TYPE || tcode == BOOLEAN_TYPE - || tcode == REAL_TYPE) - { - if (! (INTEGRAL_CODE_P (fcode) || fcode == REAL_TYPE)) - return 0; - conv = build_conv (STD_CONV, to, conv); - - /* Give this a better rank if it's a promotion. */ - if (to == type_promotes_to (from) - && ICS_STD_RANK (TREE_OPERAND (conv, 0)) <= PROMO_RANK) - ICS_STD_RANK (conv) = PROMO_RANK; - } - else if (IS_AGGR_TYPE (to) && IS_AGGR_TYPE (from) - && DERIVED_FROM_P (to, from)) - { - if (TREE_CODE (conv) == RVALUE_CONV) - conv = TREE_OPERAND (conv, 0); - conv = build_conv (BASE_CONV, to, conv); - } - else - return 0; - - return conv; -} - -/* Returns the conversion path from type FROM to reference type TO for - purposes of reference binding. For lvalue binding, either pass a - reference type to FROM or an lvalue expression to EXPR. - - Currently does not distinguish in the generated trees between binding to - an lvalue and a temporary. Should it? */ - -static tree -reference_binding (rto, rfrom, expr, flags) - tree rto, rfrom, expr; - int flags; -{ - tree conv; - int lvalue = 1; - tree to = TREE_TYPE (rto); - tree from = rfrom; - int related; - - if (TREE_CODE (to) == FUNCTION_TYPE && expr && type_unknown_p (expr)) - { - expr = instantiate_type (to, expr, 0); - if (expr == error_mark_node) - return NULL_TREE; - from = TREE_TYPE (expr); - } - - if (TREE_CODE (from) == REFERENCE_TYPE) - from = TREE_TYPE (from); - else if (! expr || ! real_lvalue_p (expr)) - lvalue = 0; - - related = (same_type_p (TYPE_MAIN_VARIANT (to), - TYPE_MAIN_VARIANT (from)) - || (IS_AGGR_TYPE (to) && IS_AGGR_TYPE (from) - && DERIVED_FROM_P (to, from))); - - if (lvalue && related && at_least_as_qualified_p (to, from)) - { - conv = build1 (IDENTITY_CONV, from, expr); - - if (same_type_p (TYPE_MAIN_VARIANT (to), - TYPE_MAIN_VARIANT (from))) - conv = build_conv (REF_BIND, rto, conv); - else - { - conv = build_conv (REF_BIND, rto, conv); - ICS_STD_RANK (conv) = STD_RANK; - } - } - else - conv = NULL_TREE; - - if (! conv) - { - conv = standard_conversion (to, rfrom, expr); - if (conv) - { - conv = build_conv (REF_BIND, rto, conv); - - /* Bind directly to a base subobject of a class rvalue. Do it - after building the conversion for proper handling of ICS_RANK. */ - if (TREE_CODE (TREE_OPERAND (conv, 0)) == BASE_CONV) - TREE_OPERAND (conv, 0) = TREE_OPERAND (TREE_OPERAND (conv, 0), 0); - } - if (conv - && ((! (CP_TYPE_CONST_NON_VOLATILE_P (to) - && (flags & LOOKUP_NO_TEMP_BIND) == 0)) - /* If T1 is reference-related to T2, cv1 must be the same - cv-qualification as, or greater cv-qualification than, - cv2; otherwise, the program is ill-formed. */ - || (related && !at_least_as_qualified_p (to, from)))) - ICS_BAD_FLAG (conv) = 1; - } - - return conv; -} - -/* Returns the implicit conversion sequence (see [over.ics]) from type FROM - to type TO. The optional expression EXPR may affect the conversion. - FLAGS are the usual overloading flags. Only LOOKUP_NO_CONVERSION is - significant. */ - -static tree -implicit_conversion (to, from, expr, flags) - tree to, from, expr; - int flags; -{ - tree conv; - struct z_candidate *cand; - - if (TREE_CODE (to) == REFERENCE_TYPE) - conv = reference_binding (to, from, expr, flags); - else - conv = standard_conversion (to, from, expr); - - if (conv) - ; - else if (expr != NULL_TREE - && (IS_AGGR_TYPE (non_reference (from)) - || IS_AGGR_TYPE (non_reference (to))) - && (flags & LOOKUP_NO_CONVERSION) == 0) - { - cand = build_user_type_conversion_1 - (to, expr, LOOKUP_ONLYCONVERTING); - if (cand) - conv = cand->second_conv; - if ((! conv || ICS_BAD_FLAG (conv)) - && TREE_CODE (to) == REFERENCE_TYPE - && (flags & LOOKUP_NO_TEMP_BIND) == 0) - { - cand = build_user_type_conversion_1 - (TYPE_MAIN_VARIANT (TREE_TYPE (to)), expr, LOOKUP_ONLYCONVERTING); - if (cand) - { - if (!CP_TYPE_CONST_NON_VOLATILE_P (TREE_TYPE (to))) - ICS_BAD_FLAG (cand->second_conv) = 1; - if (!conv || (ICS_BAD_FLAG (conv) - > ICS_BAD_FLAG (cand->second_conv))) - conv = build_conv (REF_BIND, to, cand->second_conv); - } - } - } - - return conv; -} - -/* Add a new entry to the list of candidates. Used by the add_*_candidate - functions. */ - -static struct z_candidate * -add_candidate (candidates, fn, convs, viable) - struct z_candidate *candidates; - tree fn, convs; - int viable; -{ - struct z_candidate *cand - = (struct z_candidate *) scratchalloc (sizeof (struct z_candidate)); - - cand->fn = fn; - cand->convs = convs; - cand->second_conv = NULL_TREE; - cand->viable = viable; - cand->basetype_path = NULL_TREE; - cand->template = NULL_TREE; - cand->warnings = NULL_TREE; - cand->next = candidates; - - return cand; -} - -/* Create an overload candidate for the function or method FN called with - the argument list ARGLIST and add it to CANDIDATES. FLAGS is passed on - to implicit_conversion. */ - -static struct z_candidate * -add_function_candidate (candidates, fn, arglist, flags) - struct z_candidate *candidates; - tree fn, arglist; - int flags; -{ - tree parmlist = TYPE_ARG_TYPES (TREE_TYPE (fn)); - int i, len; - tree convs; - tree parmnode = parmlist; - tree argnode = arglist; - int viable = 1; - - /* The `this' and `in_chrg' arguments to constructors are not considered - in overload resolution. */ - if (DECL_CONSTRUCTOR_P (fn)) - { - parmnode = TREE_CHAIN (parmnode); - argnode = TREE_CHAIN (argnode); - if (TYPE_USES_VIRTUAL_BASECLASSES (DECL_CONTEXT (fn))) - { - parmnode = TREE_CHAIN (parmnode); - argnode = TREE_CHAIN (argnode); - } - } - - len = list_length (argnode); - convs = make_scratch_vec (len); - - for (i = 0; i < len; ++i) - { - tree arg = TREE_VALUE (argnode); - tree argtype = lvalue_type (arg); - tree t; - - if (parmnode == void_list_node) - break; - - if (parmnode) - { - tree parmtype = TREE_VALUE (parmnode); - - /* [over.match.funcs] For conversion functions, the function is - considered to be a member of the class of the implicit object - argument for the purpose of defining the type of the implicit - object parameter. - - Since build_over_call ignores the ICS for the `this' parameter, - we can just change the parm type. */ - if (DECL_CONV_FN_P (fn) && i == 0) - { - parmtype - = build_qualified_type (TREE_TYPE (argtype), - TYPE_QUALS (TREE_TYPE (parmtype))); - parmtype = build_pointer_type (parmtype); - } - - t = implicit_conversion (parmtype, argtype, arg, flags); - } - else - { - t = build1 (IDENTITY_CONV, argtype, arg); - ICS_ELLIPSIS_FLAG (t) = 1; - } - - if (i == 0 && t && TREE_CODE (TREE_TYPE (fn)) == METHOD_TYPE - && ! DECL_CONSTRUCTOR_P (fn)) - ICS_THIS_FLAG (t) = 1; - - TREE_VEC_ELT (convs, i) = t; - if (! t) - break; - - if (ICS_BAD_FLAG (t)) - viable = -1; - - if (parmnode) - parmnode = TREE_CHAIN (parmnode); - argnode = TREE_CHAIN (argnode); - } - - if (i < len) - viable = 0; - - /* Make sure there are default args for the rest of the parms. */ - for (; parmnode && parmnode != void_list_node; - parmnode = TREE_CHAIN (parmnode)) - if (! TREE_PURPOSE (parmnode)) - { - viable = 0; - break; - } - - return add_candidate (candidates, fn, convs, viable); -} - -/* Create an overload candidate for the conversion function FN which will - be invoked for expression OBJ, producing a pointer-to-function which - will in turn be called with the argument list ARGLIST, and add it to - CANDIDATES. FLAGS is passed on to implicit_conversion. - - Actually, we don't really care about FN; we care about the type it - converts to. There may be multiple conversion functions that will - convert to that type, and we rely on build_user_type_conversion_1 to - choose the best one; so when we create our candidate, we record the type - instead of the function. */ - -static struct z_candidate * -add_conv_candidate (candidates, fn, obj, arglist) - struct z_candidate *candidates; - tree fn, obj, arglist; -{ - tree totype = TREE_TYPE (TREE_TYPE (fn)); - tree parmlist = TYPE_ARG_TYPES (TREE_TYPE (totype)); - int i, len = list_length (arglist) + 1; - tree convs = make_scratch_vec (len); - tree parmnode = parmlist; - tree argnode = arglist; - int viable = 1; - int flags = LOOKUP_NORMAL; - - /* Don't bother looking up the same type twice. */ - if (candidates && candidates->fn == totype) - return candidates; - - for (i = 0; i < len; ++i) - { - tree arg = i == 0 ? obj : TREE_VALUE (argnode); - tree argtype = lvalue_type (arg); - tree t; - - if (i == 0) - t = implicit_conversion (totype, argtype, arg, flags); - else if (parmnode == void_list_node) - break; - else if (parmnode) - t = implicit_conversion (TREE_VALUE (parmnode), argtype, arg, flags); - else - { - t = build1 (IDENTITY_CONV, argtype, arg); - ICS_ELLIPSIS_FLAG (t) = 1; - } - - TREE_VEC_ELT (convs, i) = t; - if (! t) - break; - - if (ICS_BAD_FLAG (t)) - viable = -1; - - if (i == 0) - continue; - - if (parmnode) - parmnode = TREE_CHAIN (parmnode); - argnode = TREE_CHAIN (argnode); - } - - if (i < len) - viable = 0; - - for (; parmnode && parmnode != void_list_node; - parmnode = TREE_CHAIN (parmnode)) - if (! TREE_PURPOSE (parmnode)) - { - viable = 0; - break; - } - - return add_candidate (candidates, totype, convs, viable); -} - -static struct z_candidate * -build_builtin_candidate (candidates, fnname, type1, type2, - args, argtypes, flags) - struct z_candidate *candidates; - tree fnname, type1, type2, *args, *argtypes; - int flags; - -{ - tree t, convs; - int viable = 1, i; - tree types[2]; - - types[0] = type1; - types[1] = type2; - - convs = make_scratch_vec (args[2] ? 3 : (args[1] ? 2 : 1)); - - for (i = 0; i < 2; ++i) - { - if (! args[i]) - break; - - t = implicit_conversion (types[i], argtypes[i], args[i], flags); - if (! t) - { - viable = 0; - /* We need something for printing the candidate. */ - t = build1 (IDENTITY_CONV, types[i], NULL_TREE); - } - else if (ICS_BAD_FLAG (t)) - viable = 0; - TREE_VEC_ELT (convs, i) = t; - } - - /* For COND_EXPR we rearranged the arguments; undo that now. */ - if (args[2]) - { - TREE_VEC_ELT (convs, 2) = TREE_VEC_ELT (convs, 1); - TREE_VEC_ELT (convs, 1) = TREE_VEC_ELT (convs, 0); - t = implicit_conversion (boolean_type_node, argtypes[2], args[2], flags); - if (t) - TREE_VEC_ELT (convs, 0) = t; - else - viable = 0; - } - - return add_candidate (candidates, fnname, convs, viable); -} - -static int -is_complete (t) - tree t; -{ - return TYPE_SIZE (complete_type (t)) != NULL_TREE; -} - -/* Create any builtin operator overload candidates for the operator in - question given the converted operand types TYPE1 and TYPE2. The other - args are passed through from add_builtin_candidates to - build_builtin_candidate. */ - -static struct z_candidate * -add_builtin_candidate (candidates, code, code2, fnname, type1, type2, - args, argtypes, flags) - struct z_candidate *candidates; - enum tree_code code, code2; - tree fnname, type1, type2, *args, *argtypes; - int flags; -{ - switch (code) - { - case POSTINCREMENT_EXPR: - case POSTDECREMENT_EXPR: - args[1] = integer_zero_node; - type2 = integer_type_node; - break; - default: - break; - } - - switch (code) - { - -/* 4 For every pair T, VQ), where T is an arithmetic or enumeration type, - and VQ is either volatile or empty, there exist candidate operator - functions of the form - VQ T& operator++(VQ T&); - T operator++(VQ T&, int); - 5 For every pair T, VQ), where T is an enumeration type or an arithmetic - type other than bool, and VQ is either volatile or empty, there exist - candidate operator functions of the form - VQ T& operator--(VQ T&); - T operator--(VQ T&, int); - 6 For every pair T, VQ), where T is a cv-qualified or cv-unqualified - complete object type, and VQ is either volatile or empty, there exist - candidate operator functions of the form - T*VQ& operator++(T*VQ&); - T*VQ& operator--(T*VQ&); - T* operator++(T*VQ&, int); - T* operator--(T*VQ&, int); */ - - case POSTDECREMENT_EXPR: - case PREDECREMENT_EXPR: - if (TREE_CODE (type1) == BOOLEAN_TYPE) - return candidates; - case POSTINCREMENT_EXPR: - case PREINCREMENT_EXPR: - if ((ARITHMETIC_TYPE_P (type1) && TREE_CODE (type1) != ENUMERAL_TYPE) - || TYPE_PTROB_P (type1)) - { - type1 = build_reference_type (type1); - break; - } - return candidates; - -/* 7 For every cv-qualified or cv-unqualified complete object type T, there - exist candidate operator functions of the form - - T& operator*(T*); - - 8 For every function type T, there exist candidate operator functions of - the form - T& operator*(T*); */ - - case INDIRECT_REF: - if (TREE_CODE (type1) == POINTER_TYPE - && (TYPE_PTROB_P (type1) - || TREE_CODE (TREE_TYPE (type1)) == FUNCTION_TYPE)) - break; - return candidates; - -/* 9 For every type T, there exist candidate operator functions of the form - T* operator+(T*); - - 10For every promoted arithmetic type T, there exist candidate operator - functions of the form - T operator+(T); - T operator-(T); */ - - case CONVERT_EXPR: /* unary + */ - if (TREE_CODE (type1) == POINTER_TYPE - && TREE_CODE (TREE_TYPE (type1)) != OFFSET_TYPE) - break; - case NEGATE_EXPR: - if (ARITHMETIC_TYPE_P (type1)) - break; - return candidates; - -/* 11For every promoted integral type T, there exist candidate operator - functions of the form - T operator~(T); */ - - case BIT_NOT_EXPR: - if (INTEGRAL_TYPE_P (type1)) - break; - return candidates; - -/* 12For every quintuple C1, C2, T, CV1, CV2), where C2 is a class type, C1 - is the same type as C2 or is a derived class of C2, T is a complete - object type or a function type, and CV1 and CV2 are cv-qualifier-seqs, - there exist candidate operator functions of the form - CV12 T& operator->*(CV1 C1*, CV2 T C2::*); - where CV12 is the union of CV1 and CV2. */ - - case MEMBER_REF: - if (TREE_CODE (type1) == POINTER_TYPE - && (TYPE_PTRMEMFUNC_P (type2) || TYPE_PTRMEM_P (type2))) - { - tree c1 = TREE_TYPE (type1); - tree c2 = (TYPE_PTRMEMFUNC_P (type2) - ? TYPE_METHOD_BASETYPE (TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (type2))) - : TYPE_OFFSET_BASETYPE (TREE_TYPE (type2))); - - if (IS_AGGR_TYPE (c1) && DERIVED_FROM_P (c2, c1) - && (TYPE_PTRMEMFUNC_P (type2) - || is_complete (TREE_TYPE (TREE_TYPE (type2))))) - break; - } - return candidates; - -/* 13For every pair of promoted arithmetic types L and R, there exist can- - didate operator functions of the form - LR operator*(L, R); - LR operator/(L, R); - LR operator+(L, R); - LR operator-(L, R); - bool operator<(L, R); - bool operator>(L, R); - bool operator<=(L, R); - bool operator>=(L, R); - bool operator==(L, R); - bool operator!=(L, R); - where LR is the result of the usual arithmetic conversions between - types L and R. - - 14For every pair of types T and I, where T is a cv-qualified or cv- - unqualified complete object type and I is a promoted integral type, - there exist candidate operator functions of the form - T* operator+(T*, I); - T& operator[](T*, I); - T* operator-(T*, I); - T* operator+(I, T*); - T& operator[](I, T*); - - 15For every T, where T is a pointer to complete object type, there exist - candidate operator functions of the form112) - ptrdiff_t operator-(T, T); - - 16For every pointer type T, there exist candidate operator functions of - the form - bool operator<(T, T); - bool operator>(T, T); - bool operator<=(T, T); - bool operator>=(T, T); - bool operator==(T, T); - bool operator!=(T, T); - - 17For every pointer to member type T, there exist candidate operator - functions of the form - bool operator==(T, T); - bool operator!=(T, T); */ - - case MINUS_EXPR: - if (TYPE_PTROB_P (type1) && TYPE_PTROB_P (type2)) - break; - if (TYPE_PTROB_P (type1) && INTEGRAL_TYPE_P (type2)) - { - type2 = ptrdiff_type_node; - break; - } - case MULT_EXPR: - case TRUNC_DIV_EXPR: - if (ARITHMETIC_TYPE_P (type1) && ARITHMETIC_TYPE_P (type2)) - break; - return candidates; - - case EQ_EXPR: - case NE_EXPR: - if ((TYPE_PTRMEMFUNC_P (type1) && TYPE_PTRMEMFUNC_P (type2)) - || (TYPE_PTRMEM_P (type1) && TYPE_PTRMEM_P (type2))) - break; - if ((TYPE_PTRMEMFUNC_P (type1) || TYPE_PTRMEM_P (type1)) - && null_ptr_cst_p (args[1])) - { - type2 = type1; - break; - } - if ((TYPE_PTRMEMFUNC_P (type2) || TYPE_PTRMEM_P (type2)) - && null_ptr_cst_p (args[0])) - { - type1 = type2; - break; - } - case LT_EXPR: - case GT_EXPR: - case LE_EXPR: - case GE_EXPR: - case MAX_EXPR: - case MIN_EXPR: - if ((ARITHMETIC_TYPE_P (type1) && ARITHMETIC_TYPE_P (type2)) - || (TYPE_PTR_P (type1) && TYPE_PTR_P (type2))) - break; - if (TYPE_PTR_P (type1) && null_ptr_cst_p (args[1])) - { - type2 = type1; - break; - } - if (null_ptr_cst_p (args[0]) && TYPE_PTR_P (type2)) - { - type1 = type2; - break; - } - return candidates; - - case PLUS_EXPR: - if (ARITHMETIC_TYPE_P (type1) && ARITHMETIC_TYPE_P (type2)) - break; - case ARRAY_REF: - if (INTEGRAL_TYPE_P (type1) && TYPE_PTROB_P (type2)) - { - type1 = ptrdiff_type_node; - break; - } - if (TYPE_PTROB_P (type1) && INTEGRAL_TYPE_P (type2)) - { - type2 = ptrdiff_type_node; - break; - } - return candidates; - -/* 18For every pair of promoted integral types L and R, there exist candi- - date operator functions of the form - LR operator%(L, R); - LR operator&(L, R); - LR operator^(L, R); - LR operator|(L, R); - L operator<<(L, R); - L operator>>(L, R); - where LR is the result of the usual arithmetic conversions between - types L and R. */ - - case TRUNC_MOD_EXPR: - case BIT_AND_EXPR: - case BIT_IOR_EXPR: - case BIT_XOR_EXPR: - case LSHIFT_EXPR: - case RSHIFT_EXPR: - if (INTEGRAL_TYPE_P (type1) && INTEGRAL_TYPE_P (type2)) - break; - return candidates; - -/* 19For every triple L, VQ, R), where L is an arithmetic or enumeration - type, VQ is either volatile or empty, and R is a promoted arithmetic - type, there exist candidate operator functions of the form - VQ L& operator=(VQ L&, R); - VQ L& operator*=(VQ L&, R); - VQ L& operator/=(VQ L&, R); - VQ L& operator+=(VQ L&, R); - VQ L& operator-=(VQ L&, R); - - 20For every pair T, VQ), where T is any type and VQ is either volatile - or empty, there exist candidate operator functions of the form - T*VQ& operator=(T*VQ&, T*); - - 21For every pair T, VQ), where T is a pointer to member type and VQ is - either volatile or empty, there exist candidate operator functions of - the form - VQ T& operator=(VQ T&, T); - - 22For every triple T, VQ, I), where T is a cv-qualified or cv- - unqualified complete object type, VQ is either volatile or empty, and - I is a promoted integral type, there exist candidate operator func- - tions of the form - T*VQ& operator+=(T*VQ&, I); - T*VQ& operator-=(T*VQ&, I); - - 23For every triple L, VQ, R), where L is an integral or enumeration - type, VQ is either volatile or empty, and R is a promoted integral - type, there exist candidate operator functions of the form - - VQ L& operator%=(VQ L&, R); - VQ L& operator<<=(VQ L&, R); - VQ L& operator>>=(VQ L&, R); - VQ L& operator&=(VQ L&, R); - VQ L& operator^=(VQ L&, R); - VQ L& operator|=(VQ L&, R); */ - - case MODIFY_EXPR: - switch (code2) - { - case PLUS_EXPR: - case MINUS_EXPR: - if (TYPE_PTROB_P (type1) && INTEGRAL_TYPE_P (type2)) - { - type2 = ptrdiff_type_node; - break; - } - case MULT_EXPR: - case TRUNC_DIV_EXPR: - if (ARITHMETIC_TYPE_P (type1) && ARITHMETIC_TYPE_P (type2)) - break; - return candidates; - - case TRUNC_MOD_EXPR: - case BIT_AND_EXPR: - case BIT_IOR_EXPR: - case BIT_XOR_EXPR: - case LSHIFT_EXPR: - case RSHIFT_EXPR: - if (INTEGRAL_TYPE_P (type1) && INTEGRAL_TYPE_P (type2)) - break; - return candidates; - - case NOP_EXPR: - if (ARITHMETIC_TYPE_P (type1) && ARITHMETIC_TYPE_P (type2)) - break; - if ((TYPE_PTRMEMFUNC_P (type1) && TYPE_PTRMEMFUNC_P (type2)) - || (TYPE_PTR_P (type1) && TYPE_PTR_P (type2)) - || (TYPE_PTRMEM_P (type1) && TYPE_PTRMEM_P (type2)) - || ((TYPE_PTRMEMFUNC_P (type1) - || TREE_CODE (type1) == POINTER_TYPE) - && null_ptr_cst_p (args[1]))) - { - type2 = type1; - break; - } - return candidates; - - default: - my_friendly_abort (367); - } - type1 = build_reference_type (type1); - break; - - case COND_EXPR: - /* Kludge around broken overloading rules whereby - bool ? const char& : enum is ambiguous - (between int and const char&). */ - flags |= LOOKUP_NO_TEMP_BIND; - - /* Extension: Support ?: of enumeral type. Hopefully this will not - be an extension for long. */ - if (TREE_CODE (type1) == ENUMERAL_TYPE && type1 == type2) - break; - else if (TREE_CODE (type1) == ENUMERAL_TYPE - || TREE_CODE (type2) == ENUMERAL_TYPE) - return candidates; - if (ARITHMETIC_TYPE_P (type1) && ARITHMETIC_TYPE_P (type2)) - break; - if (TREE_CODE (type1) == TREE_CODE (type2) - && (TREE_CODE (type1) == REFERENCE_TYPE - || TREE_CODE (type1) == POINTER_TYPE - || TYPE_PTRMEMFUNC_P (type1) - || IS_AGGR_TYPE (type1))) - break; - if (TREE_CODE (type1) == REFERENCE_TYPE - || TREE_CODE (type2) == REFERENCE_TYPE) - return candidates; - if (((TYPE_PTRMEMFUNC_P (type1) || TREE_CODE (type1) == POINTER_TYPE) - && null_ptr_cst_p (args[1])) - || IS_AGGR_TYPE (type1)) - { - type2 = type1; - break; - } - if (((TYPE_PTRMEMFUNC_P (type2) || TREE_CODE (type2) == POINTER_TYPE) - && null_ptr_cst_p (args[0])) - || IS_AGGR_TYPE (type2)) - { - type1 = type2; - break; - } - return candidates; - - default: - my_friendly_abort (367); - } - - /* If we're dealing with two pointer types, we need candidates - for both of them. */ - if (type2 && type1 != type2 - && TREE_CODE (type1) == TREE_CODE (type2) - && (TREE_CODE (type1) == REFERENCE_TYPE - || (TREE_CODE (type1) == POINTER_TYPE - && TYPE_PTRMEM_P (type1) == TYPE_PTRMEM_P (type2)) - || TYPE_PTRMEMFUNC_P (type1) - || IS_AGGR_TYPE (type1))) - { - candidates = build_builtin_candidate - (candidates, fnname, type1, type1, args, argtypes, flags); - return build_builtin_candidate - (candidates, fnname, type2, type2, args, argtypes, flags); - } - - return build_builtin_candidate - (candidates, fnname, type1, type2, args, argtypes, flags); -} - -tree -type_decays_to (type) - tree type; -{ - if (TREE_CODE (type) == ARRAY_TYPE) - return build_pointer_type (TREE_TYPE (type)); - if (TREE_CODE (type) == FUNCTION_TYPE) - return build_pointer_type (type); - return type; -} - -/* There are three conditions of builtin candidates: - - 1) bool-taking candidates. These are the same regardless of the input. - 2) pointer-pair taking candidates. These are generated for each type - one of the input types converts to. - 3) arithmetic candidates. According to the WP, we should generate - all of these, but I'm trying not to... */ - -static struct z_candidate * -add_builtin_candidates (candidates, code, code2, fnname, args, flags) - struct z_candidate *candidates; - enum tree_code code, code2; - tree fnname, *args; - int flags; -{ - int ref1, i; - tree type, argtypes[3], types[2]; - - for (i = 0; i < 3; ++i) - { - if (args[i]) - argtypes[i] = lvalue_type (args[i]); - else - argtypes[i] = NULL_TREE; - } - - switch (code) - { -/* 4 For every pair T, VQ), where T is an arithmetic or enumeration type, - and VQ is either volatile or empty, there exist candidate operator - functions of the form - VQ T& operator++(VQ T&); */ - - case POSTINCREMENT_EXPR: - case PREINCREMENT_EXPR: - case POSTDECREMENT_EXPR: - case PREDECREMENT_EXPR: - case MODIFY_EXPR: - ref1 = 1; - break; - -/* 24There also exist candidate operator functions of the form - bool operator!(bool); - bool operator&&(bool, bool); - bool operator||(bool, bool); */ - - case TRUTH_NOT_EXPR: - return build_builtin_candidate - (candidates, fnname, boolean_type_node, - NULL_TREE, args, argtypes, flags); - - case TRUTH_ORIF_EXPR: - case TRUTH_ANDIF_EXPR: - return build_builtin_candidate - (candidates, fnname, boolean_type_node, - boolean_type_node, args, argtypes, flags); - - case ADDR_EXPR: - case COMPOUND_EXPR: - case COMPONENT_REF: - return candidates; - - default: - ref1 = 0; - } - - types[0] = types[1] = NULL_TREE; - - for (i = 0; i < 2; ++i) - { - if (! args[i]) - ; - else if (IS_AGGR_TYPE (argtypes[i])) - { - tree convs = lookup_conversions (argtypes[i]); - - if (i == 0 && code == MODIFY_EXPR && code2 == NOP_EXPR) - return candidates; - - convs = lookup_conversions (argtypes[i]); - - if (code == COND_EXPR) - { - if (real_lvalue_p (args[i])) - types[i] = scratch_tree_cons - (NULL_TREE, build_reference_type (argtypes[i]), types[i]); - - types[i] = scratch_tree_cons - (NULL_TREE, TYPE_MAIN_VARIANT (argtypes[i]), types[i]); - } - - else if (! convs) - return candidates; - - for (; convs; convs = TREE_CHAIN (convs)) - { - type = TREE_TYPE (TREE_TYPE (TREE_VALUE (convs))); - - if (i == 0 && ref1 - && (TREE_CODE (type) != REFERENCE_TYPE - || CP_TYPE_CONST_P (TREE_TYPE (type)))) - continue; - - if (code == COND_EXPR && TREE_CODE (type) == REFERENCE_TYPE) - types[i] = scratch_tree_cons (NULL_TREE, type, types[i]); - - type = non_reference (type); - if (i != 0 || ! ref1) - { - type = TYPE_MAIN_VARIANT (type_decays_to (type)); - if (code == COND_EXPR && TREE_CODE (type) == ENUMERAL_TYPE) - types[i] = scratch_tree_cons (NULL_TREE, type, types[i]); - if (INTEGRAL_TYPE_P (type)) - type = type_promotes_to (type); - } - - if (! value_member (type, types[i])) - types[i] = scratch_tree_cons (NULL_TREE, type, types[i]); - } - } - else - { - if (code == COND_EXPR && real_lvalue_p (args[i])) - types[i] = scratch_tree_cons - (NULL_TREE, build_reference_type (argtypes[i]), types[i]); - type = non_reference (argtypes[i]); - if (i != 0 || ! ref1) - { - type = TYPE_MAIN_VARIANT (type_decays_to (type)); - if (code == COND_EXPR && TREE_CODE (type) == ENUMERAL_TYPE) - types[i] = scratch_tree_cons (NULL_TREE, type, types[i]); - if (INTEGRAL_TYPE_P (type)) - type = type_promotes_to (type); - } - types[i] = scratch_tree_cons (NULL_TREE, type, types[i]); - } - } - - for (; types[0]; types[0] = TREE_CHAIN (types[0])) - { - if (types[1]) - for (type = types[1]; type; type = TREE_CHAIN (type)) - candidates = add_builtin_candidate - (candidates, code, code2, fnname, TREE_VALUE (types[0]), - TREE_VALUE (type), args, argtypes, flags); - else - candidates = add_builtin_candidate - (candidates, code, code2, fnname, TREE_VALUE (types[0]), - NULL_TREE, args, argtypes, flags); - } - - return candidates; -} - - -/* If TMPL can be successfully instantiated as indicated by - EXPLICIT_TARGS and ARGLIST, adds the instantiation to CANDIDATES. - - TMPL is the template. EXPLICIT_TARGS are any explicit template - arguments. ARGLIST is the arguments provided at the call-site. - The RETURN_TYPE is the desired type for conversion operators. If - OBJ is NULL_TREE, FLAGS are as for add_function_candidate. If an - OBJ is supplied, FLAGS are ignored, and OBJ is as for - add_conv_candidate. */ - -static struct z_candidate* -add_template_candidate_real (candidates, tmpl, explicit_targs, - arglist, return_type, flags, - obj, strict) - struct z_candidate *candidates; - tree tmpl, explicit_targs, arglist, return_type; - int flags; - tree obj; - unification_kind_t strict; -{ - int ntparms = DECL_NTPARMS (tmpl); - tree targs = make_scratch_vec (ntparms); - struct z_candidate *cand; - int i; - tree fn; - - i = fn_type_unification (tmpl, explicit_targs, targs, arglist, - return_type, strict, NULL_TREE); - - if (i != 0) - return candidates; - - fn = instantiate_template (tmpl, targs); - if (fn == error_mark_node) - return candidates; - - if (obj != NULL_TREE) - /* Aha, this is a conversion function. */ - cand = add_conv_candidate (candidates, fn, obj, arglist); - else - cand = add_function_candidate (candidates, fn, arglist, flags); - if (DECL_TI_TEMPLATE (fn) != tmpl) - /* This situation can occur if a member template of a template - class is specialized. Then, instantiate_template might return - an instantiation of the specialization, in which case the - DECL_TI_TEMPLATE field will point at the original - specialization. For example: - - template struct S { template void f(U); - template <> void f(int) {}; }; - S sd; - sd.f(3); - - Here, TMPL will be template S::f(U). - And, instantiate template will give us the specialization - template <> S::f(int). But, the DECL_TI_TEMPLATE field - for this will point at template template <> S::f(int), - so that we can find the definition. For the purposes of - overload resolution, however, we want the original TMPL. */ - cand->template = tree_cons (tmpl, targs, NULL_TREE); - else - cand->template = DECL_TEMPLATE_INFO (fn); - - return cand; -} - - -static struct z_candidate * -add_template_candidate (candidates, tmpl, explicit_targs, - arglist, return_type, flags, strict) - struct z_candidate *candidates; - tree tmpl, explicit_targs, arglist, return_type; - int flags; - unification_kind_t strict; -{ - return - add_template_candidate_real (candidates, tmpl, explicit_targs, - arglist, return_type, flags, - NULL_TREE, strict); -} - - -static struct z_candidate * -add_template_conv_candidate (candidates, tmpl, obj, arglist, return_type) - struct z_candidate *candidates; - tree tmpl, obj, arglist, return_type; -{ - return - add_template_candidate_real (candidates, tmpl, NULL_TREE, arglist, - return_type, 0, obj, DEDUCE_CONV); -} - - -static int -any_viable (cands) - struct z_candidate *cands; -{ - for (; cands; cands = cands->next) - if (pedantic ? cands->viable == 1 : cands->viable) - return 1; - return 0; -} - -static struct z_candidate * -splice_viable (cands) - struct z_candidate *cands; -{ - struct z_candidate **p = &cands; - - for (; *p; ) - { - if (pedantic ? (*p)->viable == 1 : (*p)->viable) - p = &((*p)->next); - else - *p = (*p)->next; - } - - return cands; -} - -static tree -build_this (obj) - tree obj; -{ - /* Fix this to work on non-lvalues. */ - if (IS_SIGNATURE_POINTER (TREE_TYPE (obj)) - || IS_SIGNATURE_REFERENCE (TREE_TYPE (obj))) - return obj; - else - return build_unary_op (ADDR_EXPR, obj, 0); -} - -static void -print_z_candidates (candidates) - struct z_candidate *candidates; -{ - char *str = "candidates are:"; - for (; candidates; candidates = candidates->next) - { - if (TREE_CODE (candidates->fn) == IDENTIFIER_NODE) - { - if (candidates->fn == ansi_opname [COND_EXPR]) - cp_error ("%s %D(%T, %T, %T) ", str, candidates->fn, - TREE_TYPE (TREE_VEC_ELT (candidates->convs, 0)), - TREE_TYPE (TREE_VEC_ELT (candidates->convs, 1)), - TREE_TYPE (TREE_VEC_ELT (candidates->convs, 2))); - else if (TREE_VEC_LENGTH (candidates->convs) == 2) - cp_error ("%s %D(%T, %T) ", str, candidates->fn, - TREE_TYPE (TREE_VEC_ELT (candidates->convs, 0)), - TREE_TYPE (TREE_VEC_ELT (candidates->convs, 1))); - else - cp_error ("%s %D(%T) ", str, candidates->fn, - TREE_TYPE (TREE_VEC_ELT (candidates->convs, 0))); - } - else if (TYPE_P (candidates->fn)) - cp_error ("%s %T ", str, candidates->fn); - else - cp_error_at ("%s %+D%s", str, candidates->fn, - candidates->viable == -1 ? " " : ""); - str = " "; - } -} - -/* Returns the best overload candidate to perform the requested - conversion. This function is used for three the overloading situations - described in [over.match.copy], [over.match.conv], and [over.match.ref]. - If TOTYPE is a REFERENCE_TYPE, we're trying to find an lvalue binding as - per [dcl.init.ref], so we ignore temporary bindings. */ - -static struct z_candidate * -build_user_type_conversion_1 (totype, expr, flags) - tree totype, expr; - int flags; -{ - struct z_candidate *candidates, *cand; - tree fromtype = TREE_TYPE (expr); - tree ctors = NULL_TREE, convs = NULL_TREE, *p; - tree args = NULL_TREE; - tree templates = NULL_TREE; - - if (IS_AGGR_TYPE (totype)) - ctors = lookup_fnfields (TYPE_BINFO (totype), ctor_identifier, 0); - if (IS_AGGR_TYPE (fromtype) - && (! IS_AGGR_TYPE (totype) || ! DERIVED_FROM_P (totype, fromtype))) - convs = lookup_conversions (fromtype); - - candidates = 0; - flags |= LOOKUP_NO_CONVERSION; - - if (ctors) - { - tree t = build_int_2 (0, 0); - TREE_TYPE (t) = build_pointer_type (totype); - args = build_scratch_list (NULL_TREE, expr); - if (TYPE_USES_VIRTUAL_BASECLASSES (totype)) - args = scratch_tree_cons (NULL_TREE, integer_one_node, args); - args = scratch_tree_cons (NULL_TREE, t, args); - - ctors = TREE_VALUE (ctors); - } - for (; ctors; ctors = OVL_NEXT (ctors)) - { - tree ctor = OVL_CURRENT (ctors); - if (DECL_NONCONVERTING_P (ctor)) - continue; - - if (TREE_CODE (ctor) == TEMPLATE_DECL) - { - templates = scratch_tree_cons (NULL_TREE, ctor, templates); - candidates = - add_template_candidate (candidates, ctor, - NULL_TREE, args, NULL_TREE, flags, - DEDUCE_CALL); - } - else - candidates = add_function_candidate (candidates, ctor, - args, flags); - - if (candidates) - { - candidates->second_conv = build1 (IDENTITY_CONV, totype, NULL_TREE); - candidates->basetype_path = TYPE_BINFO (totype); - } - } - - if (convs) - args = build_scratch_list (NULL_TREE, build_this (expr)); - - for (; convs; convs = TREE_CHAIN (convs)) - { - tree fns = TREE_VALUE (convs); - int convflags = LOOKUP_NO_CONVERSION; - tree ics; - - /* If we are called to convert to a reference type, we are trying to - find an lvalue binding, so don't even consider temporaries. If - we don't find an lvalue binding, the caller will try again to - look for a temporary binding. */ - if (TREE_CODE (totype) == REFERENCE_TYPE) - convflags |= LOOKUP_NO_TEMP_BIND; - - if (TREE_CODE (OVL_CURRENT (fns)) != TEMPLATE_DECL) - ics = implicit_conversion - (totype, TREE_TYPE (TREE_TYPE (OVL_CURRENT (fns))), 0, convflags); - else - /* We can't compute this yet. */ - ics = error_mark_node; - - if (TREE_CODE (totype) == REFERENCE_TYPE && ics && ICS_BAD_FLAG (ics)) - /* ignore the near match. */; - else if (ics) - for (; fns; fns = OVL_NEXT (fns)) - { - tree fn = OVL_CURRENT (fns); - struct z_candidate *old_candidates = candidates; - - if (TREE_CODE (fn) == TEMPLATE_DECL) - { - templates = scratch_tree_cons (NULL_TREE, fn, templates); - candidates = - add_template_candidate (candidates, fn, NULL_TREE, - args, totype, flags, - DEDUCE_CONV); - } - else - candidates = add_function_candidate (candidates, fn, - args, flags); - - if (candidates != old_candidates) - { - if (TREE_CODE (fn) == TEMPLATE_DECL) - ics = implicit_conversion - (totype, TREE_TYPE (TREE_TYPE (candidates->fn)), - 0, convflags); - - candidates->second_conv = ics; - candidates->basetype_path = TREE_PURPOSE (convs); - - if (ics == NULL_TREE) - candidates->viable = 0; - else if (candidates->viable == 1 && ICS_BAD_FLAG (ics)) - candidates->viable = -1; - } - } - } - - if (! any_viable (candidates)) - { -#if 0 - if (flags & LOOKUP_COMPLAIN) - { - if (candidates && ! candidates->next) - /* say why this one won't work or try to be loose */; - else - cp_error ("no viable candidates"); - } -#endif - - return 0; - } - - candidates = splice_viable (candidates); - cand = tourney (candidates); - - if (cand == 0) - { - if (flags & LOOKUP_COMPLAIN) - { - cp_error ("conversion from `%T' to `%T' is ambiguous", - fromtype, totype); - print_z_candidates (candidates); - } - - cand = candidates; /* any one will do */ - cand->second_conv = build1 (AMBIG_CONV, totype, expr); - ICS_USER_FLAG (cand->second_conv) = 1; - ICS_BAD_FLAG (cand->second_conv) = 1; - - return cand; - } - - for (p = &(cand->second_conv); TREE_CODE (*p) != IDENTITY_CONV; ) - p = &(TREE_OPERAND (*p, 0)); - - /* Pedantically, normal function declarations are never considered - to refer to template instantiations, so we only do this with - -fguiding-decls. */ - if (flag_guiding_decls && templates && ! cand->template - && !DECL_INITIAL (cand->fn) - && TREE_CODE (TREE_TYPE (cand->fn)) != METHOD_TYPE) - add_maybe_template (cand->fn, templates); - - *p = build - (USER_CONV, - (DECL_CONSTRUCTOR_P (cand->fn) - ? totype : non_reference (TREE_TYPE (TREE_TYPE (cand->fn)))), - expr, build_expr_ptr_wrapper (cand)); - ICS_USER_FLAG (cand->second_conv) = 1; - if (cand->viable == -1) - ICS_BAD_FLAG (cand->second_conv) = 1; - - return cand; -} - -tree -build_user_type_conversion (totype, expr, flags) - tree totype, expr; - int flags; -{ - struct z_candidate *cand - = build_user_type_conversion_1 (totype, expr, flags); - - if (cand) - { - if (TREE_CODE (cand->second_conv) == AMBIG_CONV) - return error_mark_node; - return convert_from_reference (convert_like (cand->second_conv, expr)); - } - return NULL_TREE; -} - -/* Do any initial processing on the arguments to a function call. */ - -static tree -resolve_args (args) - tree args; -{ - tree t; - for (t = args; t; t = TREE_CHAIN (t)) - { - if (TREE_VALUE (t) == error_mark_node) - return error_mark_node; - else if (TREE_CODE (TREE_TYPE (TREE_VALUE (t))) == VOID_TYPE) - { - error ("invalid use of void expression"); - return error_mark_node; - } - else if (TREE_CODE (TREE_VALUE (t)) == OFFSET_REF) - TREE_VALUE (t) = resolve_offset_ref (TREE_VALUE (t)); - } - return args; -} - -tree -build_new_function_call (fn, args) - tree fn, args; -{ - struct z_candidate *candidates = 0, *cand; - tree explicit_targs = NULL_TREE; - int template_only = 0; - - if (TREE_CODE (fn) == TEMPLATE_ID_EXPR) - { - explicit_targs = TREE_OPERAND (fn, 1); - fn = TREE_OPERAND (fn, 0); - template_only = 1; - } - - if (really_overloaded_fn (fn)) - { - tree t1; - tree templates = NULL_TREE; - - args = resolve_args (args); - - if (args == error_mark_node) - return error_mark_node; - - for (t1 = fn; t1; t1 = OVL_CHAIN (t1)) - { - tree t = OVL_FUNCTION (t1); - if (TREE_CODE (t) == TEMPLATE_DECL) - { - templates = scratch_tree_cons (NULL_TREE, t, templates); - candidates = add_template_candidate - (candidates, t, explicit_targs, args, NULL_TREE, - LOOKUP_NORMAL, DEDUCE_CALL); - } - else if (! template_only) - candidates = add_function_candidate - (candidates, t, args, LOOKUP_NORMAL); - } - - if (! any_viable (candidates)) - { - if (candidates && ! candidates->next) - return build_function_call (candidates->fn, args); - cp_error ("no matching function for call to `%D (%A)'", - DECL_NAME (OVL_FUNCTION (fn)), args); - if (candidates) - print_z_candidates (candidates); - return error_mark_node; - } - candidates = splice_viable (candidates); - cand = tourney (candidates); - - if (cand == 0) - { - cp_error ("call of overloaded `%D (%A)' is ambiguous", - DECL_NAME (OVL_FUNCTION (fn)), args); - print_z_candidates (candidates); - return error_mark_node; - } - - /* Pedantically, normal function declarations are never considered - to refer to template instantiations, so we only do this with - -fguiding-decls. */ - if (flag_guiding_decls && templates && ! cand->template - && ! DECL_INITIAL (cand->fn)) - add_maybe_template (cand->fn, templates); - - return build_over_call (cand, args, LOOKUP_NORMAL); - } - - /* This is not really overloaded. */ - fn = OVL_CURRENT (fn); - - return build_function_call (fn, args); -} - -static tree -build_object_call (obj, args) - tree obj, args; -{ - struct z_candidate *candidates = 0, *cand; - tree fns, convs, mem_args = NULL_TREE; - tree type = TREE_TYPE (obj); - - if (TYPE_PTRMEMFUNC_P (type)) - { - /* It's no good looking for an overloaded operator() on a - pointer-to-member-function. */ - cp_error ("pointer-to-member function %E cannot be called", obj); - cp_error ("without an object; consider using .* or ->*"); - return error_mark_node; - } - - fns = lookup_fnfields (TYPE_BINFO (type), ansi_opname [CALL_EXPR], 1); - if (fns == error_mark_node) - return error_mark_node; - - args = resolve_args (args); - - if (args == error_mark_node) - return error_mark_node; - - if (fns) - { - tree base = TREE_PURPOSE (fns); - mem_args = scratch_tree_cons (NULL_TREE, build_this (obj), args); - - for (fns = TREE_VALUE (fns); fns; fns = OVL_NEXT (fns)) - { - tree fn = OVL_CURRENT (fns); - if (TREE_CODE (fn) == TEMPLATE_DECL) - { - candidates - = add_template_candidate (candidates, fn, NULL_TREE, - mem_args, NULL_TREE, - LOOKUP_NORMAL, DEDUCE_CALL); - } - else - candidates = add_function_candidate - (candidates, fn, mem_args, LOOKUP_NORMAL); - - if (candidates) - candidates->basetype_path = base; - } - } - - convs = lookup_conversions (type); - - for (; convs; convs = TREE_CHAIN (convs)) - { - tree fns = TREE_VALUE (convs); - tree totype = TREE_TYPE (TREE_TYPE (OVL_CURRENT (fns))); - - if ((TREE_CODE (totype) == POINTER_TYPE - || TREE_CODE (totype) == REFERENCE_TYPE) - && TREE_CODE (TREE_TYPE (totype)) == FUNCTION_TYPE) - for (; fns; fns = OVL_NEXT (fns)) - { - tree fn = OVL_CURRENT (fns); - if (TREE_CODE (fn) == TEMPLATE_DECL) - { - candidates = add_template_conv_candidate (candidates, - fn, - obj, - args, - totype); - } - else - candidates = add_conv_candidate (candidates, fn, obj, args); - - if (candidates) - candidates->basetype_path = TREE_PURPOSE (convs); - } - } - - if (! any_viable (candidates)) - { - cp_error ("no match for call to `(%T) (%A)'", TREE_TYPE (obj), args); - print_z_candidates (candidates); - return error_mark_node; - } - - candidates = splice_viable (candidates); - cand = tourney (candidates); - - if (cand == 0) - { - cp_error ("call of `(%T) (%A)' is ambiguous", TREE_TYPE (obj), args); - print_z_candidates (candidates); - return error_mark_node; - } - - if (DECL_NAME (cand->fn) == ansi_opname [CALL_EXPR]) - return build_over_call (cand, mem_args, LOOKUP_NORMAL); - - obj = convert_like (TREE_VEC_ELT (cand->convs, 0), obj); - - /* FIXME */ - return build_function_call (obj, args); -} - -static void -op_error (code, code2, arg1, arg2, arg3, problem) - enum tree_code code, code2; - tree arg1, arg2, arg3; - char *problem; -{ - char * opname - = (code == MODIFY_EXPR ? assignop_tab [code2] : opname_tab [code]); - - switch (code) - { - case COND_EXPR: - cp_error ("%s for `%T ? %T : %T'", problem, - error_type (arg1), error_type (arg2), error_type (arg3)); - break; - case POSTINCREMENT_EXPR: - case POSTDECREMENT_EXPR: - cp_error ("%s for `%T%s'", problem, error_type (arg1), opname); - break; - case ARRAY_REF: - cp_error ("%s for `%T[%T]'", problem, - error_type (arg1), error_type (arg2)); - break; - default: - if (arg2) - cp_error ("%s for `%T %s %T'", problem, - error_type (arg1), opname, error_type (arg2)); - else - cp_error ("%s for `%s%T'", problem, opname, error_type (arg1)); - } -} - -tree -build_new_op (code, flags, arg1, arg2, arg3) - enum tree_code code; - int flags; - tree arg1, arg2, arg3; -{ - struct z_candidate *candidates = 0, *cand; - tree fns, mem_arglist = NULL_TREE, arglist, fnname; - enum tree_code code2 = NOP_EXPR; - tree templates = NULL_TREE; - tree conv; - - if (arg1 == error_mark_node - || arg2 == error_mark_node - || arg3 == error_mark_node) - return error_mark_node; - - /* This can happen if a template takes all non-type parameters, e.g. - undeclared_template<1, 5, 72>a; */ - if (code == LT_EXPR && TREE_CODE (arg1) == TEMPLATE_DECL) - { - cp_error ("`%D' must be declared before use", arg1); - return error_mark_node; - } - - if (code == MODIFY_EXPR) - { - code2 = TREE_CODE (arg3); - arg3 = NULL_TREE; - fnname = ansi_assopname[code2]; - } - else - fnname = ansi_opname[code]; - - switch (code) - { - case NEW_EXPR: - case VEC_NEW_EXPR: - case VEC_DELETE_EXPR: - case DELETE_EXPR: - /* Use build_op_new_call and build_op_delete_call instead. */ - my_friendly_abort (981018); - - case CALL_EXPR: - return build_object_call (arg1, arg2); - - default: - break; - } - - /* The comma operator can have void args. */ - if (TREE_CODE (arg1) == OFFSET_REF) - arg1 = resolve_offset_ref (arg1); - if (arg2 && TREE_CODE (arg2) == OFFSET_REF) - arg2 = resolve_offset_ref (arg2); - if (arg3 && TREE_CODE (arg3) == OFFSET_REF) - arg3 = resolve_offset_ref (arg3); - - if (code == COND_EXPR) - { - if (arg2 == NULL_TREE - || TREE_CODE (TREE_TYPE (arg2)) == VOID_TYPE - || TREE_CODE (TREE_TYPE (arg3)) == VOID_TYPE - || (! IS_OVERLOAD_TYPE (TREE_TYPE (arg2)) - && ! IS_OVERLOAD_TYPE (TREE_TYPE (arg3)))) - goto builtin; - } - else if (! IS_OVERLOAD_TYPE (TREE_TYPE (arg1)) - && (! arg2 || ! IS_OVERLOAD_TYPE (TREE_TYPE (arg2)))) - goto builtin; - - if (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR) - arg2 = integer_zero_node; - - if (arg2 && arg3) - arglist = scratch_tree_cons (NULL_TREE, arg1, scratch_tree_cons - (NULL_TREE, arg2, build_scratch_list (NULL_TREE, arg3))); - else if (arg2) - arglist = scratch_tree_cons (NULL_TREE, arg1, build_scratch_list (NULL_TREE, arg2)); - else - arglist = build_scratch_list (NULL_TREE, arg1); - - fns = lookup_function_nonclass (fnname, arglist); - - if (fns && TREE_CODE (fns) == TREE_LIST) - fns = TREE_VALUE (fns); - for (; fns; fns = OVL_NEXT (fns)) - { - tree fn = OVL_CURRENT (fns); - if (TREE_CODE (fn) == TEMPLATE_DECL) - { - templates = scratch_tree_cons (NULL_TREE, fn, templates); - candidates - = add_template_candidate (candidates, fn, NULL_TREE, - arglist, TREE_TYPE (fnname), - flags, DEDUCE_CALL); - } - else - candidates = add_function_candidate (candidates, fn, arglist, flags); - } - - if (IS_AGGR_TYPE (TREE_TYPE (arg1))) - { - fns = lookup_fnfields (TYPE_BINFO (TREE_TYPE (arg1)), fnname, 1); - if (fns == error_mark_node) - return fns; - } - else - fns = NULL_TREE; - - if (fns) - { - tree basetype = TREE_PURPOSE (fns); - mem_arglist = scratch_tree_cons (NULL_TREE, build_this (arg1), TREE_CHAIN (arglist)); - for (fns = TREE_VALUE (fns); fns; fns = OVL_NEXT (fns)) - { - tree fn = OVL_CURRENT (fns); - tree this_arglist; - - if (TREE_CODE (TREE_TYPE (fn)) == METHOD_TYPE) - this_arglist = mem_arglist; - else - this_arglist = arglist; - - if (TREE_CODE (fn) == TEMPLATE_DECL) - { - /* A member template. */ - templates = scratch_tree_cons (NULL_TREE, fn, templates); - candidates - = add_template_candidate (candidates, fn, NULL_TREE, - this_arglist, TREE_TYPE (fnname), - flags, DEDUCE_CALL); - } - else - candidates = add_function_candidate - (candidates, fn, this_arglist, flags); - - if (candidates) - candidates->basetype_path = basetype; - } - } - - { - tree args[3]; - - /* Rearrange the arguments for ?: so that add_builtin_candidate only has - to know about two args; a builtin candidate will always have a first - parameter of type bool. We'll handle that in - build_builtin_candidate. */ - if (code == COND_EXPR) - { - args[0] = arg2; - args[1] = arg3; - args[2] = arg1; - } - else - { - args[0] = arg1; - args[1] = arg2; - args[2] = NULL_TREE; - } - - candidates = add_builtin_candidates - (candidates, code, code2, fnname, args, flags); - } - - if (! any_viable (candidates)) - { - switch (code) - { - case POSTINCREMENT_EXPR: - case POSTDECREMENT_EXPR: - /* Look for an `operator++ (int)'. If they didn't have - one, then we fall back to the old way of doing things. */ - if (flags & LOOKUP_COMPLAIN) - cp_pedwarn ("no `%D (int)' declared for postfix `%s', trying prefix operator instead", - fnname, opname_tab [code]); - if (code == POSTINCREMENT_EXPR) - code = PREINCREMENT_EXPR; - else - code = PREDECREMENT_EXPR; - return build_new_op (code, flags, arg1, NULL_TREE, NULL_TREE); - - /* The caller will deal with these. */ - case ADDR_EXPR: - case COMPOUND_EXPR: - case COMPONENT_REF: - return NULL_TREE; - - default: - break; - } - if (flags & LOOKUP_COMPLAIN) - { - op_error (code, code2, arg1, arg2, arg3, "no match"); - print_z_candidates (candidates); - } - return error_mark_node; - } - candidates = splice_viable (candidates); - cand = tourney (candidates); - - if (cand == 0) - { - if (flags & LOOKUP_COMPLAIN) - { - op_error (code, code2, arg1, arg2, arg3, "ambiguous overload"); - print_z_candidates (candidates); - } - return error_mark_node; - } - - if (TREE_CODE (cand->fn) == FUNCTION_DECL) - { - extern int warn_synth; - if (warn_synth - && fnname == ansi_opname[MODIFY_EXPR] - && DECL_ARTIFICIAL (cand->fn) - && candidates->next - && ! candidates->next->next) - { - cp_warning ("using synthesized `%#D' for copy assignment", - cand->fn); - cp_warning_at (" where cfront would use `%#D'", - cand == candidates - ? candidates->next->fn - : candidates->fn); - } - - /* Pedantically, normal function declarations are never considered - to refer to template instantiations, so we only do this with - -fguiding-decls. */ - if (flag_guiding_decls && templates && ! cand->template - && ! DECL_INITIAL (cand->fn) - && TREE_CODE (TREE_TYPE (cand->fn)) != METHOD_TYPE) - add_maybe_template (cand->fn, templates); - - return build_over_call - (cand, - TREE_CODE (TREE_TYPE (cand->fn)) == METHOD_TYPE - ? mem_arglist : arglist, - LOOKUP_NORMAL); - } - - /* Check for comparison of different enum types. */ - switch (code) - { - case GT_EXPR: - case LT_EXPR: - case GE_EXPR: - case LE_EXPR: - case EQ_EXPR: - case NE_EXPR: - if (TREE_CODE (TREE_TYPE (arg1)) == ENUMERAL_TYPE - && TREE_CODE (TREE_TYPE (arg2)) == ENUMERAL_TYPE - && (TYPE_MAIN_VARIANT (TREE_TYPE (arg1)) - != TYPE_MAIN_VARIANT (TREE_TYPE (arg2)))) - { - cp_warning ("comparison between `%#T' and `%#T'", - TREE_TYPE (arg1), TREE_TYPE (arg2)); - } - break; - default: - break; - } - - /* We need to strip any leading REF_BIND so that bitfields don't cause - errors. This should not remove any important conversions, because - builtins don't apply to class objects directly. */ - conv = TREE_VEC_ELT (cand->convs, 0); - if (TREE_CODE (conv) == REF_BIND) - conv = TREE_OPERAND (conv, 0); - arg1 = convert_like (conv, arg1); - if (arg2) - arg2 = convert_like (TREE_VEC_ELT (cand->convs, 1), arg2); - if (arg3) - arg3 = convert_like (TREE_VEC_ELT (cand->convs, 2), arg3); - -builtin: - switch (code) - { - case MODIFY_EXPR: - return build_modify_expr (arg1, code2, arg2); - - case INDIRECT_REF: - return build_indirect_ref (arg1, "unary *"); - - case PLUS_EXPR: - case MINUS_EXPR: - case MULT_EXPR: - case TRUNC_DIV_EXPR: - case GT_EXPR: - case LT_EXPR: - case GE_EXPR: - case LE_EXPR: - case EQ_EXPR: - case NE_EXPR: - case MAX_EXPR: - case MIN_EXPR: - case LSHIFT_EXPR: - case RSHIFT_EXPR: - case TRUNC_MOD_EXPR: - case BIT_AND_EXPR: - case BIT_IOR_EXPR: - case BIT_XOR_EXPR: - case TRUTH_ANDIF_EXPR: - case TRUTH_ORIF_EXPR: - return build_binary_op_nodefault (code, arg1, arg2, code); - - case CONVERT_EXPR: - case NEGATE_EXPR: - case BIT_NOT_EXPR: - case TRUTH_NOT_EXPR: - case PREINCREMENT_EXPR: - case POSTINCREMENT_EXPR: - case PREDECREMENT_EXPR: - case POSTDECREMENT_EXPR: - case REALPART_EXPR: - case IMAGPART_EXPR: - return build_unary_op (code, arg1, candidates != 0); - - case ARRAY_REF: - return build_array_ref (arg1, arg2); - - case COND_EXPR: - return build_conditional_expr (arg1, arg2, arg3); - - case MEMBER_REF: - return build_m_component_ref - (build_indirect_ref (arg1, NULL_PTR), arg2); - - /* The caller will deal with these. */ - case ADDR_EXPR: - case COMPONENT_REF: - case COMPOUND_EXPR: - return NULL_TREE; - - default: - my_friendly_abort (367); - return NULL_TREE; - } -} - -/* Build up a call to operator new. This has to be handled differently - from other operators in the way lookup is handled; first members are - considered, then globals. CODE is either NEW_EXPR or VEC_NEW_EXPR. - TYPE is the type to be created. ARGS are any new-placement args. - FLAGS are the usual overloading flags. */ - -tree -build_op_new_call (code, type, args, flags) - enum tree_code code; - tree type, args; - int flags; -{ - tree fnname = ansi_opname[code]; - - if (IS_AGGR_TYPE (type) && ! (flags & LOOKUP_GLOBAL) - && (TYPE_GETS_NEW (type) & (1 << (code == VEC_NEW_EXPR)))) - { - return build_method_call (build_dummy_object (type), - fnname, args, NULL_TREE, flags); - } - else - return build_new_function_call - (lookup_function_nonclass (fnname, args), args); -} - -/* Build a call to operator delete. This has to be handled very specially, - because the restrictions on what signatures match are different from all - other call instances. For a normal delete, only a delete taking (void *) - or (void *, size_t) is accepted. For a placement delete, only an exact - match with the placement new is accepted. - - CODE is either DELETE_EXPR or VEC_DELETE_EXPR. - ADDR is the pointer to be deleted. For placement delete, it is also - used to determine what the corresponding new looked like. - SIZE is the size of the memory block to be deleted. - FLAGS are the usual overloading flags. - PLACEMENT is the corresponding placement new call, or 0. */ - -tree -build_op_delete_call (code, addr, size, flags, placement) - enum tree_code code; - tree addr, size, placement; - int flags; -{ - tree fn, fns, fnname, fntype, argtypes, args, type; - - if (addr == error_mark_node) - return error_mark_node; - - type = TREE_TYPE (TREE_TYPE (addr)); - fnname = ansi_opname[code]; - - if (IS_AGGR_TYPE (type) && ! (flags & LOOKUP_GLOBAL)) - /* In [class.free] - - If the result of the lookup is ambiguous or inaccessible, or if - the lookup selects a placement deallocation function, the - program is ill-formed. - - Therefore, we ask lookup_fnfields to complain ambout ambiguity. */ - { - fns = lookup_fnfields (TYPE_BINFO (type), fnname, 1); - if (fns == error_mark_node) - return error_mark_node; - } - else - fns = NULL_TREE; - - if (fns == NULL_TREE) - fns = lookup_name_nonclass (fnname); - - if (placement) - { - /* placement is a CALL_EXPR around an ADDR_EXPR around a function. */ - - /* Extract the function. */ - argtypes = TREE_OPERAND (TREE_OPERAND (placement, 0), 0); - /* Then the second parm type. */ - argtypes = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (argtypes))); - - /* Also the second argument. */ - args = TREE_CHAIN (TREE_OPERAND (placement, 1)); - } - else - { - /* First try it without the size argument. */ - argtypes = void_list_node; - args = NULL_TREE; - } - - argtypes = tree_cons (NULL_TREE, ptr_type_node, argtypes); - fntype = build_function_type (void_type_node, argtypes); - - /* Strip const and volatile from addr. */ - if (type != TYPE_MAIN_VARIANT (type)) - addr = cp_convert (build_pointer_type (TYPE_MAIN_VARIANT (type)), addr); - - fn = instantiate_type (fntype, fns, 0); - - if (fn != error_mark_node) - { - if (TREE_CODE (fns) == TREE_LIST) - /* Member functions. */ - enforce_access (TREE_PURPOSE (fns), fn); - return build_function_call (fn, expr_tree_cons (NULL_TREE, addr, args)); - } - - /* If we are doing placement delete we do nothing if we don't find a - matching op delete. */ - if (placement) - return NULL_TREE; - - /* Normal delete; now try to find a match including the size argument. */ - argtypes = tree_cons (NULL_TREE, ptr_type_node, - tree_cons (NULL_TREE, sizetype, void_list_node)); - fntype = build_function_type (void_type_node, argtypes); - - fn = instantiate_type (fntype, fns, 0); - - if (fn != error_mark_node) - { - if (TREE_CODE (fns) == TREE_LIST) - /* Member functions. */ - enforce_access (TREE_PURPOSE (fns), fn); - return build_function_call - (fn, expr_tree_cons (NULL_TREE, addr, - build_expr_list (NULL_TREE, size))); - } - - /* finish_function passes LOOKUP_SPECULATIVELY if we're in a - destructor, in which case the error should be deferred - until someone actually tries to delete one of these. */ - if (flags & LOOKUP_SPECULATIVELY) - return NULL_TREE; - - cp_error ("no suitable operator delete for `%T'", type); - return error_mark_node; -} - -/* If the current scope isn't allowed to access DECL along - BASETYPE_PATH, give an error. */ - -void -enforce_access (basetype_path, decl) - tree basetype_path, decl; -{ - tree access = compute_access (basetype_path, decl); - - if (access == access_private_node) - { - cp_error_at ("`%+#D' is %s", decl, - TREE_PRIVATE (decl) ? "private" - : "from private base class"); - error ("within this context"); - } - else if (access == access_protected_node) - { - cp_error_at ("`%+#D' %s", decl, - TREE_PROTECTED (decl) ? "is protected" - : "has protected accessibility"); - error ("within this context"); - } -} - -/* Perform the conversions in CONVS on the expression EXPR. */ - -static tree -convert_like (convs, expr) - tree convs, expr; -{ - if (ICS_BAD_FLAG (convs) - && TREE_CODE (convs) != USER_CONV - && TREE_CODE (convs) != AMBIG_CONV) - { - tree t = convs; - for (; t; t = TREE_OPERAND (t, 0)) - { - if (TREE_CODE (t) == USER_CONV) - { - expr = convert_like (t, expr); - break; - } - else if (TREE_CODE (t) == AMBIG_CONV) - return convert_like (t, expr); - else if (TREE_CODE (t) == IDENTITY_CONV) - break; - } - return convert_for_initialization - (NULL_TREE, TREE_TYPE (convs), expr, LOOKUP_NORMAL, - "conversion", NULL_TREE, 0); - } - - switch (TREE_CODE (convs)) - { - case USER_CONV: - { - struct z_candidate *cand - = WRAPPER_PTR (TREE_OPERAND (convs, 1)); - tree fn = cand->fn; - tree args; - - if (DECL_CONSTRUCTOR_P (fn)) - { - tree t = build_int_2 (0, 0); - TREE_TYPE (t) = build_pointer_type (DECL_CONTEXT (fn)); - - args = build_scratch_list (NULL_TREE, expr); - if (TYPE_USES_VIRTUAL_BASECLASSES (DECL_CONTEXT (fn))) - args = scratch_tree_cons (NULL_TREE, integer_one_node, args); - args = scratch_tree_cons (NULL_TREE, t, args); - } - else - args = build_this (expr); - expr = build_over_call (cand, args, LOOKUP_NORMAL); - - /* If this is a constructor or a function returning an aggr type, - we need to build up a TARGET_EXPR. */ - if (DECL_CONSTRUCTOR_P (fn)) - expr = build_cplus_new (TREE_TYPE (convs), expr); - - return expr; - } - case IDENTITY_CONV: - if (type_unknown_p (expr)) - expr = instantiate_type (TREE_TYPE (convs), expr, 1); - if (TREE_READONLY_DECL_P (expr)) - expr = decl_constant_value (expr); - return expr; - case AMBIG_CONV: - /* Call build_user_type_conversion again for the error. */ - return build_user_type_conversion - (TREE_TYPE (convs), TREE_OPERAND (convs, 0), LOOKUP_NORMAL); - - default: - break; - }; - - expr = convert_like (TREE_OPERAND (convs, 0), expr); - if (expr == error_mark_node) - return error_mark_node; - - switch (TREE_CODE (convs)) - { - case RVALUE_CONV: - if (! IS_AGGR_TYPE (TREE_TYPE (convs))) - return expr; - /* else fall through */ - case BASE_CONV: - { - tree cvt_expr = build_user_type_conversion - (TREE_TYPE (convs), expr, LOOKUP_NORMAL); - if (!cvt_expr) - { - /* This can occur if, for example, the EXPR has incomplete - type. We can't check for that before attempting the - conversion because the type might be an incomplete - array type, which is OK if some constructor for the - destination type takes a pointer argument. */ - if (TYPE_SIZE (TREE_TYPE (expr)) == 0) - { - if (same_type_p (TREE_TYPE (expr), TREE_TYPE (convs))) - incomplete_type_error (expr, TREE_TYPE (expr)); - else - cp_error ("could not convert `%E' (with incomplete type `%T') to `%T'", - expr, TREE_TYPE (expr), TREE_TYPE (convs)); - } - else - cp_error ("could not convert `%E' to `%T'", - expr, TREE_TYPE (convs)); - return error_mark_node; - } - return cvt_expr; - } - - case REF_BIND: - return convert_to_reference - (TREE_TYPE (convs), expr, - CONV_IMPLICIT, LOOKUP_NORMAL|LOOKUP_NO_CONVERSION, - error_mark_node); - case LVALUE_CONV: - return decay_conversion (expr); - - case QUAL_CONV: - /* Warn about deprecated conversion if appropriate. */ - string_conv_p (TREE_TYPE (convs), expr, 1); - break; - - default: - break; - } - return ocp_convert (TREE_TYPE (convs), expr, CONV_IMPLICIT, - LOOKUP_NORMAL|LOOKUP_NO_CONVERSION); -} - -/* ARG is being passed to a varargs function. Perform any conversions - required. Return the converted value. */ - -tree -convert_arg_to_ellipsis (arg) - tree arg; -{ - if (TREE_CODE (TREE_TYPE (arg)) == REAL_TYPE - && (TYPE_PRECISION (TREE_TYPE (arg)) - < TYPE_PRECISION (double_type_node))) - /* Convert `float' to `double'. */ - arg = cp_convert (double_type_node, arg); - else if (IS_AGGR_TYPE (TREE_TYPE (arg)) - && ! TYPE_HAS_TRIVIAL_INIT_REF (TREE_TYPE (arg))) - cp_warning ("cannot pass objects of type `%T' through `...'", - TREE_TYPE (arg)); - else - /* Convert `short' and `char' to full-size `int'. */ - arg = default_conversion (arg); - - return arg; -} - -/* ARG is a default argument expression being passed to a parameter of - the indicated TYPE, which is a parameter to FN. Do any required - conversions. Return the converted value. */ - -tree -convert_default_arg (type, arg, fn) - tree type; - tree arg; - tree fn; -{ - if (fn && DECL_TEMPLATE_INFO (fn)) - { - /* This default argument came from a template. Instantiate the - default argument here, not in tsubst. In the case of - something like: - - template - struct S { - static T t(); - void f(T = t()); - }; - - we must be careful to do name lookup in the scope of S, - rather than in the current class. */ - if (DECL_CLASS_SCOPE_P (fn)) - pushclass (DECL_REAL_CONTEXT (fn), 2); - - arg = tsubst_expr (arg, DECL_TI_ARGS (fn), NULL_TREE); - - if (DECL_CLASS_SCOPE_P (fn)) - popclass (1); - - /* Make sure the default argument is reasonable. */ - arg = check_default_argument (type, arg); - } - - arg = break_out_target_exprs (arg); - - if (TREE_CODE (arg) == CONSTRUCTOR) - { - arg = digest_init (type, arg, 0); - arg = convert_for_initialization (0, type, arg, LOOKUP_NORMAL, - "default argument", 0, 0); - } - else - { - /* This could get clobbered by the following call. */ - if (TREE_HAS_CONSTRUCTOR (arg)) - arg = copy_node (arg); - - arg = convert_for_initialization (0, type, arg, LOOKUP_NORMAL, - "default argument", 0, 0); -#ifdef PROMOTE_PROTOTYPES - if ((TREE_CODE (type) == INTEGER_TYPE - || TREE_CODE (type) == ENUMERAL_TYPE) - && (TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node))) - arg = default_conversion (arg); -#endif - } - - return arg; -} - -static tree -build_over_call (cand, args, flags) - struct z_candidate *cand; - tree args; - int flags; -{ - tree fn = cand->fn; - tree convs = cand->convs; - tree converted_args = NULL_TREE; - tree parm = TYPE_ARG_TYPES (TREE_TYPE (fn)); - tree conv, arg, val; - int i = 0; - int is_method = 0; - - /* Give any warnings we noticed during overload resolution. */ - if (cand->warnings) - for (val = cand->warnings; val; val = TREE_CHAIN (val)) - joust (cand, WRAPPER_PTR (TREE_VALUE (val)), 1); - - if (DECL_FUNCTION_MEMBER_P (fn)) - enforce_access (cand->basetype_path, fn); - - if (args && TREE_CODE (args) != TREE_LIST) - args = build_scratch_list (NULL_TREE, args); - arg = args; - - /* The implicit parameters to a constructor are not considered by overload - resolution, and must be of the proper type. */ - if (DECL_CONSTRUCTOR_P (fn)) - { - converted_args = expr_tree_cons (NULL_TREE, TREE_VALUE (arg), converted_args); - arg = TREE_CHAIN (arg); - parm = TREE_CHAIN (parm); - if (TYPE_USES_VIRTUAL_BASECLASSES (DECL_CONTEXT (fn))) - { - converted_args = expr_tree_cons - (NULL_TREE, TREE_VALUE (arg), converted_args); - arg = TREE_CHAIN (arg); - parm = TREE_CHAIN (parm); - } - } - /* Bypass access control for 'this' parameter. */ - else if (TREE_CODE (TREE_TYPE (fn)) == METHOD_TYPE) - { - tree parmtype = TREE_VALUE (parm); - tree argtype = TREE_TYPE (TREE_VALUE (arg)); - tree t; - if (ICS_BAD_FLAG (TREE_VEC_ELT (convs, i))) - cp_pedwarn ("passing `%T' as `this' argument of `%#D' discards qualifiers", - TREE_TYPE (argtype), fn); - - /* [class.mfct.nonstatic]: If a nonstatic member function of a class - X is called for an object that is not of type X, or of a type - derived from X, the behavior is undefined. - - So we can assume that anything passed as 'this' is non-null, and - optimize accordingly. */ - if (TREE_CODE (parmtype) == POINTER_TYPE) - t = convert_pointer_to_real (TREE_TYPE (parmtype), TREE_VALUE (arg)); - else - /* This happens with signatures. */ - t = convert_force (parmtype, TREE_VALUE (arg), CONV_C_CAST); - converted_args = expr_tree_cons (NULL_TREE, t, converted_args); - parm = TREE_CHAIN (parm); - arg = TREE_CHAIN (arg); - ++i; - is_method = 1; - } - - for (; arg && parm; - parm = TREE_CHAIN (parm), arg = TREE_CHAIN (arg), ++i) - { - tree type = TREE_VALUE (parm); - - conv = TREE_VEC_ELT (convs, i); - if (ICS_BAD_FLAG (conv)) - { - tree t = conv; - val = TREE_VALUE (arg); - - for (; t; t = TREE_OPERAND (t, 0)) - { - if (TREE_CODE (t) == USER_CONV - || TREE_CODE (t) == AMBIG_CONV) - { - val = convert_like (t, val); - break; - } - else if (TREE_CODE (t) == IDENTITY_CONV) - break; - } - val = convert_for_initialization - (NULL_TREE, type, val, LOOKUP_NORMAL, - "argument passing", fn, i - is_method); - } - else - { - /* Issue warnings about peculiar, but legal, uses of NULL. */ - if (ARITHMETIC_TYPE_P (TREE_VALUE (parm)) - && TREE_VALUE (arg) == null_node) - cp_warning ("converting NULL to non-pointer type"); - - val = convert_like (conv, TREE_VALUE (arg)); - } - -#ifdef PROMOTE_PROTOTYPES - if ((TREE_CODE (type) == INTEGER_TYPE - || TREE_CODE (type) == ENUMERAL_TYPE) - && (TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node))) - val = default_conversion (val); -#endif - converted_args = expr_tree_cons (NULL_TREE, val, converted_args); - } - - /* Default arguments */ - for (; parm && parm != void_list_node; parm = TREE_CHAIN (parm)) - converted_args - = expr_tree_cons (NULL_TREE, - convert_default_arg (TREE_VALUE (parm), - TREE_PURPOSE (parm), - fn), - converted_args); - - /* Ellipsis */ - for (; arg; arg = TREE_CHAIN (arg)) - converted_args - = expr_tree_cons (NULL_TREE, - convert_arg_to_ellipsis (TREE_VALUE (arg)), - converted_args); - - converted_args = nreverse (converted_args); - - if (warn_format && (DECL_NAME (fn) || DECL_ASSEMBLER_NAME (fn))) - check_function_format (DECL_NAME (fn), DECL_ASSEMBLER_NAME (fn), - converted_args); - - /* Avoid actually calling copy constructors and copy assignment operators, - if possible. */ - - if (! flag_elide_constructors) - /* Do things the hard way. */; - else if (DECL_CONSTRUCTOR_P (fn) - && TREE_VEC_LENGTH (convs) == 1 - && copy_args_p (fn)) - { - tree targ; - arg = TREE_CHAIN (converted_args); - if (TYPE_USES_VIRTUAL_BASECLASSES (DECL_CONTEXT (fn))) - arg = TREE_CHAIN (arg); - arg = TREE_VALUE (arg); - - /* Pull out the real argument, disregarding const-correctness. */ - targ = arg; - while (TREE_CODE (targ) == NOP_EXPR - || TREE_CODE (targ) == NON_LVALUE_EXPR - || TREE_CODE (targ) == CONVERT_EXPR) - targ = TREE_OPERAND (targ, 0); - if (TREE_CODE (targ) == ADDR_EXPR) - { - targ = TREE_OPERAND (targ, 0); - if (!same_type_p (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (arg))), - TYPE_MAIN_VARIANT (TREE_TYPE (targ)))) - targ = NULL_TREE; - } - else - targ = NULL_TREE; - - if (targ) - arg = targ; - else - arg = build_indirect_ref (arg, 0); - - /* [class.copy]: the copy constructor is implicitly defined even if - the implementation elided its use. */ - if (TYPE_HAS_COMPLEX_INIT_REF (DECL_CONTEXT (fn))) - mark_used (fn); - - /* If we're creating a temp and we already have one, don't create a - new one. If we're not creating a temp but we get one, use - INIT_EXPR to collapse the temp into our target. Otherwise, if the - ctor is trivial, do a bitwise copy with a simple TARGET_EXPR for a - temp or an INIT_EXPR otherwise. */ - if (integer_zerop (TREE_VALUE (args))) - { - if (! real_lvalue_p (arg)) - return arg; - else if (TYPE_HAS_TRIVIAL_INIT_REF (DECL_CONTEXT (fn))) - { - val = build_decl (VAR_DECL, NULL_TREE, DECL_CONTEXT (fn)); - val = build (TARGET_EXPR, DECL_CONTEXT (fn), val, arg, 0, 0); - TREE_SIDE_EFFECTS (val) = 1; - return val; - } - } - else if (! real_lvalue_p (arg) - || TYPE_HAS_TRIVIAL_INIT_REF (DECL_CONTEXT (fn))) - { - tree to = stabilize_reference - (build_indirect_ref (TREE_VALUE (args), 0)); - - /* Don't copy the padding byte; it might not have been allocated - if to is a base subobject. */ - if (is_empty_class (DECL_CLASS_CONTEXT (fn))) - return build_unary_op - (ADDR_EXPR, build (COMPOUND_EXPR, TREE_TYPE (to), - cp_convert (void_type_node, arg), to), - 0); - - val = build (INIT_EXPR, DECL_CONTEXT (fn), to, arg); - TREE_SIDE_EFFECTS (val) = 1; - return build_unary_op (ADDR_EXPR, val, 0); - } - } - else if (DECL_NAME (fn) == ansi_opname[MODIFY_EXPR] - && copy_args_p (fn) - && TYPE_HAS_TRIVIAL_ASSIGN_REF (DECL_CLASS_CONTEXT (fn))) - { - tree to = stabilize_reference - (build_indirect_ref (TREE_VALUE (converted_args), 0)); - - arg = build_indirect_ref (TREE_VALUE (TREE_CHAIN (converted_args)), 0); - - /* Don't copy the padding byte; it might not have been allocated - if to is a base subobject. */ - if (is_empty_class (DECL_CLASS_CONTEXT (fn))) - return build (COMPOUND_EXPR, TREE_TYPE (to), - cp_convert (void_type_node, arg), to); - - val = build (MODIFY_EXPR, TREE_TYPE (to), to, arg); - TREE_SIDE_EFFECTS (val) = 1; - return val; - } - - mark_used (fn); - - if (DECL_CLASS_SCOPE_P (fn) && IS_SIGNATURE (DECL_CONTEXT (fn))) - return build_signature_method_call (fn, converted_args); - else if (DECL_VINDEX (fn) && (flags & LOOKUP_NONVIRTUAL) == 0) - { - tree t, *p = &TREE_VALUE (converted_args); - tree binfo = get_binfo - (DECL_CONTEXT (fn), TREE_TYPE (TREE_TYPE (*p)), 0); - *p = convert_pointer_to_real (binfo, *p); - if (TREE_SIDE_EFFECTS (*p)) - *p = save_expr (*p); - t = build_pointer_type (TREE_TYPE (fn)); - fn = build_vfn_ref (p, build_indirect_ref (*p, 0), DECL_VINDEX (fn)); - TREE_TYPE (fn) = t; - } - else if (DECL_INLINE (fn)) - fn = inline_conversion (fn); - else - fn = build_addr_func (fn); - - /* 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. */ - - if (TREE_CODE (fn) == ADDR_EXPR - && TREE_CODE (TREE_OPERAND (fn, 0)) == FUNCTION_DECL - && DECL_BUILT_IN (TREE_OPERAND (fn, 0))) - switch (DECL_FUNCTION_CODE (TREE_OPERAND (fn, 0))) - { - case BUILT_IN_ABS: - case BUILT_IN_LABS: - case BUILT_IN_FABS: - if (converted_args == 0) - return integer_zero_node; - return build_unary_op (ABS_EXPR, TREE_VALUE (converted_args), 0); - default: - break; - } - - fn = build_call (fn, TREE_TYPE (TREE_TYPE (TREE_TYPE (fn))), converted_args); - if (TREE_TYPE (fn) == void_type_node) - return fn; - fn = require_complete_type (fn); - if (IS_AGGR_TYPE (TREE_TYPE (fn))) - fn = build_cplus_new (TREE_TYPE (fn), fn); - return convert_from_reference (fn); -} - -static tree -build_new_method_call (instance, name, args, basetype_path, flags) - tree instance, name, args, basetype_path; - int flags; -{ - struct z_candidate *candidates = 0, *cand; - tree explicit_targs = NULL_TREE; - tree basetype, mem_args = NULL_TREE, fns, instance_ptr; - tree pretty_name; - tree user_args = args; - tree templates = NULL_TREE; - int template_only = 0; - - if (TREE_CODE (name) == TEMPLATE_ID_EXPR) - { - explicit_targs = TREE_OPERAND (name, 1); - name = TREE_OPERAND (name, 0); - if (TREE_CODE (name) == TEMPLATE_DECL) - name = DECL_NAME (name); - template_only = 1; - } - - /* If there is an extra argument for controlling virtual bases, - remove it for error reporting. */ - if (flags & LOOKUP_HAS_IN_CHARGE) - user_args = TREE_CHAIN (args); - - args = resolve_args (args); - - if (args == error_mark_node) - return error_mark_node; - - if (instance == NULL_TREE) - basetype = BINFO_TYPE (basetype_path); - else - { - if (TREE_CODE (instance) == OFFSET_REF) - instance = resolve_offset_ref (instance); - if (TREE_CODE (TREE_TYPE (instance)) == REFERENCE_TYPE) - instance = convert_from_reference (instance); - basetype = TREE_TYPE (instance); - - /* XXX this should be handled before we get here. */ - if (! IS_AGGR_TYPE (basetype) - && ! (TYPE_LANG_SPECIFIC (basetype) - && (IS_SIGNATURE_POINTER (basetype) - || IS_SIGNATURE_REFERENCE (basetype)))) - { - if ((flags & LOOKUP_COMPLAIN) && basetype != error_mark_node) - cp_error ("request for member `%D' in `%E', which is of non-aggregate type `%T'", - name, instance, basetype); - - return error_mark_node; - } - - /* If `instance' is a signature pointer/reference and `name' is - not a constructor, we are calling a signature member function. - In that case set the `basetype' to the signature type. */ - if ((IS_SIGNATURE_POINTER (basetype) - || IS_SIGNATURE_REFERENCE (basetype)) - && TYPE_IDENTIFIER (basetype) != name) - basetype = SIGNATURE_TYPE (basetype); - } - - if (basetype_path == NULL_TREE) - basetype_path = TYPE_BINFO (basetype); - - if (instance) - { - instance_ptr = build_this (instance); - - if (! template_only) - { - /* XXX this should be handled before we get here. */ - fns = build_field_call (basetype_path, instance_ptr, name, args); - if (fns) - return fns; - } - } - else - { - instance_ptr = build_int_2 (0, 0); - TREE_TYPE (instance_ptr) = build_pointer_type (basetype); - } - - pretty_name - = (name == ctor_identifier ? constructor_name (basetype) : name); - - fns = lookup_fnfields (basetype_path, name, 1); - - if (fns == error_mark_node) - return error_mark_node; - if (fns) - { - tree fn = TREE_VALUE (fns); - if (name == ctor_identifier && TYPE_USES_VIRTUAL_BASECLASSES (basetype) - && ! (flags & LOOKUP_HAS_IN_CHARGE)) - { - flags |= LOOKUP_HAS_IN_CHARGE; - args = scratch_tree_cons (NULL_TREE, integer_one_node, args); - } - mem_args = scratch_tree_cons (NULL_TREE, instance_ptr, args); - for (; fn; fn = OVL_NEXT (fn)) - { - tree t = OVL_CURRENT (fn); - tree this_arglist; - - /* We can end up here for copy-init of same or base class. */ - if (name == ctor_identifier - && (flags & LOOKUP_ONLYCONVERTING) - && DECL_NONCONVERTING_P (t)) - continue; - if (TREE_CODE (TREE_TYPE (t)) == METHOD_TYPE) - this_arglist = mem_args; - else - this_arglist = args; - - if (TREE_CODE (t) == TEMPLATE_DECL) - { - /* A member template. */ - templates = scratch_tree_cons (NULL_TREE, t, templates); - candidates = - add_template_candidate (candidates, t, explicit_targs, - this_arglist, - TREE_TYPE (name), flags, DEDUCE_CALL); - } - else if (! template_only) - candidates = add_function_candidate (candidates, t, - this_arglist, flags); - - if (candidates) - candidates->basetype_path = TREE_PURPOSE (fns); - } - } - - if (! any_viable (candidates)) - { - /* XXX will LOOKUP_SPECULATIVELY be needed when this is done? */ - if (flags & LOOKUP_SPECULATIVELY) - return NULL_TREE; - if (TYPE_SIZE (basetype) == 0) - incomplete_type_error (instance_ptr, basetype); - else - cp_error ("no matching function for call to `%T::%D (%A)%V'", - basetype, pretty_name, user_args, - TREE_TYPE (TREE_TYPE (instance_ptr))); - print_z_candidates (candidates); - return error_mark_node; - } - candidates = splice_viable (candidates); - cand = tourney (candidates); - - if (cand == 0) - { - cp_error ("call of overloaded `%D(%A)' is ambiguous", pretty_name, - user_args); - print_z_candidates (candidates); - return error_mark_node; - } - - if (DECL_ABSTRACT_VIRTUAL_P (cand->fn) - && instance == current_class_ref - && DECL_CONSTRUCTOR_P (current_function_decl) - && ! (flags & LOOKUP_NONVIRTUAL) - && value_member (cand->fn, CLASSTYPE_ABSTRACT_VIRTUALS (basetype))) - cp_error ("abstract virtual `%#D' called from constructor", cand->fn); - if (TREE_CODE (TREE_TYPE (cand->fn)) == METHOD_TYPE - && is_dummy_object (instance_ptr)) - cp_error ("cannot call member function `%D' without object", cand->fn); - - if (DECL_VINDEX (cand->fn) && ! (flags & LOOKUP_NONVIRTUAL) - && ((instance == current_class_ref && (dtor_label || ctor_label)) - || resolves_to_fixed_type_p (instance, 0))) - flags |= LOOKUP_NONVIRTUAL; - - /* Pedantically, normal function declarations are never considered - to refer to template instantiations, so we only do this with - -fguiding-decls. */ - if (flag_guiding_decls && templates && ! cand->template - && ! DECL_INITIAL (cand->fn)) - add_maybe_template (cand->fn, templates); - - return build_over_call - (cand, - TREE_CODE (TREE_TYPE (cand->fn)) == METHOD_TYPE ? mem_args : args, - flags); -} - -/* Returns non-zero iff standard conversion sequence ICS1 is a proper - subsequence of ICS2. */ - -static int -is_subseq (ics1, ics2) - tree ics1, ics2; -{ - /* We can assume that a conversion of the same code - between the same types indicates a subsequence since we only get - here if the types we are converting from are the same. */ - - while (TREE_CODE (ics1) == RVALUE_CONV - || TREE_CODE (ics1) == LVALUE_CONV) - ics1 = TREE_OPERAND (ics1, 0); - - while (1) - { - while (TREE_CODE (ics2) == RVALUE_CONV - || TREE_CODE (ics2) == LVALUE_CONV) - ics2 = TREE_OPERAND (ics2, 0); - - if (TREE_CODE (ics2) == USER_CONV - || TREE_CODE (ics2) == AMBIG_CONV - || TREE_CODE (ics2) == IDENTITY_CONV) - /* At this point, ICS1 cannot be a proper subsequence of - ICS2. We can get a USER_CONV when we are comparing the - second standard conversion sequence of two user conversion - sequences. */ - return 0; - - ics2 = TREE_OPERAND (ics2, 0); - - if (TREE_CODE (ics2) == TREE_CODE (ics1) - && same_type_p (TREE_TYPE (ics2), TREE_TYPE (ics1)) - && same_type_p (TREE_TYPE (TREE_OPERAND (ics2, 0)), - TREE_TYPE (TREE_OPERAND (ics1, 0)))) - return 1; - } -} - -/* Returns non-zero iff DERIVED is derived from BASE. The inputs may - be any _TYPE nodes. */ - -static int -is_properly_derived_from (derived, base) - tree derived; - tree base; -{ - if (!IS_AGGR_TYPE_CODE (TREE_CODE (derived)) - || !IS_AGGR_TYPE_CODE (TREE_CODE (base))) - return 0; - - /* We only allow proper derivation here. The DERIVED_FROM_P macro - considers every class derived from itself. */ - return (!same_type_p (TYPE_MAIN_VARIANT (derived), - TYPE_MAIN_VARIANT (base)) - && DERIVED_FROM_P (base, derived)); -} - -/* We build the ICS for an implicit object parameter as a pointer - conversion sequence. However, such a sequence should be compared - as if it were a reference conversion sequence. If ICS is the - implicit conversion sequence for an implicit object parameter, - modify it accordingly. */ - -static void -maybe_handle_implicit_object (ics) - tree* ics; -{ - if (ICS_THIS_FLAG (*ics)) - { - /* [over.match.funcs] - - For non-static member functions, the type of the - implicit object parameter is "reference to cv X" - where X is the class of which the function is a - member and cv is the cv-qualification on the member - function declaration. */ - tree t = *ics; - if (TREE_CODE (t) == QUAL_CONV) - t = TREE_OPERAND (t, 0); - if (TREE_CODE (t) == PTR_CONV) - t = TREE_OPERAND (t, 0); - t = build1 (IDENTITY_CONV, TREE_TYPE (TREE_TYPE (t)), NULL_TREE); - t = build_conv (REF_BIND, - build_reference_type (TREE_TYPE (TREE_TYPE (*ics))), - t); - ICS_STD_RANK (t) = ICS_STD_RANK (*ics); - *ics = t; - } -} - -/* If ICS is a REF_BIND, modify it appropriately, set TARGET_TYPE - to the type the reference originally referred to, and return 1. - Otherwise, return 0. */ - -static int -maybe_handle_ref_bind (ics, target_type) - tree* ics; - tree* target_type; -{ - if (TREE_CODE (*ics) == REF_BIND) - { - /* [over.ics.rank] - - When a parameter of reference type binds directly - (_dcl.init.ref_) to an argument expression, the implicit - conversion sequence is the identity conversion, unless the - argument expression has a type that is a derived class of the - parameter type, in which case the implicit conversion - sequence is a derived-to-base Conversion. - - If the parameter binds directly to the result of applying a - conversion function to the argument expression, the implicit - conversion sequence is a user-defined conversion sequence - (_over.ics.user_), with the second standard conversion - sequence either an identity conversion or, if the conversion - function returns an entity of a type that is a derived class - of the parameter type, a derived-to-base Conversion. - - When a parameter of reference type is not bound directly to - an argument expression, the conversion sequence is the one - required to convert the argument expression to the underlying - type of the reference according to _over.best.ics_. - Conceptually, this conversion sequence corresponds to - copy-initializing a temporary of the underlying type with the - argument expression. Any difference in top-level - cv-qualification is subsumed by the initialization itself and - does not constitute a conversion. */ - - tree old_ics = *ics; - - *target_type = TREE_TYPE (TREE_TYPE (*ics)); - *ics = TREE_OPERAND (*ics, 0); - if (TREE_CODE (*ics) == IDENTITY_CONV - && is_properly_derived_from (TREE_TYPE (*ics), *target_type)) - *ics = build_conv (BASE_CONV, *target_type, *ics); - ICS_USER_FLAG (*ics) = ICS_USER_FLAG (old_ics); - ICS_BAD_FLAG (*ics) = ICS_BAD_FLAG (old_ics); - - return 1; - } - - return 0; -} - -/* Compare two implicit conversion sequences according to the rules set out in - [over.ics.rank]. Return values: - - 1: ics1 is better than ics2 - -1: ics2 is better than ics1 - 0: ics1 and ics2 are indistinguishable */ - -static int -compare_ics (ics1, ics2) - tree ics1, ics2; -{ - tree from_type1; - tree from_type2; - tree to_type1; - tree to_type2; - tree deref_from_type1 = NULL_TREE; - tree deref_from_type2 = NULL_TREE; - tree deref_to_type1 = NULL_TREE; - tree deref_to_type2 = NULL_TREE; - - /* REF_BINDING is non-zero if the result of the conversion sequence - is a reference type. In that case TARGET_TYPE is the - type referred to by the reference. */ - int ref_binding1; - int ref_binding2; - tree target_type1; - tree target_type2; - - /* Handle implicit object parameters. */ - maybe_handle_implicit_object (&ics1); - maybe_handle_implicit_object (&ics2); - - /* Handle reference parameters. */ - ref_binding1 = maybe_handle_ref_bind (&ics1, &target_type1); - ref_binding2 = maybe_handle_ref_bind (&ics2, &target_type2); - - /* [over.ics.rank] - - When comparing the basic forms of implicit conversion sequences (as - defined in _over.best.ics_) - - --a standard conversion sequence (_over.ics.scs_) is a better - conversion sequence than a user-defined conversion sequence - or an ellipsis conversion sequence, and - - --a user-defined conversion sequence (_over.ics.user_) is a - better conversion sequence than an ellipsis conversion sequence - (_over.ics.ellipsis_). */ - if (ICS_RANK (ics1) > ICS_RANK (ics2)) - return -1; - else if (ICS_RANK (ics1) < ICS_RANK (ics2)) - return 1; - - if (ICS_RANK (ics1) == BAD_RANK) - { - /* Both ICS are bad. We try to make a decision based on what - would have happenned if they'd been good. */ - if (ICS_USER_FLAG (ics1) > ICS_USER_FLAG (ics2) - || ICS_STD_RANK (ics1) > ICS_STD_RANK (ics2)) - return -1; - else if (ICS_USER_FLAG (ics1) < ICS_USER_FLAG (ics2) - || ICS_STD_RANK (ics1) < ICS_STD_RANK (ics2)) - return 1; - - /* We couldn't make up our minds; try to figure it out below. */ - } - - if (ICS_ELLIPSIS_FLAG (ics1)) - /* Both conversions are ellipsis conversions. */ - return 0; - - /* User-defined conversion sequence U1 is a better conversion sequence - than another user-defined conversion sequence U2 if they contain the - same user-defined conversion operator or constructor and if the sec- - ond standard conversion sequence of U1 is better than the second - standard conversion sequence of U2. */ - - if (ICS_USER_FLAG (ics1)) - { - tree t1, t2; - - for (t1 = ics1; TREE_CODE (t1) != USER_CONV; t1 = TREE_OPERAND (t1, 0)) - if (TREE_CODE (t1) == AMBIG_CONV) - return 0; - for (t2 = ics2; TREE_CODE (t2) != USER_CONV; t2 = TREE_OPERAND (t2, 0)) - if (TREE_CODE (t2) == AMBIG_CONV) - return 0; - - if (USER_CONV_FN (t1) != USER_CONV_FN (t2)) - return 0; - - /* We can just fall through here, after setting up - FROM_TYPE1 and FROM_TYPE2. */ - from_type1 = TREE_TYPE (t1); - from_type2 = TREE_TYPE (t2); - } - else - { - /* We're dealing with two standard conversion sequences. - - [over.ics.rank] - - Standard conversion sequence S1 is a better conversion - sequence than standard conversion sequence S2 if - - --S1 is a proper subsequence of S2 (comparing the conversion - sequences in the canonical form defined by _over.ics.scs_, - excluding any Lvalue Transformation; the identity - conversion sequence is considered to be a subsequence of - any non-identity conversion sequence */ - - from_type1 = ics1; - while (TREE_CODE (from_type1) != IDENTITY_CONV) - from_type1 = TREE_OPERAND (from_type1, 0); - from_type1 = TREE_TYPE (from_type1); - - from_type2 = ics2; - while (TREE_CODE (from_type2) != IDENTITY_CONV) - from_type2 = TREE_OPERAND (from_type2, 0); - from_type2 = TREE_TYPE (from_type2); - } - - if (same_type_p (from_type1, from_type2)) - { - if (is_subseq (ics1, ics2)) - return 1; - if (is_subseq (ics2, ics1)) - return -1; - } - /* Otherwise, one sequence cannot be a subsequence of the other; they - don't start with the same type. This can happen when comparing the - second standard conversion sequence in two user-defined conversion - sequences. */ - - /* [over.ics.rank] - - Or, if not that, - - --the rank of S1 is better than the rank of S2 (by the rules - defined below): - - Standard conversion sequences are ordered by their ranks: an Exact - Match is a better conversion than a Promotion, which is a better - conversion than a Conversion. - - Two conversion sequences with the same rank are indistinguishable - unless one of the following rules applies: - - --A conversion that is not a conversion of a pointer, or pointer - to member, to bool is better than another conversion that is such - a conversion. - - The ICS_STD_RANK automatically handles the pointer-to-bool rule, - so that we do not have to check it explicitly. */ - if (ICS_STD_RANK (ics1) < ICS_STD_RANK (ics2)) - return 1; - else if (ICS_STD_RANK (ics2) < ICS_STD_RANK (ics1)) - return -1; - - to_type1 = TREE_TYPE (ics1); - to_type2 = TREE_TYPE (ics2); - - if (TYPE_PTR_P (from_type1) - && TYPE_PTR_P (from_type2) - && TYPE_PTR_P (to_type1) - && TYPE_PTR_P (to_type2)) - { - deref_from_type1 = TREE_TYPE (from_type1); - deref_from_type2 = TREE_TYPE (from_type2); - deref_to_type1 = TREE_TYPE (to_type1); - deref_to_type2 = TREE_TYPE (to_type2); - } - /* The rules for pointers to members A::* are just like the rules - for pointers A*, except opposite: if B is derived from A then - A::* converts to B::*, not vice versa. For that reason, we - switch the from_ and to_ variables here. */ - else if (TYPE_PTRMEM_P (from_type1) - && TYPE_PTRMEM_P (from_type2) - && TYPE_PTRMEM_P (to_type1) - && TYPE_PTRMEM_P (to_type2)) - { - deref_to_type1 = TYPE_OFFSET_BASETYPE (TREE_TYPE (from_type1)); - deref_to_type2 = TYPE_OFFSET_BASETYPE (TREE_TYPE (from_type2)); - deref_from_type1 = TYPE_OFFSET_BASETYPE (TREE_TYPE (to_type1)); - deref_from_type2 = TYPE_OFFSET_BASETYPE (TREE_TYPE (to_type2)); - } - else if (TYPE_PTRMEMFUNC_P (from_type1) - && TYPE_PTRMEMFUNC_P (from_type2) - && TYPE_PTRMEMFUNC_P (to_type1) - && TYPE_PTRMEMFUNC_P (to_type2)) - { - deref_to_type1 = TYPE_PTRMEMFUNC_OBJECT_TYPE (from_type1); - deref_to_type2 = TYPE_PTRMEMFUNC_OBJECT_TYPE (from_type2); - deref_from_type1 = TYPE_PTRMEMFUNC_OBJECT_TYPE (to_type1); - deref_from_type2 = TYPE_PTRMEMFUNC_OBJECT_TYPE (to_type2); - } - - if (deref_from_type1 != NULL_TREE - && IS_AGGR_TYPE_CODE (TREE_CODE (deref_from_type1)) - && IS_AGGR_TYPE_CODE (TREE_CODE (deref_from_type2))) - { - /* This was one of the pointer or pointer-like conversions. - - [over.ics.rank] - - --If class B is derived directly or indirectly from class A, - conversion of B* to A* is better than conversion of B* to - void*, and conversion of A* to void* is better than - conversion of B* to void*. */ - if (TREE_CODE (deref_to_type1) == VOID_TYPE - && TREE_CODE (deref_to_type2) == VOID_TYPE) - { - if (is_properly_derived_from (deref_from_type1, - deref_from_type2)) - return -1; - else if (is_properly_derived_from (deref_from_type2, - deref_from_type1)) - return 1; - } - else if (TREE_CODE (deref_to_type1) == VOID_TYPE - || TREE_CODE (deref_to_type2) == VOID_TYPE) - { - if (same_type_p (deref_from_type1, deref_from_type2)) - { - if (TREE_CODE (deref_to_type2) == VOID_TYPE) - { - if (is_properly_derived_from (deref_from_type1, - deref_to_type1)) - return 1; - } - /* We know that DEREF_TO_TYPE1 is `void' here. */ - else if (is_properly_derived_from (deref_from_type1, - deref_to_type2)) - return -1; - } - } - else if (IS_AGGR_TYPE_CODE (TREE_CODE (deref_to_type1)) - && IS_AGGR_TYPE_CODE (TREE_CODE (deref_to_type2))) - { - /* [over.ics.rank] - - --If class B is derived directly or indirectly from class A - and class C is derived directly or indirectly from B, - - --conversion of C* to B* is better than conversion of C* to - A*, - - --conversion of B* to A* is better than conversion of C* to - A* */ - if (same_type_p (deref_from_type1, deref_from_type2)) - { - if (is_properly_derived_from (deref_to_type1, - deref_to_type2)) - return 1; - else if (is_properly_derived_from (deref_to_type2, - deref_to_type1)) - return -1; - } - else if (same_type_p (deref_to_type1, deref_to_type2)) - { - if (is_properly_derived_from (deref_from_type2, - deref_from_type1)) - return 1; - else if (is_properly_derived_from (deref_from_type1, - deref_from_type2)) - return -1; - } - } - } - else if (IS_AGGR_TYPE_CODE (TREE_CODE (from_type1)) - && same_type_p (from_type1, from_type2)) - { - /* [over.ics.rank] - - --binding of an expression of type C to a reference of type - B& is better than binding an expression of type C to a - reference of type A& - - --conversion of C to B is better than conversion of C to A, */ - if (is_properly_derived_from (from_type1, to_type1) - && is_properly_derived_from (from_type1, to_type2)) - { - if (is_properly_derived_from (to_type1, to_type2)) - return 1; - else if (is_properly_derived_from (to_type2, to_type1)) - return -1; - } - } - else if (IS_AGGR_TYPE_CODE (TREE_CODE (to_type1)) - && same_type_p (to_type1, to_type2)) - { - /* [over.ics.rank] - - --binding of an expression of type B to a reference of type - A& is better than binding an expression of type C to a - reference of type A&, - - --onversion of B to A is better than conversion of C to A */ - if (is_properly_derived_from (from_type1, to_type1) - && is_properly_derived_from (from_type2, to_type1)) - { - if (is_properly_derived_from (from_type2, from_type1)) - return 1; - else if (is_properly_derived_from (from_type1, from_type2)) - return -1; - } - } - - /* [over.ics.rank] - - --S1 and S2 differ only in their qualification conversion and yield - similar types T1 and T2 (_conv.qual_), respectively, and the cv- - qualification signature of type T1 is a proper subset of the cv- - qualification signature of type T2 */ - if (TREE_CODE (ics1) == QUAL_CONV - && TREE_CODE (ics2) == QUAL_CONV - && same_type_p (from_type1, from_type2)) - return comp_cv_qual_signature (to_type1, to_type2); - - /* [over.ics.rank] - - --S1 and S2 are reference bindings (_dcl.init.ref_), and the - types to which the references refer are the same type except for - top-level cv-qualifiers, and the type to which the reference - initialized by S2 refers is more cv-qualified than the type to - which the reference initialized by S1 refers */ - - if (ref_binding1 && ref_binding2 - && same_type_p (TYPE_MAIN_VARIANT (to_type1), - TYPE_MAIN_VARIANT (to_type2))) - return comp_cv_qualification (target_type2, target_type1); - - /* Neither conversion sequence is better than the other. */ - return 0; -} - -/* The source type for this standard conversion sequence. */ - -static tree -source_type (t) - tree t; -{ - for (;; t = TREE_OPERAND (t, 0)) - { - if (TREE_CODE (t) == USER_CONV - || TREE_CODE (t) == AMBIG_CONV - || TREE_CODE (t) == IDENTITY_CONV) - return TREE_TYPE (t); - } - my_friendly_abort (1823); -} - -/* Note a warning about preferring WINNER to LOSER. We do this by storing - a pointer to LOSER and re-running joust to produce the warning if WINNER - is actually used. */ - -static void -add_warning (winner, loser) - struct z_candidate *winner, *loser; -{ - winner->warnings = expr_tree_cons (NULL_PTR, - build_expr_ptr_wrapper (loser), - winner->warnings); -} - -/* Compare two candidates for overloading as described in - [over.match.best]. Return values: - - 1: cand1 is better than cand2 - -1: cand2 is better than cand1 - 0: cand1 and cand2 are indistinguishable */ - -static int -joust (cand1, cand2, warn) - struct z_candidate *cand1, *cand2; - int warn; -{ - int winner = 0; - int i, off1 = 0, off2 = 0, len; - - /* Candidates that involve bad conversions are always worse than those - that don't. */ - if (cand1->viable > cand2->viable) - return 1; - if (cand1->viable < cand2->viable) - return -1; - - /* If we have two pseudo-candidates for conversions to the same type, - arbitrarily pick one. */ - if (TYPE_P (cand1->fn) && cand1->fn == cand2->fn) - return 1; - - /* a viable function F1 - is defined to be a better function than another viable function F2 if - for all arguments i, ICSi(F1) is not a worse conversion sequence than - ICSi(F2), and then */ - - /* for some argument j, ICSj(F1) is a better conversion sequence than - ICSj(F2) */ - - /* For comparing static and non-static member functions, we ignore the - implicit object parameter of the non-static function. The WP says to - pretend that the static function has an object parm, but that won't - work with operator overloading. */ - len = TREE_VEC_LENGTH (cand1->convs); - if (len != TREE_VEC_LENGTH (cand2->convs)) - { - if (DECL_STATIC_FUNCTION_P (cand1->fn) - && ! DECL_STATIC_FUNCTION_P (cand2->fn)) - off2 = 1; - else if (! DECL_STATIC_FUNCTION_P (cand1->fn) - && DECL_STATIC_FUNCTION_P (cand2->fn)) - { - off1 = 1; - --len; - } - else - my_friendly_abort (42); - } - - for (i = 0; i < len; ++i) - { - tree t1 = TREE_VEC_ELT (cand1->convs, i+off1); - tree t2 = TREE_VEC_ELT (cand2->convs, i+off2); - int comp = compare_ics (t1, t2); - - if (comp != 0) - { - if (warn_sign_promo - && ICS_RANK (t1) + ICS_RANK (t2) == STD_RANK + PROMO_RANK - && TREE_CODE (t1) == STD_CONV - && TREE_CODE (t2) == STD_CONV - && TREE_CODE (TREE_TYPE (t1)) == INTEGER_TYPE - && TREE_CODE (TREE_TYPE (t2)) == INTEGER_TYPE - && (TYPE_PRECISION (TREE_TYPE (t1)) - == TYPE_PRECISION (TREE_TYPE (t2))) - && (TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (t1, 0))) - || (TREE_CODE (TREE_TYPE (TREE_OPERAND (t1, 0))) - == ENUMERAL_TYPE))) - { - tree type = TREE_TYPE (TREE_OPERAND (t1, 0)); - tree type1, type2; - struct z_candidate *w, *l; - if (comp > 0) - type1 = TREE_TYPE (t1), type2 = TREE_TYPE (t2), - w = cand1, l = cand2; - else - type1 = TREE_TYPE (t2), type2 = TREE_TYPE (t1), - w = cand2, l = cand1; - - if (warn) - { - cp_warning ("passing `%T' chooses `%T' over `%T'", - type, type1, type2); - cp_warning (" in call to `%D'", w->fn); - } - else - add_warning (w, l); - } - - if (winner && comp != winner) - { - winner = 0; - goto tweak; - } - winner = comp; - } - } - - /* warn about confusing overload resolution for user-defined conversions, - either between a constructor and a conversion op, or between two - conversion ops. */ - if (winner && cand1->second_conv - && ((DECL_CONSTRUCTOR_P (cand1->fn) - != DECL_CONSTRUCTOR_P (cand2->fn)) - /* Don't warn if the two conv ops convert to the same type... */ - || (! DECL_CONSTRUCTOR_P (cand1->fn) - && ! same_type_p (TREE_TYPE (cand1->second_conv), - TREE_TYPE (cand2->second_conv))))) - { - int comp = compare_ics (cand1->second_conv, cand2->second_conv); - if (comp != winner) - { - struct z_candidate *w, *l; - if (winner == 1) - w = cand1, l = cand2; - else - w = cand2, l = cand1; - if (warn) - { - tree source = source_type (TREE_VEC_ELT (w->convs, 0)); - if (! DECL_CONSTRUCTOR_P (w->fn)) - source = TREE_TYPE (source); - cp_warning ("choosing `%D' over `%D'", w->fn, l->fn); - cp_warning (" for conversion from `%T' to `%T'", - source, TREE_TYPE (w->second_conv)); - cp_warning (" because conversion sequence for the argument is better"); - } - else - add_warning (w, l); - } - } - - if (winner) - return winner; - - /* or, if not that, - F1 is a non-template function and F2 is a template function */ - - if (! cand1->template && cand2->template) - return 1; - else if (cand1->template && ! cand2->template) - return -1; - else if (cand1->template && cand2->template) - winner = more_specialized - (TI_TEMPLATE (cand1->template), TI_TEMPLATE (cand2->template), - NULL_TREE); - - /* or, if not that, - the context is an initialization by user-defined conversion (see - _dcl.init_ and _over.match.user_) and the standard conversion - sequence from the return type of F1 to the destination type (i.e., - the type of the entity being initialized) is a better conversion - sequence than the standard conversion sequence from the return type - of F2 to the destination type. */ - - if (! winner && cand1->second_conv) - winner = compare_ics (cand1->second_conv, cand2->second_conv); - - /* If the built-in candidates are the same, arbitrarily pick one. */ - if (! winner && cand1->fn == cand2->fn - && TREE_CODE (cand1->fn) == IDENTIFIER_NODE) - { - for (i = 0; i < len; ++i) - if (!same_type_p (TREE_TYPE (TREE_VEC_ELT (cand1->convs, i)), - TREE_TYPE (TREE_VEC_ELT (cand2->convs, i)))) - break; - if (i == TREE_VEC_LENGTH (cand1->convs)) - return 1; - - /* Kludge around broken overloading rules whereby - Integer a, b; test ? a : b; is ambiguous, since there's a builtin - that takes references and another that takes values. */ - if (cand1->fn == ansi_opname[COND_EXPR]) - { - tree c1 = TREE_VEC_ELT (cand1->convs, 1); - tree c2 = TREE_VEC_ELT (cand2->convs, 1); - tree t1 = strip_top_quals (non_reference (TREE_TYPE (c1))); - tree t2 = strip_top_quals (non_reference (TREE_TYPE (c2))); - - if (same_type_p (t1, t2)) - { - if (TREE_CODE (c1) == REF_BIND && TREE_CODE (c2) != REF_BIND) - return 1; - if (TREE_CODE (c1) != REF_BIND && TREE_CODE (c2) == REF_BIND) - return -1; - } - } - } - -tweak: - - /* Extension: If the worst conversion for one candidate is worse than the - worst conversion for the other, take the first. */ - if (! winner && ! pedantic) - { - int rank1 = IDENTITY_RANK, rank2 = IDENTITY_RANK; - - for (i = 0; i < len; ++i) - { - if (ICS_RANK (TREE_VEC_ELT (cand1->convs, i+off1)) > rank1) - rank1 = ICS_RANK (TREE_VEC_ELT (cand1->convs, i+off1)); - if (ICS_RANK (TREE_VEC_ELT (cand2->convs, i+off2)) > rank2) - rank2 = ICS_RANK (TREE_VEC_ELT (cand2->convs, i+off2)); - } - - if (rank1 < rank2) - return 1; - if (rank1 > rank2) - return -1; - } - - return winner; -} - -/* Given a list of candidates for overloading, find the best one, if any. - This algorithm has a worst case of O(2n) (winner is last), and a best - case of O(n/2) (totally ambiguous); much better than a sorting - algorithm. */ - -static struct z_candidate * -tourney (candidates) - struct z_candidate *candidates; -{ - struct z_candidate *champ = candidates, *challenger; - int fate; - int champ_compared_to_predecessor = 0; - - /* Walk through the list once, comparing each current champ to the next - candidate, knocking out a candidate or two with each comparison. */ - - for (challenger = champ->next; challenger; ) - { - fate = joust (champ, challenger, 0); - if (fate == 1) - challenger = challenger->next; - else - { - if (fate == 0) - { - champ = challenger->next; - if (champ == 0) - return 0; - champ_compared_to_predecessor = 0; - } - else - { - champ = challenger; - champ_compared_to_predecessor = 1; - } - - challenger = champ->next; - } - } - - /* Make sure the champ is better than all the candidates it hasn't yet - been compared to. */ - - for (challenger = candidates; - challenger != champ - && !(champ_compared_to_predecessor && challenger->next == champ); - challenger = challenger->next) - { - fate = joust (champ, challenger, 0); - if (fate != 1) - return 0; - } - - return champ; -} - -int -can_convert (to, from) - tree to, from; -{ - tree t = implicit_conversion (to, from, NULL_TREE, LOOKUP_NORMAL); - return (t && ! ICS_BAD_FLAG (t)); -} - -int -can_convert_arg (to, from, arg) - tree to, from, arg; -{ - tree t = implicit_conversion (to, from, arg, LOOKUP_NORMAL); - return (t && ! ICS_BAD_FLAG (t)); -} diff --git a/gcc/cp/class.c b/gcc/cp/class.c deleted file mode 100755 index a219b7d..0000000 --- a/gcc/cp/class.c +++ /dev/null @@ -1,5669 +0,0 @@ -/* Functions related to building classes and their related objects. - Copyright (C) 1987, 92-97, 1998, 1999 Free Software Foundation, Inc. - Contributed by Michael Tiemann (tiemann@cygnus.com) - -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 -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - - -/* High-level class interface. */ - -#include "config.h" -#include "system.h" -#include "tree.h" -#include "cp-tree.h" -#include "flags.h" -#include "rtl.h" -#include "output.h" -#include "toplev.h" - -#include "obstack.h" -#define obstack_chunk_alloc xmalloc -#define obstack_chunk_free free - -extern struct obstack permanent_obstack; - -/* This is how we tell when two virtual member functions are really the - same. */ -#define SAME_FN(FN1DECL, FN2DECL) (DECL_ASSEMBLER_NAME (FN1DECL) == DECL_ASSEMBLER_NAME (FN2DECL)) - -extern void set_class_shadows PROTO ((tree)); - -/* The number of nested classes being processed. If we are not in the - scope of any class, this is zero. */ - -int current_class_depth; - -/* In order to deal with nested classes, we keep a stack of classes. - The topmost entry is the innermost class, and is the entry at index - CURRENT_CLASS_DEPTH */ - -typedef struct class_stack_node { - /* The name of the class. */ - tree name; - - /* The _TYPE node for the class. */ - tree type; - - /* The access specifier pending for new declarations in the scope of - this class. */ - tree access; -}* class_stack_node_t; - -/* The stack itself. This is an dynamically resized array. The - number of elements allocated is CURRENT_CLASS_STACK_SIZE. */ -static int current_class_stack_size; -static class_stack_node_t current_class_stack; - -/* When we're processing a member function, current_class_ptr is the - PARM_DECL for the `this' pointer. The current_class_ref is an - expression for `*this'. */ -tree current_class_ptr, current_class_ref; - -/* The following two can be derived from the previous one */ -tree current_class_name; /* IDENTIFIER_NODE: name of current class */ -tree current_class_type; /* _TYPE: the type of the current class */ -tree current_access_specifier; -tree previous_class_type; /* _TYPE: the previous type that was a class */ -tree previous_class_values; /* TREE_LIST: copy of the class_shadowed list - when leaving an outermost class scope. */ - -/* The obstack on which the cached class declarations are kept. */ -static struct obstack class_cache_obstack; -/* The first object allocated on that obstack. We can use - obstack_free with tis value to free the entire obstack. */ -static char *class_cache_firstobj; - -struct base_info; - -static tree get_vfield_name PROTO((tree)); -static void finish_struct_anon PROTO((tree)); -static tree build_vbase_pointer PROTO((tree, tree)); -static tree build_vtable_entry PROTO((tree, tree)); -static tree get_vtable_name PROTO((tree)); -static tree get_derived_offset PROTO((tree, tree)); -static tree get_basefndecls PROTO((tree, tree)); -static void set_rtti_entry PROTO((tree, tree, tree)); -static tree build_vtable PROTO((tree, tree)); -static void prepare_fresh_vtable PROTO((tree, tree)); -static void fixup_vtable_deltas1 PROTO((tree, tree)); -static void fixup_vtable_deltas PROTO((tree, int, tree)); -static void finish_vtbls PROTO((tree, int, tree)); -static void modify_vtable_entry PROTO((tree, tree, tree)); -static tree get_vtable_entry_n PROTO((tree, unsigned HOST_WIDE_INT)); -static void add_virtual_function PROTO((tree *, tree *, int *, tree, tree)); -static tree delete_duplicate_fields_1 PROTO((tree, tree)); -static void delete_duplicate_fields PROTO((tree)); -static void finish_struct_bits PROTO((tree, int)); -static int alter_access PROTO((tree, tree, tree, tree)); -static void handle_using_decl PROTO((tree, tree, tree, tree)); -static int overrides PROTO((tree, tree)); -static int strictly_overrides PROTO((tree, tree)); -static void merge_overrides PROTO((tree, tree, int, tree)); -static void override_one_vtable PROTO((tree, tree, tree)); -static void mark_overriders PROTO((tree, tree)); -static void check_for_override PROTO((tree, tree)); -static tree maybe_fixup_vptrs PROTO((tree, tree, tree)); -static tree get_class_offset_1 PROTO((tree, tree, tree, tree, tree)); -static tree get_class_offset PROTO((tree, tree, tree, tree)); -static void modify_one_vtable PROTO((tree, tree, tree, tree)); -static void modify_all_vtables PROTO((tree, tree, tree)); -static void modify_all_direct_vtables PROTO((tree, int, tree, tree, - tree)); -static void modify_all_indirect_vtables PROTO((tree, int, int, tree, - tree, tree)); -static void build_class_init_list PROTO((tree)); -static int finish_base_struct PROTO((tree, struct base_info *)); -static void finish_struct_methods PROTO((tree)); -static void maybe_warn_about_overly_private_class PROTO ((tree)); -static void check_member_decl_is_same_in_complete_scope PROTO((tree, tree)); -static tree make_method_vec PROTO((int)); -static void free_method_vec PROTO((tree)); -static tree add_implicitly_declared_members PROTO((tree, int, int, int)); - -/* Way of stacking language names. */ -tree *current_lang_base, *current_lang_stack; -int current_lang_stacksize; - -/* Names of languages we recognize. */ -tree lang_name_c, lang_name_cplusplus, lang_name_java; -tree current_lang_name; - -/* When layout out an aggregate type, the size of the - basetypes (virtual and non-virtual) is passed to layout_record - via this node. */ -static tree base_layout_decl; - -/* Constants used for access control. */ -tree access_default_node; /* 0 */ -tree access_public_node; /* 1 */ -tree access_protected_node; /* 2 */ -tree access_private_node; /* 3 */ -tree access_default_virtual_node; /* 4 */ -tree access_public_virtual_node; /* 5 */ -tree access_protected_virtual_node; /* 6 */ -tree access_private_virtual_node; /* 7 */ - -/* Variables shared between class.c and call.c. */ - -#ifdef GATHER_STATISTICS -int n_vtables = 0; -int n_vtable_entries = 0; -int n_vtable_searches = 0; -int n_vtable_elems = 0; -int n_convert_harshness = 0; -int n_compute_conversion_costs = 0; -int n_build_method_call = 0; -int n_inner_fields_searched = 0; -#endif - -/* Virtual baseclass things. */ - -static tree -build_vbase_pointer (exp, type) - tree exp, type; -{ - char *name; - FORMAT_VBASE_NAME (name, type); - - return build_component_ref (exp, get_identifier (name), NULL_TREE, 0); -} - -#if 0 -/* Is the type of the EXPR, the complete type of the object? - If we are going to be wrong, we must be conservative, and return 0. */ - -static int -complete_type_p (expr) - tree expr; -{ - tree type = TYPE_MAIN_VARIANT (TREE_TYPE (expr)); - while (1) - { - switch (TREE_CODE (expr)) - { - case SAVE_EXPR: - case INDIRECT_REF: - case ADDR_EXPR: - case NOP_EXPR: - case CONVERT_EXPR: - expr = TREE_OPERAND (expr, 0); - continue; - - case CALL_EXPR: - if (! TREE_HAS_CONSTRUCTOR (expr)) - break; - /* fall through... */ - case VAR_DECL: - case FIELD_DECL: - if (TREE_CODE (TREE_TYPE (expr)) == ARRAY_TYPE - && IS_AGGR_TYPE (TREE_TYPE (TREE_TYPE (expr))) - && TYPE_MAIN_VARIANT (TREE_TYPE (expr)) == type) - return 1; - /* fall through... */ - case TARGET_EXPR: - case PARM_DECL: - if (IS_AGGR_TYPE (TREE_TYPE (expr)) - && TYPE_MAIN_VARIANT (TREE_TYPE (expr)) == type) - return 1; - /* fall through... */ - case PLUS_EXPR: - default: - break; - } - break; - } - return 0; -} -#endif - -/* Build multi-level access to EXPR using hierarchy path PATH. - CODE is PLUS_EXPR if we are going with the grain, - and MINUS_EXPR if we are not (in which case, we cannot traverse - virtual baseclass links). - - TYPE is the type we want this path to have on exit. - - NONNULL is non-zero if we know (for any reason) that EXPR is - not, in fact, zero. */ - -tree -build_vbase_path (code, type, expr, path, nonnull) - enum tree_code code; - tree type, expr, path; - int nonnull; -{ - register int changed = 0; - tree last = NULL_TREE, last_virtual = NULL_TREE; - int fixed_type_p; - tree null_expr = 0, nonnull_expr; - tree basetype; - tree offset = integer_zero_node; - - if (BINFO_INHERITANCE_CHAIN (path) == NULL_TREE) - return build1 (NOP_EXPR, type, expr); - - /* If -fthis-is-variable, we might have set nonnull incorrectly. We - don't care enough to get this right, so just clear it. */ - if (flag_this_is_variable > 0) - nonnull = 0; - - /* We could do better if we had additional logic to convert back to the - unconverted type (the static type of the complete object), and then - convert back to the type we want. Until that is done, we only optimize - if the complete type is the same type as expr has. */ - fixed_type_p = resolves_to_fixed_type_p (expr, &nonnull); - - if (!fixed_type_p && TREE_SIDE_EFFECTS (expr)) - expr = save_expr (expr); - nonnull_expr = expr; - - if (BINFO_INHERITANCE_CHAIN (path)) - path = reverse_path (path); - - basetype = BINFO_TYPE (path); - - while (path) - { - if (TREE_VIA_VIRTUAL (path)) - { - last_virtual = BINFO_TYPE (path); - if (code == PLUS_EXPR) - { - changed = ! fixed_type_p; - - if (changed) - { - tree ind; - - /* We already check for ambiguous things in the caller, just - find a path. */ - if (last) - { - tree binfo = get_binfo (last, TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (nonnull_expr))), 0); - nonnull_expr = convert_pointer_to_real (binfo, nonnull_expr); - } - ind = build_indirect_ref (nonnull_expr, NULL_PTR); - nonnull_expr = build_vbase_pointer (ind, last_virtual); - if (nonnull == 0 - && TREE_CODE (type) == POINTER_TYPE - && null_expr == NULL_TREE) - { - null_expr = build1 (NOP_EXPR, build_pointer_type (last_virtual), integer_zero_node); - expr = build (COND_EXPR, build_pointer_type (last_virtual), - build (EQ_EXPR, boolean_type_node, expr, - integer_zero_node), - null_expr, nonnull_expr); - } - } - /* else we'll figure out the offset below. */ - - /* Happens in the case of parse errors. */ - if (nonnull_expr == error_mark_node) - return error_mark_node; - } - else - { - cp_error ("cannot cast up from virtual baseclass `%T'", - last_virtual); - return error_mark_node; - } - } - last = path; - path = BINFO_INHERITANCE_CHAIN (path); - } - /* LAST is now the last basetype assoc on the path. */ - - /* A pointer to a virtual base member of a non-null object - is non-null. Therefore, we only need to test for zeroness once. - Make EXPR the canonical expression to deal with here. */ - if (null_expr) - { - TREE_OPERAND (expr, 2) = nonnull_expr; - TREE_TYPE (expr) = TREE_TYPE (TREE_OPERAND (expr, 1)) - = TREE_TYPE (nonnull_expr); - } - else - expr = nonnull_expr; - - /* If we go through any virtual base pointers, make sure that - casts to BASETYPE from the last virtual base class use - the right value for BASETYPE. */ - if (changed) - { - tree intype = TREE_TYPE (TREE_TYPE (expr)); - if (TYPE_MAIN_VARIANT (intype) != BINFO_TYPE (last)) - { - tree binfo = get_binfo (last, TYPE_MAIN_VARIANT (intype), 0); - offset = BINFO_OFFSET (binfo); - } - } - else - { - if (last_virtual) - { - offset = BINFO_OFFSET (binfo_member (last_virtual, - CLASSTYPE_VBASECLASSES (basetype))); - offset = size_binop (PLUS_EXPR, offset, BINFO_OFFSET (last)); - } - else - offset = BINFO_OFFSET (last); - } - - if (TREE_INT_CST_LOW (offset)) - { - /* Bash types to make the backend happy. */ - offset = cp_convert (type, offset); -#if 0 - /* This shouldn't be necessary. (mrs) */ - expr = build1 (NOP_EXPR, type, expr); -#endif - - /* If expr might be 0, we need to preserve that zeroness. */ - if (nonnull == 0) - { - if (null_expr) - TREE_TYPE (null_expr) = type; - else - null_expr = build1 (NOP_EXPR, type, integer_zero_node); - if (TREE_SIDE_EFFECTS (expr)) - expr = save_expr (expr); - - return build (COND_EXPR, type, - build (EQ_EXPR, boolean_type_node, expr, integer_zero_node), - null_expr, - build (code, type, expr, offset)); - } - else return build (code, type, expr, offset); - } - - /* Cannot change the TREE_TYPE of a NOP_EXPR here, since it may - be used multiple times in initialization of multiple inheritance. */ - if (null_expr) - { - TREE_TYPE (expr) = type; - return expr; - } - else - return build1 (NOP_EXPR, type, expr); -} - -/* Virtual function things. */ - -/* Build an entry in the virtual function table. - DELTA is the offset for the `this' pointer. - PFN is an ADDR_EXPR containing a pointer to the virtual function. - Note that the index (DELTA2) in the virtual function table - is always 0. */ - -static tree -build_vtable_entry (delta, pfn) - tree delta, pfn; -{ - if (flag_vtable_thunks) - { - HOST_WIDE_INT idelta = TREE_INT_CST_LOW (delta); - if (idelta && ! DECL_ABSTRACT_VIRTUAL_P (TREE_OPERAND (pfn, 0))) - { - pfn = build1 (ADDR_EXPR, vtable_entry_type, - make_thunk (pfn, idelta)); - TREE_READONLY (pfn) = 1; - TREE_CONSTANT (pfn) = 1; - } -#ifdef GATHER_STATISTICS - n_vtable_entries += 1; -#endif - return pfn; - } - else - { - extern int flag_huge_objects; - tree elems = expr_tree_cons (NULL_TREE, delta, - expr_tree_cons (NULL_TREE, integer_zero_node, - build_expr_list (NULL_TREE, pfn))); - tree entry = build (CONSTRUCTOR, vtable_entry_type, NULL_TREE, elems); - - /* DELTA used to be constructed by `size_int' and/or size_binop, - which caused overflow problems when it was negative. That should - be fixed now. */ - - if (! int_fits_type_p (delta, delta_type_node)) - { - if (flag_huge_objects) - sorry ("object size exceeds built-in limit for virtual function table implementation"); - else - sorry ("object size exceeds normal limit for virtual function table implementation, recompile all source and use -fhuge-objects"); - } - - TREE_CONSTANT (entry) = 1; - TREE_STATIC (entry) = 1; - TREE_READONLY (entry) = 1; - -#ifdef GATHER_STATISTICS - n_vtable_entries += 1; -#endif - - return entry; - } -} - -/* We want to give the assembler the vtable identifier as well as - the offset to the function pointer. So we generate - - __asm__ __volatile__ (".vtable_entry %c0, %c1" - : : "s"(&class_vtable), - "i"((long)&vtbl[idx].pfn - (long)&vtbl[0])); */ - -static void -build_vtable_entry_ref (basetype, vtbl, idx) - tree basetype, vtbl, idx; -{ - static char asm_stmt[] = ".vtable_entry %c0, %c1"; - tree s, i, i2; - - s = build_unary_op (ADDR_EXPR, TYPE_BINFO_VTABLE (basetype), 0); - s = build_tree_list (build_string (1, "s"), s); - - i = build_array_ref (vtbl, idx); - if (!flag_vtable_thunks) - i = build_component_ref (i, pfn_identifier, vtable_entry_type, 0); - i = build_c_cast (ptrdiff_type_node, build_unary_op (ADDR_EXPR, i, 0)); - i2 = build_array_ref (vtbl, build_int_2(0,0)); - i2 = build_c_cast (ptrdiff_type_node, build_unary_op (ADDR_EXPR, i2, 0)); - i = build_binary_op (MINUS_EXPR, i, i2, 0); - i = build_tree_list (build_string (1, "i"), i); - - expand_asm_operands (build_string (sizeof(asm_stmt)-1, asm_stmt), - NULL_TREE, chainon (s, i), NULL_TREE, 1, NULL, 0); -} - -/* Given an object INSTANCE, return an expression which yields the - virtual function vtable element corresponding to INDEX. There are - many special cases for INSTANCE which we take care of here, mainly - to avoid creating extra tree nodes when we don't have to. */ - -tree -build_vtbl_ref (instance, idx) - tree instance, idx; -{ - tree vtbl, aref; - tree basetype = TREE_TYPE (instance); - - if (TREE_CODE (basetype) == REFERENCE_TYPE) - basetype = TREE_TYPE (basetype); - - if (instance == current_class_ref) - vtbl = build_vfield_ref (instance, basetype); - else - { - if (optimize) - { - /* Try to figure out what a reference refers to, and - access its virtual function table directly. */ - tree ref = NULL_TREE; - - if (TREE_CODE (instance) == INDIRECT_REF - && TREE_CODE (TREE_TYPE (TREE_OPERAND (instance, 0))) == REFERENCE_TYPE) - ref = TREE_OPERAND (instance, 0); - else if (TREE_CODE (TREE_TYPE (instance)) == REFERENCE_TYPE) - ref = instance; - - if (ref && TREE_CODE (ref) == VAR_DECL - && DECL_INITIAL (ref)) - { - tree init = DECL_INITIAL (ref); - - while (TREE_CODE (init) == NOP_EXPR - || TREE_CODE (init) == NON_LVALUE_EXPR) - init = TREE_OPERAND (init, 0); - if (TREE_CODE (init) == ADDR_EXPR) - { - init = TREE_OPERAND (init, 0); - if (IS_AGGR_TYPE (TREE_TYPE (init)) - && (TREE_CODE (init) == PARM_DECL - || TREE_CODE (init) == VAR_DECL)) - instance = init; - } - } - } - - if (IS_AGGR_TYPE (TREE_TYPE (instance)) - && (TREE_CODE (instance) == RESULT_DECL - || TREE_CODE (instance) == PARM_DECL - || TREE_CODE (instance) == VAR_DECL)) - vtbl = TYPE_BINFO_VTABLE (basetype); - else - vtbl = build_vfield_ref (instance, basetype); - } - - assemble_external (vtbl); - - if (flag_vtable_gc) - build_vtable_entry_ref (basetype, vtbl, idx); - - aref = build_array_ref (vtbl, idx); - - return aref; -} - -/* Given an object INSTANCE, return an expression which yields the - virtual function corresponding to INDEX. There are many special - cases for INSTANCE which we take care of here, mainly to avoid - creating extra tree nodes when we don't have to. */ - -tree -build_vfn_ref (ptr_to_instptr, instance, idx) - tree *ptr_to_instptr, instance; - tree idx; -{ - tree aref = build_vtbl_ref (instance, idx); - - /* When using thunks, there is no extra delta, and we get the pfn - directly. */ - if (flag_vtable_thunks) - return aref; - - if (ptr_to_instptr) - { - /* Save the intermediate result in a SAVE_EXPR so we don't have to - compute each component of the virtual function pointer twice. */ - if (TREE_CODE (aref) == INDIRECT_REF) - TREE_OPERAND (aref, 0) = save_expr (TREE_OPERAND (aref, 0)); - - *ptr_to_instptr - = build (PLUS_EXPR, TREE_TYPE (*ptr_to_instptr), - *ptr_to_instptr, - cp_convert (ptrdiff_type_node, - build_component_ref (aref, delta_identifier, NULL_TREE, 0))); - } - - return build_component_ref (aref, pfn_identifier, NULL_TREE, 0); -} - -/* Return the name of the virtual function table (as an IDENTIFIER_NODE) - for the given TYPE. */ - -static tree -get_vtable_name (type) - tree type; -{ - tree type_id = build_typename_overload (type); - char *buf = (char *) alloca (strlen (VTABLE_NAME_FORMAT) - + IDENTIFIER_LENGTH (type_id) + 2); - char *ptr = IDENTIFIER_POINTER (type_id); - int i; - for (i = 0; ptr[i] == OPERATOR_TYPENAME_FORMAT[i]; i++) ; -#if 0 - /* We don't take off the numbers; prepare_fresh_vtable uses the - DECL_ASSEMBLER_NAME for the type, which includes the number - in `3foo'. If we were to pull them off here, we'd end up with - something like `_vt.foo.3bar', instead of a uniform definition. */ - while (ptr[i] >= '0' && ptr[i] <= '9') - i += 1; -#endif - sprintf (buf, VTABLE_NAME_FORMAT, ptr+i); - return get_identifier (buf); -} - -/* Return the offset to the main vtable for a given base BINFO. */ - -tree -get_vfield_offset (binfo) - tree binfo; -{ - tree tmp - = size_binop (FLOOR_DIV_EXPR, - DECL_FIELD_BITPOS (CLASSTYPE_VFIELD (BINFO_TYPE (binfo))), - size_int (BITS_PER_UNIT)); - tmp = convert (sizetype, tmp); - return size_binop (PLUS_EXPR, tmp, BINFO_OFFSET (binfo)); -} - -/* Get the offset to the start of the original binfo that we derived - this binfo from. If we find TYPE first, return the offset only - that far. The shortened search is useful because the this pointer - on method calling is expected to point to a DECL_CONTEXT (fndecl) - object, and not a baseclass of it. */ - -static tree -get_derived_offset (binfo, type) - tree binfo, type; -{ - tree offset1 = get_vfield_offset (TYPE_BINFO (BINFO_TYPE (binfo))); - tree offset2; - int i; - while (BINFO_BASETYPES (binfo) - && (i=CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (binfo))) != -1) - { - tree binfos = BINFO_BASETYPES (binfo); - if (BINFO_TYPE (binfo) == type) - break; - binfo = TREE_VEC_ELT (binfos, i); - } - offset2 = get_vfield_offset (TYPE_BINFO (BINFO_TYPE (binfo))); - return size_binop (MINUS_EXPR, offset1, offset2); -} - -/* Update the rtti info for this class. */ - -static void -set_rtti_entry (virtuals, offset, type) - tree virtuals, offset, type; -{ - tree vfn; - - if (flag_rtti) - vfn = build1 (ADDR_EXPR, vfunc_ptr_type_node, get_tinfo_fn (type)); - else - vfn = build1 (NOP_EXPR, vfunc_ptr_type_node, size_zero_node); - TREE_CONSTANT (vfn) = 1; - - if (! flag_vtable_thunks) - TREE_VALUE (virtuals) = build_vtable_entry (offset, vfn); - else - { - tree voff = build1 (NOP_EXPR, vfunc_ptr_type_node, offset); - TREE_CONSTANT (voff) = 1; - - TREE_VALUE (virtuals) = build_vtable_entry (integer_zero_node, voff); - - /* The second slot is for the tdesc pointer when thunks are used. */ - TREE_VALUE (TREE_CHAIN (virtuals)) - = build_vtable_entry (integer_zero_node, vfn); - } -} - -/* Build a virtual function for type TYPE. - If BINFO is non-NULL, build the vtable starting with the initial - approximation that it is the same as the one which is the head of - the association list. */ - -static tree -build_vtable (binfo, type) - tree binfo, type; -{ - tree name = get_vtable_name (type); - tree virtuals, decl; - - if (binfo) - { - tree offset; - - virtuals = copy_list (BINFO_VIRTUALS (binfo)); - decl = build_decl (VAR_DECL, name, TREE_TYPE (BINFO_VTABLE (binfo))); - - /* Now do rtti stuff. */ - offset = get_derived_offset (TYPE_BINFO (type), NULL_TREE); - offset = ssize_binop (MINUS_EXPR, integer_zero_node, offset); - set_rtti_entry (virtuals, offset, type); - } - else - { - virtuals = NULL_TREE; - decl = build_decl (VAR_DECL, name, void_type_node); - } - -#ifdef GATHER_STATISTICS - n_vtables += 1; - n_vtable_elems += list_length (virtuals); -#endif - - /* Set TREE_PUBLIC and TREE_EXTERN as appropriate. */ - import_export_vtable (decl, type, 0); - - decl = pushdecl_top_level (decl); - SET_IDENTIFIER_GLOBAL_VALUE (name, decl); - /* Initialize the association list for this type, based - on our first approximation. */ - TYPE_BINFO_VTABLE (type) = decl; - TYPE_BINFO_VIRTUALS (type) = virtuals; - - DECL_ARTIFICIAL (decl) = 1; - TREE_STATIC (decl) = 1; -#ifndef WRITABLE_VTABLES - /* Make them READONLY by default. (mrs) */ - TREE_READONLY (decl) = 1; -#endif - /* At one time the vtable info was grabbed 2 words at a time. This - fails on sparc unless you have 8-byte alignment. (tiemann) */ - DECL_ALIGN (decl) = MAX (TYPE_ALIGN (double_type_node), - DECL_ALIGN (decl)); - - DECL_VIRTUAL_P (decl) = 1; - DECL_CONTEXT (decl) = type; - - binfo = TYPE_BINFO (type); - SET_BINFO_NEW_VTABLE_MARKED (binfo); - return decl; -} - -extern tree signed_size_zero_node; - -/* Give TYPE a new virtual function table which is initialized - with a skeleton-copy of its original initialization. The only - entry that changes is the `delta' entry, so we can really - share a lot of structure. - - FOR_TYPE is the derived type which caused this table to - be needed. - - BINFO is the type association which provided TYPE for FOR_TYPE. - - The order in which vtables are built (by calling this function) for - an object must remain the same, otherwise a binary incompatibility - can result. */ - -static void -prepare_fresh_vtable (binfo, for_type) - tree binfo, for_type; -{ - tree basetype; - tree orig_decl = BINFO_VTABLE (binfo); - tree name; - tree new_decl; - tree offset; - tree path = binfo; - char *buf, *buf2; - char joiner = '_'; - int i; - -#ifdef JOINER - joiner = JOINER; -#endif - - basetype = TYPE_MAIN_VARIANT (BINFO_TYPE (binfo)); - - buf2 = TYPE_ASSEMBLER_NAME_STRING (basetype); - i = TYPE_ASSEMBLER_NAME_LENGTH (basetype) + 1; - - /* We know that the vtable that we are going to create doesn't exist - yet in the global namespace, and when we finish, it will be - pushed into the global namespace. In complex MI hierarchies, we - have to loop while the name we are thinking of adding is globally - defined, adding more name components to the vtable name as we - loop, until the name is unique. This is because in complex MI - cases, we might have the same base more than once. This means - that the order in which this function is called for vtables must - remain the same, otherwise binary compatibility can be - compromised. */ - - while (1) - { - char *buf1 = (char *) alloca (TYPE_ASSEMBLER_NAME_LENGTH (for_type) - + 1 + i); - char *new_buf2; - - sprintf (buf1, "%s%c%s", TYPE_ASSEMBLER_NAME_STRING (for_type), joiner, - buf2); - buf = (char *) alloca (strlen (VTABLE_NAME_FORMAT) + strlen (buf1) + 1); - sprintf (buf, VTABLE_NAME_FORMAT, buf1); - name = get_identifier (buf); - - /* If this name doesn't clash, then we can use it, otherwise - we add more to the name until it is unique. */ - - if (! IDENTIFIER_GLOBAL_VALUE (name)) - break; - - /* Set values for next loop through, if the name isn't unique. */ - - path = BINFO_INHERITANCE_CHAIN (path); - - /* We better not run out of stuff to make it unique. */ - my_friendly_assert (path != NULL_TREE, 368); - - basetype = TYPE_MAIN_VARIANT (BINFO_TYPE (path)); - - if (for_type == basetype) - { - /* If we run out of basetypes in the path, we have already - found created a vtable with that name before, we now - resort to tacking on _%d to distinguish them. */ - int j = 2; - i = TYPE_ASSEMBLER_NAME_LENGTH (basetype) + 1 + i + 1 + 3; - buf1 = (char *) alloca (i); - do { - sprintf (buf1, "%s%c%s%c%d", - TYPE_ASSEMBLER_NAME_STRING (basetype), joiner, - buf2, joiner, j); - buf = (char *) alloca (strlen (VTABLE_NAME_FORMAT) - + strlen (buf1) + 1); - sprintf (buf, VTABLE_NAME_FORMAT, buf1); - name = get_identifier (buf); - - /* If this name doesn't clash, then we can use it, - otherwise we add something different to the name until - it is unique. */ - } while (++j <= 999 && IDENTIFIER_GLOBAL_VALUE (name)); - - /* Hey, they really like MI don't they? Increase the 3 - above to 6, and the 999 to 999999. :-) */ - my_friendly_assert (j <= 999, 369); - - break; - } - - i = TYPE_ASSEMBLER_NAME_LENGTH (basetype) + 1 + i; - new_buf2 = (char *) alloca (i); - sprintf (new_buf2, "%s%c%s", - TYPE_ASSEMBLER_NAME_STRING (basetype), joiner, buf2); - buf2 = new_buf2; - } - - new_decl = build_decl (VAR_DECL, name, TREE_TYPE (orig_decl)); - /* Remember which class this vtable is really for. */ - DECL_CONTEXT (new_decl) = for_type; - - DECL_ARTIFICIAL (new_decl) = 1; - TREE_STATIC (new_decl) = 1; - BINFO_VTABLE (binfo) = pushdecl_top_level (new_decl); - DECL_VIRTUAL_P (new_decl) = 1; -#ifndef WRITABLE_VTABLES - /* Make them READONLY by default. (mrs) */ - TREE_READONLY (new_decl) = 1; -#endif - DECL_ALIGN (new_decl) = DECL_ALIGN (orig_decl); - - /* Make fresh virtual list, so we can smash it later. */ - BINFO_VIRTUALS (binfo) = copy_list (BINFO_VIRTUALS (binfo)); - - if (TREE_VIA_VIRTUAL (binfo)) - { - tree binfo1 = binfo_member (BINFO_TYPE (binfo), - CLASSTYPE_VBASECLASSES (for_type)); - - /* XXX - This should never happen, if it does, the caller should - ensure that the binfo is from for_type's binfos, not from any - base type's. We can remove all this code after a while. */ - if (binfo1 != binfo) - warning ("internal inconsistency: binfo offset error for rtti"); - - offset = BINFO_OFFSET (binfo1); - } - else - offset = BINFO_OFFSET (binfo); - - set_rtti_entry (BINFO_VIRTUALS (binfo), - ssize_binop (MINUS_EXPR, integer_zero_node, offset), - for_type); - -#ifdef GATHER_STATISTICS - n_vtables += 1; - n_vtable_elems += list_length (BINFO_VIRTUALS (binfo)); -#endif - - /* Set TREE_PUBLIC and TREE_EXTERN as appropriate. */ - import_export_vtable (new_decl, for_type, 0); - - if (TREE_VIA_VIRTUAL (binfo)) - my_friendly_assert (binfo == binfo_member (BINFO_TYPE (binfo), - CLASSTYPE_VBASECLASSES (current_class_type)), - 170); - SET_BINFO_NEW_VTABLE_MARKED (binfo); -} - -#if 0 -/* Access the virtual function table entry that logically - contains BASE_FNDECL. VIRTUALS is the virtual function table's - initializer. We can run off the end, when dealing with virtual - destructors in MI situations, return NULL_TREE in that case. */ - -static tree -get_vtable_entry (virtuals, base_fndecl) - tree virtuals, base_fndecl; -{ - unsigned HOST_WIDE_INT n = (HOST_BITS_PER_WIDE_INT >= BITS_PER_WORD - ? (TREE_INT_CST_LOW (DECL_VINDEX (base_fndecl)) - & (((unsigned HOST_WIDE_INT)1<<(BITS_PER_WORD-1))-1)) - : TREE_INT_CST_LOW (DECL_VINDEX (base_fndecl))); - -#ifdef GATHER_STATISTICS - n_vtable_searches += n; -#endif - - while (n > 0 && virtuals) - { - --n; - virtuals = TREE_CHAIN (virtuals); - } - return virtuals; -} -#endif - -/* Put new entry ENTRY into virtual function table initializer - VIRTUALS. - - Also update DECL_VINDEX (FNDECL). */ - -static void -modify_vtable_entry (old_entry_in_list, new_entry, fndecl) - tree old_entry_in_list, new_entry, fndecl; -{ - tree base_fndecl = TREE_OPERAND (FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (old_entry_in_list)), 0); - -#ifdef NOTQUITE - cp_warning ("replaced %D with %D", DECL_ASSEMBLER_NAME (base_fndecl), - DECL_ASSEMBLER_NAME (fndecl)); -#endif - TREE_VALUE (old_entry_in_list) = new_entry; - - /* Now assign virtual dispatch information, if unset. */ - /* We can dispatch this, through any overridden base function. */ - if (TREE_CODE (DECL_VINDEX (fndecl)) != INTEGER_CST) - { - DECL_VINDEX (fndecl) = DECL_VINDEX (base_fndecl); - DECL_CONTEXT (fndecl) = DECL_CONTEXT (base_fndecl); - } -} - -/* Access the virtual function table entry N. VIRTUALS is the virtual - function table's initializer. */ - -static tree -get_vtable_entry_n (virtuals, n) - tree virtuals; - unsigned HOST_WIDE_INT n; -{ - while (n > 0) - { - --n; - virtuals = TREE_CHAIN (virtuals); - } - return virtuals; -} - -/* Add a virtual function to all the appropriate vtables for the class - T. DECL_VINDEX(X) should be error_mark_node, if we want to - allocate a new slot in our table. If it is error_mark_node, we - know that no other function from another vtable is overridden by X. - HAS_VIRTUAL keeps track of how many virtuals there are in our main - vtable for the type, and we build upon the PENDING_VIRTUALS list - and return it. */ - -static void -add_virtual_function (pv, phv, has_virtual, fndecl, t) - tree *pv, *phv; - int *has_virtual; - tree fndecl; - tree t; /* Structure type. */ -{ - tree pending_virtuals = *pv; - tree pending_hard_virtuals = *phv; - - /* FUNCTION_TYPEs and OFFSET_TYPEs no longer freely - convert to void *. Make such a conversion here. */ - tree vfn = build1 (ADDR_EXPR, vfunc_ptr_type_node, fndecl); - TREE_CONSTANT (vfn) = 1; - -#ifndef DUMB_USER - if (current_class_type == 0) - cp_warning ("internal problem, current_class_type is zero when adding `%D', please report", - fndecl); - if (current_class_type && t != current_class_type) - cp_warning ("internal problem, current_class_type differs when adding `%D', please report", - fndecl); -#endif - - /* If the virtual function is a redefinition of a prior one, - figure out in which base class the new definition goes, - and if necessary, make a fresh virtual function table - to hold that entry. */ - if (DECL_VINDEX (fndecl) == error_mark_node) - { - tree entry; - - /* We remember that this was the base sub-object for rtti. */ - CLASSTYPE_RTTI (t) = t; - - /* If we are using thunks, use two slots at the front, one - for the offset pointer, one for the tdesc pointer. */ - if (*has_virtual == 0 && flag_vtable_thunks) - { - *has_virtual = 1; - } - - /* Build a new INT_CST for this DECL_VINDEX. */ - { - static tree index_table[256]; - tree idx; - /* We skip a slot for the offset/tdesc entry. */ - int i = ++(*has_virtual); - - if (i >= 256 || index_table[i] == 0) - { - idx = build_int_2 (i, 0); - if (i < 256) - index_table[i] = idx; - } - else - idx = index_table[i]; - - /* Now assign virtual dispatch information. */ - DECL_VINDEX (fndecl) = idx; - DECL_CONTEXT (fndecl) = t; - } - entry = build_vtable_entry (integer_zero_node, vfn); - pending_virtuals = tree_cons (DECL_VINDEX (fndecl), entry, pending_virtuals); - } - /* Might already be INTEGER_CST if declared twice in class. We will - give error later or we've already given it. */ - else if (TREE_CODE (DECL_VINDEX (fndecl)) != INTEGER_CST) - { - /* Need an entry in some other virtual function table. - Deal with this after we have laid out our virtual base classes. */ - pending_hard_virtuals = temp_tree_cons (fndecl, vfn, pending_hard_virtuals); - } - *pv = pending_virtuals; - *phv = pending_hard_virtuals; -} - -/* Obstack on which to build the vector of class methods. */ -struct obstack class_obstack; -extern struct obstack *current_obstack; - -/* These are method vectors that were too small for the number of - methods in some class, and so were abandoned. */ -static tree free_method_vecs; - -/* Returns a method vector with enough room for N methods. N should - be a power of two. */ - -static tree -make_method_vec (n) - int n; -{ - tree new_vec; - tree* t; - - for (t = &free_method_vecs; *t; t = &(TREE_CHAIN (*t))) - /* Note that we don't use >= n here because we don't want to - allocate a very large vector where it isn't needed. */ - if (TREE_VEC_LENGTH (*t) == n) - { - new_vec = *t; - *t = TREE_CHAIN (new_vec); - TREE_CHAIN (new_vec) = NULL_TREE; - bzero ((PTR) &TREE_VEC_ELT (new_vec, 0), n * sizeof (tree)); - return new_vec; - } - - new_vec = make_tree_vec (n); - return new_vec; -} - -/* Free the method vector VEC. */ - -static void -free_method_vec (vec) - tree vec; -{ - TREE_CHAIN (vec) = free_method_vecs; - free_method_vecs = vec; -} - -/* Add method METHOD to class TYPE. - - If non-NULL, FIELDS is the entry in the METHOD_VEC vector entry of - the class type where the method should be added. */ - -void -add_method (type, fields, method) - tree type, *fields, method; -{ - push_obstacks (&permanent_obstack, &permanent_obstack); - - /* Setting the DECL_CONTEXT and DECL_CLASS_CONTEXT here is probably - redundant. */ - DECL_CONTEXT (method) = type; - DECL_CLASS_CONTEXT (method) = type; - - if (fields && *fields) - *fields = build_overload (method, *fields); - else - { - int len; - tree method_vec; - - if (!CLASSTYPE_METHOD_VEC (type)) - /* Make a new method vector. We start with 8 entries. We must - allocate at least two (for constructors and destructors), and - we're going to end up with an assignment operator at some - point as well. - - We could use a TREE_LIST for now, and convert it to a - TREE_VEC in finish_struct, but we would probably waste more - memory making the links in the list than we would by - over-allocating the size of the vector here. Furthermore, - we would complicate all the code that expects this to be a - vector. We keep a free list of vectors that we outgrew so - that we don't really waste any memory. */ - CLASSTYPE_METHOD_VEC (type) = make_method_vec (8); - - method_vec = CLASSTYPE_METHOD_VEC (type); - len = TREE_VEC_LENGTH (method_vec); - - if (DECL_NAME (method) == constructor_name (type)) - { - /* A new constructor or destructor. Constructors go in - slot 0; destructors go in slot 1. */ - int slot - = DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (method)) ? 1 : 0; - - TREE_VEC_ELT (method_vec, slot) - = build_overload (method, TREE_VEC_ELT (method_vec, slot)); - } - else - { - int i; - - /* See if we already have an entry with this name. */ - for (i = 2; i < len; ++i) - if (!TREE_VEC_ELT (method_vec, i) - || (DECL_NAME (OVL_CURRENT (TREE_VEC_ELT (method_vec, i))) - == DECL_NAME (method))) - break; - - if (i == len) - { - /* We need a bigger method vector. */ - tree new_vec = make_method_vec (2 * len); - bcopy ((PTR) &TREE_VEC_ELT (method_vec, 0), - (PTR) &TREE_VEC_ELT (new_vec, 0), - len * sizeof (tree)); - free_method_vec (method_vec); - len = 2 * len; - method_vec = CLASSTYPE_METHOD_VEC (type) = new_vec; - } - else if (template_class_depth (type)) - /* TYPE is a template class. Don't issue any errors now; - wait until instantiation time to complain. */ - ; - else - { - tree fns; - - /* Check to see if we've already got this method. */ - for (fns = TREE_VEC_ELT (method_vec, i); - fns; - fns = OVL_NEXT (fns)) - { - tree fn = OVL_CURRENT (fns); - - if (TREE_CODE (fn) != TREE_CODE (method)) - continue; - - if (TREE_CODE (method) != TEMPLATE_DECL) - { - /* [over.load] Member function declarations with the - same name and the same parameter types cannot be - overloaded if any of them is a static member - function declaration. */ - if (DECL_STATIC_FUNCTION_P (fn) - != DECL_STATIC_FUNCTION_P (method)) - { - tree parms1 = TYPE_ARG_TYPES (TREE_TYPE (fn)); - tree parms2 = TYPE_ARG_TYPES (TREE_TYPE (method)); - - if (! DECL_STATIC_FUNCTION_P (fn)) - parms1 = TREE_CHAIN (parms1); - else - parms2 = TREE_CHAIN (parms2); - - if (compparms (parms1, parms2)) - cp_error ("`%#D' and `%#D' cannot be overloaded", - fn, method); - } - - /* Since this is an ordinary function in a - non-template class, it's mangled name can be - used as a unique identifier. This technique - is only an optimization; we would get the - same results if we just used decls_match - here. */ - if (DECL_ASSEMBLER_NAME (fn) - != DECL_ASSEMBLER_NAME (method)) - continue; - } - else if (!decls_match (fn, method)) - continue; - - /* There has already been a declaration of this - method or member template. */ - cp_error_at ("`%D' has already been declared in `%T'", - method, type); - - /* We don't call duplicate_decls here to merege the - declarations because that will confuse things if - the methods have inline definitions In - particular, we will crash while processing the - definitions. */ - return; - } - } - - if (TREE_VEC_ELT (method_vec, i)) - /* We found a match. */; - else if (DECL_CONV_FN_P (method)) - { - /* Type conversion operators have to come before - ordinary methods; add_conversions depends on this to - speed up looking for conversion operators. So, if - necessary, we slide some of the vector elements up. - In theory, this makes this algorithm O(N^2) but we - don't expect many conversion operators. */ - for (i = 2; i < len; ++i) - { - tree fn = TREE_VEC_ELT (method_vec, i); - - if (!fn) - /* There are no more entries in the vector, so we - can insert the new conversion operator here. */ - break; - - if (! DECL_CONV_FN_P (OVL_CURRENT (fn))) - /* We can insert the new function right at the Ith - position. */ - break; - } - - if (!TREE_VEC_ELT (method_vec, i)) - /* There is nothing in the Ith slot, so we can avoid - moving anything. */ - ; - else - { - /* We know the last slot in the vector is empty - because we know that at this point there's room for - a new function. */ - bcopy ((PTR) &TREE_VEC_ELT (method_vec, i), - (PTR) &TREE_VEC_ELT (method_vec, i + 1), - (len - i - 1) * sizeof (tree)); - TREE_VEC_ELT (method_vec, i) = NULL_TREE; - } - } - - /* Actually insert the new method. */ - TREE_VEC_ELT (method_vec, i) - = build_overload (method, TREE_VEC_ELT (method_vec, i)); - } - - if (TYPE_BINFO_BASETYPES (type) && CLASSTYPE_BASELINK_VEC (type)) - { - /* ??? May be better to know whether these can be extended? */ - tree baselink_vec = CLASSTYPE_BASELINK_VEC (type); - - TREE_VEC_LENGTH (baselink_vec) += 1; - CLASSTYPE_BASELINK_VEC (type) = copy_node (baselink_vec); - TREE_VEC_LENGTH (baselink_vec) -= 1; - - TREE_VEC_ELT (CLASSTYPE_BASELINK_VEC (type), len) = 0; - } - } - pop_obstacks (); -} - -/* Subroutines of finish_struct. */ - -/* Look through the list of fields for this struct, deleting - duplicates as we go. This must be recursive to handle - anonymous unions. - - FIELD is the field which may not appear anywhere in FIELDS. - FIELD_PTR, if non-null, is the starting point at which - chained deletions may take place. - The value returned is the first acceptable entry found - in FIELDS. - - Note that anonymous fields which are not of UNION_TYPE are - not duplicates, they are just anonymous fields. This happens - when we have unnamed bitfields, for example. */ - -static tree -delete_duplicate_fields_1 (field, fields) - tree field, fields; -{ - tree x; - tree prev = 0; - if (DECL_NAME (field) == 0) - { - if (TREE_CODE (TREE_TYPE (field)) != UNION_TYPE) - return fields; - - for (x = TYPE_FIELDS (TREE_TYPE (field)); x; x = TREE_CHAIN (x)) - fields = delete_duplicate_fields_1 (x, fields); - return fields; - } - else - { - for (x = fields; x; prev = x, x = TREE_CHAIN (x)) - { - if (DECL_NAME (x) == 0) - { - if (TREE_CODE (TREE_TYPE (x)) != UNION_TYPE) - continue; - TYPE_FIELDS (TREE_TYPE (x)) - = delete_duplicate_fields_1 (field, TYPE_FIELDS (TREE_TYPE (x))); - if (TYPE_FIELDS (TREE_TYPE (x)) == 0) - { - if (prev == 0) - fields = TREE_CHAIN (fields); - else - TREE_CHAIN (prev) = TREE_CHAIN (x); - } - } - else - { - if (DECL_NAME (field) == DECL_NAME (x)) - { - if (TREE_CODE (field) == CONST_DECL - && TREE_CODE (x) == CONST_DECL) - cp_error_at ("duplicate enum value `%D'", x); - else if (TREE_CODE (field) == CONST_DECL - || TREE_CODE (x) == CONST_DECL) - cp_error_at ("duplicate field `%D' (as enum and non-enum)", - x); - else if (DECL_DECLARES_TYPE_P (field) - && DECL_DECLARES_TYPE_P (x)) - { - if (same_type_p (TREE_TYPE (field), TREE_TYPE (x))) - continue; - cp_error_at ("duplicate nested type `%D'", x); - } - else if (DECL_DECLARES_TYPE_P (field) - || DECL_DECLARES_TYPE_P (x)) - { - /* Hide tag decls. */ - if ((TREE_CODE (field) == TYPE_DECL - && DECL_ARTIFICIAL (field)) - || (TREE_CODE (x) == TYPE_DECL - && DECL_ARTIFICIAL (x))) - continue; - cp_error_at ("duplicate field `%D' (as type and non-type)", - x); - } - else - cp_error_at ("duplicate member `%D'", x); - if (prev == 0) - fields = TREE_CHAIN (fields); - else - TREE_CHAIN (prev) = TREE_CHAIN (x); - } - } - } - } - return fields; -} - -static void -delete_duplicate_fields (fields) - tree fields; -{ - tree x; - for (x = fields; x && TREE_CHAIN (x); x = TREE_CHAIN (x)) - TREE_CHAIN (x) = delete_duplicate_fields_1 (x, TREE_CHAIN (x)); -} - -/* Change the access of FDECL to ACCESS in T. The access to FDECL is - along the path given by BINFO. Return 1 if change was legit, - otherwise return 0. */ - -static int -alter_access (t, binfo, fdecl, access) - tree t; - tree binfo; - tree fdecl; - tree access; -{ - tree elem = purpose_member (t, DECL_ACCESS (fdecl)); - if (elem) - { - if (TREE_VALUE (elem) != access) - { - if (TREE_CODE (TREE_TYPE (fdecl)) == FUNCTION_DECL) - cp_error_at ("conflicting access specifications for method `%D', ignored", TREE_TYPE (fdecl)); - else - error ("conflicting access specifications for field `%s', ignored", - IDENTIFIER_POINTER (DECL_NAME (fdecl))); - } - else - { - /* They're changing the access to the same thing they changed - it to before. That's OK. */ - ; - } - } - else - { - enforce_access (binfo, fdecl); - - DECL_ACCESS (fdecl) = tree_cons (t, access, DECL_ACCESS (fdecl)); - return 1; - } - return 0; -} - -/* Process the USING_DECL, which is a member of T. The METHOD_VEC, if - non-NULL, is the methods of T. The FIELDS are the fields of T. */ - -static void -handle_using_decl (using_decl, t, method_vec, fields) - tree using_decl; - tree t; - tree method_vec; - tree fields; -{ - tree ctype = DECL_INITIAL (using_decl); - tree name = DECL_NAME (using_decl); - tree access - = TREE_PRIVATE (using_decl) ? access_private_node - : TREE_PROTECTED (using_decl) ? access_protected_node - : access_public_node; - tree fdecl, binfo; - tree flist = NULL_TREE; - tree tmp; - int i; - int n_methods; - - binfo = binfo_or_else (ctype, t); - if (! binfo) - return; - - if (name == constructor_name (ctype) - || name == constructor_name_full (ctype)) - { - cp_error_at ("using-declaration for constructor", using_decl); - return; - } - - fdecl = lookup_member (binfo, name, 0, 0); - - if (!fdecl) - { - cp_error_at ("no members matching `%D' in `%#T'", using_decl, ctype); - return; - } - - /* Functions are represented as TREE_LIST, with the purpose - being the type and the value the functions. Other members - come as themselves. */ - if (TREE_CODE (fdecl) == TREE_LIST) - /* Ignore base type this came from. */ - fdecl = TREE_VALUE (fdecl); - - if (TREE_CODE (fdecl) == OVERLOAD) - { - /* We later iterate over all functions. */ - flist = fdecl; - fdecl = OVL_FUNCTION (flist); - } - - name = DECL_NAME (fdecl); - n_methods = method_vec ? TREE_VEC_LENGTH (method_vec) : 0; - for (i = 2; i < n_methods && TREE_VEC_ELT (method_vec, i); i++) - if (DECL_NAME (OVL_CURRENT (TREE_VEC_ELT (method_vec, i))) - == name) - { - cp_error ("cannot adjust access to `%#D' in `%#T'", fdecl, t); - cp_error_at (" because of local method `%#D' with same name", - OVL_CURRENT (TREE_VEC_ELT (method_vec, i))); - return; - } - - if (! DECL_LANG_SPECIFIC (fdecl)) - /* We don't currently handle DECL_ACCESS for TYPE_DECLs; just return. */ - return; - - for (tmp = fields; tmp; tmp = TREE_CHAIN (tmp)) - if (DECL_NAME (tmp) == name) - { - cp_error ("cannot adjust access to `%#D' in `%#T'", fdecl, t); - cp_error_at (" because of local field `%#D' with same name", tmp); - return; - } - - /* Make type T see field decl FDECL with access ACCESS.*/ - if (flist) - { - while (flist) - { - if (alter_access (t, binfo, OVL_FUNCTION (flist), - access) == 0) - return; - flist = OVL_CHAIN (flist); - } - } - else - alter_access (t, binfo, fdecl, access); -} - -/* If FOR_TYPE needs to reinitialize virtual function table pointers - for TYPE's sub-objects, add such reinitializations to BASE_INIT_LIST. - Returns BASE_INIT_LIST appropriately modified. */ - -static tree -maybe_fixup_vptrs (for_type, binfo, base_init_list) - tree for_type, binfo, base_init_list; -{ - /* Now reinitialize any slots that don't fall under our virtual - function table pointer. */ - tree vfields = CLASSTYPE_VFIELDS (BINFO_TYPE (binfo)); - while (vfields) - { - tree basetype = VF_NORMAL_VALUE (vfields) - ? TYPE_MAIN_VARIANT (VF_NORMAL_VALUE (vfields)) - : VF_BASETYPE_VALUE (vfields); - - tree base_binfo = get_binfo (basetype, for_type, 0); - /* Punt until this is implemented. */ - if (1 /* BINFO_MODIFIED (base_binfo) */) - { - tree base_offset = get_vfield_offset (base_binfo); - if (! tree_int_cst_equal (base_offset, get_vfield_offset (TYPE_BINFO (for_type))) - && ! tree_int_cst_equal (base_offset, get_vfield_offset (binfo))) - base_init_list = tree_cons (error_mark_node, base_binfo, - base_init_list); - } - vfields = TREE_CHAIN (vfields); - } - return base_init_list; -} - -/* If TYPE does not have a constructor, then the compiler must - manually deal with all of the initialization this type requires. - - If a base initializer exists only to fill in the virtual function - table pointer, then we mark that fact with the TREE_VIRTUAL bit. - This way, we avoid multiple initializations of the same field by - each virtual function table up the class hierarchy. - - Virtual base class pointers are not initialized here. They are - initialized only at the "top level" of object creation. If we - initialized them here, we would have to skip a lot of work. */ - -static void -build_class_init_list (type) - tree type; -{ - tree base_init_list = NULL_TREE; - tree member_init_list = NULL_TREE; - - /* Since we build member_init_list and base_init_list using - tree_cons, backwards fields the all through work. */ - tree x; - tree binfos = BINFO_BASETYPES (TYPE_BINFO (type)); - int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0; - - for (x = TYPE_FIELDS (type); x; x = TREE_CHAIN (x)) - { - if (TREE_CODE (x) != FIELD_DECL) - continue; - - if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (x)) - || DECL_INITIAL (x) != NULL_TREE) - member_init_list = tree_cons (x, type, member_init_list); - } - member_init_list = nreverse (member_init_list); - - /* We will end up doing this last. Need special marker - to avoid infinite regress. */ - if (TYPE_VIRTUAL_P (type)) - { - base_init_list = build_tree_list (error_mark_node, TYPE_BINFO (type)); - if (CLASSTYPE_NEEDS_VIRTUAL_REINIT (type) == 0) - TREE_VALUE (base_init_list) = NULL_TREE; - TREE_ADDRESSABLE (base_init_list) = 1; - } - - /* Each base class which needs to have initialization - of some kind gets to make such requests known here. */ - for (i = n_baseclasses-1; i >= 0; i--) - { - tree base_binfo = TREE_VEC_ELT (binfos, i); - tree blist; - - /* Don't initialize virtual baseclasses this way. */ - if (TREE_VIA_VIRTUAL (base_binfo)) - continue; - - if (TYPE_HAS_CONSTRUCTOR (BINFO_TYPE (base_binfo))) - { - /* ...and the last shall come first... */ - base_init_list = maybe_fixup_vptrs (type, base_binfo, base_init_list); - base_init_list = tree_cons (NULL_TREE, base_binfo, base_init_list); - continue; - } - - if ((blist = CLASSTYPE_BASE_INIT_LIST (BINFO_TYPE (base_binfo))) == NULL_TREE) - /* Nothing to initialize. */ - continue; - - /* ...ditto... */ - base_init_list = maybe_fixup_vptrs (type, base_binfo, base_init_list); - - /* This is normally true for single inheritance. - The win is we can shrink the chain of initializations - to be done by only converting to the actual type - we are interested in. */ - if (TREE_VALUE (blist) - && TREE_CODE (TREE_VALUE (blist)) == TREE_VEC - && tree_int_cst_equal (BINFO_OFFSET (base_binfo), - BINFO_OFFSET (TREE_VALUE (blist)))) - { - if (base_init_list) - { - /* Does it do more than just fill in a - virtual function table pointer? */ - if (! TREE_ADDRESSABLE (blist)) - base_init_list = build_tree_list (blist, base_init_list); - /* Can we get by just with the virtual function table - pointer that it fills in? */ - else if (TREE_ADDRESSABLE (base_init_list) - && TREE_VALUE (base_init_list) == 0) - base_init_list = blist; - /* Maybe, but it is not obvious as the previous case. */ - else if (! CLASSTYPE_NEEDS_VIRTUAL_REINIT (type)) - { - tree last = tree_last (base_init_list); - while (TREE_VALUE (last) - && TREE_CODE (TREE_VALUE (last)) == TREE_LIST) - last = tree_last (TREE_VALUE (last)); - if (TREE_VALUE (last) == 0) - base_init_list = build_tree_list (blist, base_init_list); - } - } - else - base_init_list = blist; - } - else - { - /* The function expand_aggr_init knows how to do the - initialization of `basetype' without getting - an explicit `blist'. */ - if (base_init_list) - base_init_list = tree_cons (NULL_TREE, base_binfo, base_init_list); - else - base_init_list = CLASSTYPE_BINFO_AS_LIST (BINFO_TYPE (base_binfo)); - } - } - - if (base_init_list) - { - if (member_init_list) - CLASSTYPE_BASE_INIT_LIST (type) = - build_tree_list (base_init_list, member_init_list); - else - CLASSTYPE_BASE_INIT_LIST (type) = base_init_list; - } - else if (member_init_list) - CLASSTYPE_BASE_INIT_LIST (type) = member_init_list; -} - -struct base_info -{ - int has_virtual; - int max_has_virtual; - int n_ancestors; - tree vfield; - tree vfields; - tree rtti; - char cant_have_default_ctor; - char cant_have_const_ctor; - char no_const_asn_ref; -}; - -/* Record information about type T derived from its base classes. - Store most of that information in T itself, and place the - remaining information in the struct BASE_INFO. - - Propagate basetype offsets throughout the lattice. Note that the - lattice topped by T is really a pair: it's a DAG that gives the - structure of the derivation hierarchy, and it's a list of the - virtual baseclasses that appear anywhere in the DAG. When a vbase - type appears in the DAG, it's offset is 0, and it's children start - their offsets from that point. When a vbase type appears in the list, - its offset is the offset it has in the hierarchy, and its children's - offsets include that offset in theirs. - - Returns the index of the first base class to have virtual functions, - or -1 if no such base class. */ - -static int -finish_base_struct (t, b) - tree t; - struct base_info *b; -{ - tree binfos = TYPE_BINFO_BASETYPES (t); - int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0; - int first_vfn_base_index = -1; - bzero ((char *) b, sizeof (struct base_info)); - - for (i = 0; i < n_baseclasses; i++) - { - tree base_binfo = TREE_VEC_ELT (binfos, i); - tree basetype = BINFO_TYPE (base_binfo); - - /* Effective C++ rule 14. We only need to check TYPE_VIRTUAL_P - here because the case of virtual functions but non-virtual - dtor is handled in finish_struct_1. */ - if (warn_ecpp && ! TYPE_VIRTUAL_P (basetype) - && TYPE_HAS_DESTRUCTOR (basetype)) - cp_warning ("base class `%#T' has a non-virtual destructor", basetype); - - /* If the type of basetype is incomplete, then - we already complained about that fact - (and we should have fixed it up as well). */ - if (TYPE_SIZE (basetype) == 0) - { - int j; - /* The base type is of incomplete type. It is - probably best to pretend that it does not - exist. */ - if (i == n_baseclasses-1) - TREE_VEC_ELT (binfos, i) = NULL_TREE; - TREE_VEC_LENGTH (binfos) -= 1; - n_baseclasses -= 1; - for (j = i; j+1 < n_baseclasses; j++) - TREE_VEC_ELT (binfos, j) = TREE_VEC_ELT (binfos, j+1); - } - - if (! TYPE_HAS_CONST_INIT_REF (basetype)) - b->cant_have_const_ctor = 1; - - if (TYPE_HAS_CONSTRUCTOR (basetype) - && ! TYPE_HAS_DEFAULT_CONSTRUCTOR (basetype)) - { - b->cant_have_default_ctor = 1; - if (! TYPE_HAS_CONSTRUCTOR (t)) - { - cp_pedwarn ("base `%T' with only non-default constructor", - basetype); - cp_pedwarn ("in class without a constructor"); - } - } - - if (TYPE_HAS_ASSIGN_REF (basetype) - && !TYPE_HAS_CONST_ASSIGN_REF (basetype)) - b->no_const_asn_ref = 1; - - b->n_ancestors += CLASSTYPE_N_SUPERCLASSES (basetype); - TYPE_NEEDS_CONSTRUCTING (t) |= TYPE_NEEDS_CONSTRUCTING (basetype); - TYPE_NEEDS_DESTRUCTOR (t) |= TYPE_NEEDS_DESTRUCTOR (basetype); - TYPE_HAS_COMPLEX_ASSIGN_REF (t) |= TYPE_HAS_COMPLEX_ASSIGN_REF (basetype); - TYPE_HAS_COMPLEX_INIT_REF (t) |= TYPE_HAS_COMPLEX_INIT_REF (basetype); - - TYPE_OVERLOADS_CALL_EXPR (t) |= TYPE_OVERLOADS_CALL_EXPR (basetype); - TYPE_OVERLOADS_ARRAY_REF (t) |= TYPE_OVERLOADS_ARRAY_REF (basetype); - TYPE_OVERLOADS_ARROW (t) |= TYPE_OVERLOADS_ARROW (basetype); - - if (! TREE_VIA_VIRTUAL (base_binfo)) - CLASSTYPE_N_SUPERCLASSES (t) += 1; - - if (TYPE_VIRTUAL_P (basetype)) - { - /* Ensure that this is set from at least a virtual base - class. */ - if (b->rtti == NULL_TREE) - b->rtti = CLASSTYPE_RTTI (basetype); - - /* Don't borrow virtuals from virtual baseclasses. */ - if (TREE_VIA_VIRTUAL (base_binfo)) - continue; - - if (first_vfn_base_index < 0) - { - tree vfields; - first_vfn_base_index = i; - - /* Update these two, now that we know what vtable we are - going to extend. This is so that we can add virtual - functions, and override them properly. */ - TYPE_BINFO_VTABLE (t) = TYPE_BINFO_VTABLE (basetype); - TYPE_BINFO_VIRTUALS (t) = TYPE_BINFO_VIRTUALS (basetype); - b->has_virtual = CLASSTYPE_VSIZE (basetype); - b->vfield = CLASSTYPE_VFIELD (basetype); - b->vfields = copy_list (CLASSTYPE_VFIELDS (basetype)); - vfields = b->vfields; - while (vfields) - { - if (VF_BINFO_VALUE (vfields) == NULL_TREE - || ! TREE_VIA_VIRTUAL (VF_BINFO_VALUE (vfields))) - { - tree value = VF_BASETYPE_VALUE (vfields); - if (DECL_NAME (CLASSTYPE_VFIELD (value)) - == DECL_NAME (CLASSTYPE_VFIELD (basetype))) - VF_NORMAL_VALUE (b->vfields) = basetype; - else - VF_NORMAL_VALUE (b->vfields) = VF_NORMAL_VALUE (vfields); - } - vfields = TREE_CHAIN (vfields); - } - CLASSTYPE_VFIELD (t) = b->vfield; - } - else - { - /* Only add unique vfields, and flatten them out as we go. */ - tree vfields = CLASSTYPE_VFIELDS (basetype); - while (vfields) - { - if (VF_BINFO_VALUE (vfields) == NULL_TREE - || ! TREE_VIA_VIRTUAL (VF_BINFO_VALUE (vfields))) - { - tree value = VF_BASETYPE_VALUE (vfields); - b->vfields = tree_cons (base_binfo, value, b->vfields); - if (DECL_NAME (CLASSTYPE_VFIELD (value)) - == DECL_NAME (CLASSTYPE_VFIELD (basetype))) - VF_NORMAL_VALUE (b->vfields) = basetype; - else - VF_NORMAL_VALUE (b->vfields) = VF_NORMAL_VALUE (vfields); - } - vfields = TREE_CHAIN (vfields); - } - - if (b->has_virtual == 0) - { - first_vfn_base_index = i; - - /* Update these two, now that we know what vtable we are - going to extend. This is so that we can add virtual - functions, and override them properly. */ - TYPE_BINFO_VTABLE (t) = TYPE_BINFO_VTABLE (basetype); - TYPE_BINFO_VIRTUALS (t) = TYPE_BINFO_VIRTUALS (basetype); - b->has_virtual = CLASSTYPE_VSIZE (basetype); - b->vfield = CLASSTYPE_VFIELD (basetype); - CLASSTYPE_VFIELD (t) = b->vfield; - /* When we install the first one, set the VF_NORMAL_VALUE - to be the current class, as this it is the most derived - class. Hopefully, this is not set to something else - later. (mrs) */ - vfields = b->vfields; - while (vfields) - { - if (DECL_NAME (CLASSTYPE_VFIELD (t)) - == DECL_NAME (CLASSTYPE_VFIELD (basetype))) - { - VF_NORMAL_VALUE (vfields) = t; - /* There should only be one of them! And it should - always be found, if we get into here. (mrs) */ - break; - } - vfields = TREE_CHAIN (vfields); - } - } - } - } - } - - { - tree vfields; - /* Find the base class with the largest number of virtual functions. */ - for (vfields = b->vfields; vfields; vfields = TREE_CHAIN (vfields)) - { - if (CLASSTYPE_VSIZE (VF_BASETYPE_VALUE (vfields)) > b->max_has_virtual) - b->max_has_virtual = CLASSTYPE_VSIZE (VF_BASETYPE_VALUE (vfields)); - if (VF_DERIVED_VALUE (vfields) - && CLASSTYPE_VSIZE (VF_DERIVED_VALUE (vfields)) > b->max_has_virtual) - b->max_has_virtual = CLASSTYPE_VSIZE (VF_DERIVED_VALUE (vfields)); - } - } - - if (b->vfield == 0) - /* If all virtual functions come only from virtual baseclasses. */ - return -1; - - /* Update the rtti base if we have a non-virtual base class version - of it. */ - b->rtti = CLASSTYPE_RTTI (BINFO_TYPE (TREE_VEC_ELT (binfos, first_vfn_base_index))); - - return first_vfn_base_index; -} - -/* Set memoizing fields and bits of T (and its variants) for later use. - MAX_HAS_VIRTUAL is the largest size of any T's virtual function tables. */ - -static void -finish_struct_bits (t, max_has_virtual) - tree t; - int max_has_virtual; -{ - int i, n_baseclasses = CLASSTYPE_N_BASECLASSES (t); - - /* Fix up variants (if any). */ - tree variants = TYPE_NEXT_VARIANT (t); - while (variants) - { - /* These fields are in the _TYPE part of the node, not in - the TYPE_LANG_SPECIFIC component, so they are not shared. */ - TYPE_HAS_CONSTRUCTOR (variants) = TYPE_HAS_CONSTRUCTOR (t); - TYPE_HAS_DESTRUCTOR (variants) = TYPE_HAS_DESTRUCTOR (t); - TYPE_NEEDS_CONSTRUCTING (variants) = TYPE_NEEDS_CONSTRUCTING (t); - TYPE_NEEDS_DESTRUCTOR (variants) = TYPE_NEEDS_DESTRUCTOR (t); - - TYPE_USES_COMPLEX_INHERITANCE (variants) = TYPE_USES_COMPLEX_INHERITANCE (t); - TYPE_VIRTUAL_P (variants) = TYPE_VIRTUAL_P (t); - TYPE_USES_VIRTUAL_BASECLASSES (variants) = TYPE_USES_VIRTUAL_BASECLASSES (t); - /* Copy whatever these are holding today. */ - TYPE_MIN_VALUE (variants) = TYPE_MIN_VALUE (t); - TYPE_MAX_VALUE (variants) = TYPE_MAX_VALUE (t); - TYPE_FIELDS (variants) = TYPE_FIELDS (t); - TYPE_SIZE (variants) = TYPE_SIZE (t); - TYPE_SIZE_UNIT (variants) = TYPE_SIZE_UNIT (t); - variants = TYPE_NEXT_VARIANT (variants); - } - - if (n_baseclasses && max_has_virtual) - { - /* for a class w/o baseclasses, `finish_struct' has set - * CLASS_TYPE_ABSTRACT_VIRTUALS correctly (by definition). Similarly - * for a class who's base classes do not have vtables. When neither of - * these is true, we might have removed abstract virtuals (by - * providing a definition), added some (by declaring new ones), or - * redeclared ones from a base class. We need to recalculate what's - * really an abstract virtual at this point (by looking in the vtables). - */ - CLASSTYPE_ABSTRACT_VIRTUALS (t) = get_abstract_virtuals (t); - } - - if (n_baseclasses) - { - /* Notice whether this class has type conversion functions defined. */ - tree binfo = TYPE_BINFO (t); - tree binfos = BINFO_BASETYPES (binfo); - tree basetype; - - for (i = n_baseclasses-1; i >= 0; i--) - { - basetype = BINFO_TYPE (TREE_VEC_ELT (binfos, i)); - - TYPE_HAS_CONVERSION (t) |= TYPE_HAS_CONVERSION (basetype); - if (CLASSTYPE_MAX_DEPTH (basetype) >= CLASSTYPE_MAX_DEPTH (t)) - CLASSTYPE_MAX_DEPTH (t) = CLASSTYPE_MAX_DEPTH (basetype) + 1; - } - } - - /* If this type has a copy constructor, force its mode to be BLKmode, and - force its TREE_ADDRESSABLE bit to be nonzero. This will cause it to - be passed by invisible reference and prevent it from being returned in - a register. - - Also do this if the class has BLKmode but can still be returned in - registers, since function_cannot_inline_p won't let us inline - functions returning such a type. This affects the HP-PA. */ - if (! TYPE_HAS_TRIVIAL_INIT_REF (t) - || (TYPE_MODE (t) == BLKmode && ! aggregate_value_p (t) - && CLASSTYPE_NON_AGGREGATE (t))) - { - tree variants; - DECL_MODE (TYPE_MAIN_DECL (t)) = BLKmode; - for (variants = t; variants; variants = TYPE_NEXT_VARIANT (variants)) - { - TYPE_MODE (variants) = BLKmode; - TREE_ADDRESSABLE (variants) = 1; - } - } -} - -/* Issue warnings about T having private constructors, but no friends, - and so forth. - - HAS_NONPRIVATE_METHOD is nonzero if T has any non-private methods or - static members. HAS_NONPRIVATE_STATIC_FN is nonzero if T has any - non-private static member functions. */ - -static void -maybe_warn_about_overly_private_class (t) - tree t; -{ - int has_member_fn = 0; - int has_nonprivate_method = 0; - tree fn; - - if (!warn_ctor_dtor_privacy - /* If the class has friends, those entities might create and - access instances, so we should not warn. */ - || (CLASSTYPE_FRIEND_CLASSES (t) - || DECL_FRIENDLIST (TYPE_MAIN_DECL (t))) - /* We will have warned when the template was declared; there's - no need to warn on every instantiation. */ - || CLASSTYPE_TEMPLATE_INSTANTIATION (t)) - /* There's no reason to even consider warning about this - class. */ - return; - - /* We only issue one warning, if more than one applies, because - otherwise, on code like: - - class A { - // Oops - forgot `public:' - A(); - A(const A&); - ~A(); - }; - - we warn several times about essentially the same problem. */ - - /* Check to see if all (non-constructor, non-destructor) member - functions are private. (Since there are no friends or - non-private statics, we can't ever call any of the private member - functions.) */ - for (fn = TYPE_METHODS (t); fn; fn = TREE_CHAIN (fn)) - /* We're not interested in compiler-generated methods; they don't - provide any way to call private members. */ - if (!DECL_ARTIFICIAL (fn)) - { - if (!TREE_PRIVATE (fn)) - { - if (DECL_STATIC_FUNCTION_P (fn)) - /* A non-private static member function is just like a - friend; it can create and invoke private member - functions, and be accessed without a class - instance. */ - return; - - has_nonprivate_method = 1; - break; - } - else if (!DECL_CONSTRUCTOR_P (fn) && !DECL_DESTRUCTOR_P (fn)) - has_member_fn = 1; - } - - if (!has_nonprivate_method && has_member_fn) - { - /* There are no non-private methods, and there's at least one - private member function that isn't a constructor or - destructor. (If all the private members are - constructors/destructors we want to use the code below that - issues error messages specifically referring to - constructors/destructors.) */ - int i; - tree binfos = BINFO_BASETYPES (TYPE_BINFO (t)); - for (i = 0; i < CLASSTYPE_N_BASECLASSES (t); i++) - if (TREE_VIA_PUBLIC (TREE_VEC_ELT (binfos, i)) - || TREE_VIA_PROTECTED (TREE_VEC_ELT (binfos, i))) - { - has_nonprivate_method = 1; - break; - } - if (!has_nonprivate_method) - { - cp_warning ("all member functions in class `%T' are private", t); - return; - } - } - - /* Even if some of the member functions are non-private, the class - won't be useful for much if all the constructors or destructors - are private: such an object can never be created or destroyed. */ - if (TYPE_HAS_DESTRUCTOR (t)) - { - tree dtor = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (t), 1); - - if (TREE_PRIVATE (dtor)) - { - cp_warning ("`%#T' only defines a private destructor and has no friends", - t); - return; - } - } - - if (TYPE_HAS_CONSTRUCTOR (t)) - { - int nonprivate_ctor = 0; - - /* If a non-template class does not define a copy - constructor, one is defined for it, enabling it to avoid - this warning. For a template class, this does not - happen, and so we would normally get a warning on: - - template class C { private: C(); }; - - To avoid this asymmetry, we check TYPE_HAS_INIT_REF. All - complete non-template or fully instantiated classes have this - flag set. */ - if (!TYPE_HAS_INIT_REF (t)) - nonprivate_ctor = 1; - else - for (fn = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (t), 0); - fn; - fn = OVL_NEXT (fn)) - { - tree ctor = OVL_CURRENT (fn); - /* Ideally, we wouldn't count copy constructors (or, in - fact, any constructor that takes an argument of the - class type as a parameter) because such things cannot - be used to construct an instance of the class unless - you already have one. But, for now at least, we're - more generous. */ - if (! TREE_PRIVATE (ctor)) - { - nonprivate_ctor = 1; - break; - } - } - - if (nonprivate_ctor == 0) - { - cp_warning ("`%#T' only defines private constructors and has no friends", - t); - return; - } - } -} - - -/* Warn about duplicate methods in fn_fields. Also compact method - lists so that lookup can be made faster. - - Data Structure: List of method lists. The outer list is a - TREE_LIST, whose TREE_PURPOSE field is the field name and the - TREE_VALUE is the DECL_CHAIN of the FUNCTION_DECLs. TREE_CHAIN - links the entire list of methods for TYPE_METHODS. Friends are - chained in the same way as member functions (? TREE_CHAIN or - DECL_CHAIN), but they live in the TREE_TYPE field of the outer - list. That allows them to be quickly deleted, and requires no - extra storage. - - If there are any constructors/destructors, they are moved to the - front of the list. This makes pushclass more efficient. - - We also link each field which has shares a name with its baseclass - to the head of the list of fields for that base class. This allows - us to reduce search time in places like `build_method_call' to - consider only reasonably likely functions. */ - -static void -finish_struct_methods (t) - tree t; -{ - tree fn_fields; - tree method_vec = CLASSTYPE_METHOD_VEC (t); - tree ctor_name = constructor_name (t); - int i, n_baseclasses = CLASSTYPE_N_BASECLASSES (t); - - /* First fill in entry 0 with the constructors, entry 1 with destructors, - and the next few with type conversion operators (if any). */ - for (fn_fields = TYPE_METHODS (t); fn_fields; - fn_fields = TREE_CHAIN (fn_fields)) - { - tree fn_name = DECL_NAME (fn_fields); - - /* Clear out this flag. - - @@ Doug may figure out how to break - @@ this with nested classes and friends. */ - DECL_IN_AGGR_P (fn_fields) = 0; - - /* Note here that a copy ctor is private, so we don't dare generate - a default copy constructor for a class that has a member - of this type without making sure they have access to it. */ - if (fn_name == ctor_name) - { - tree parmtypes = FUNCTION_ARG_CHAIN (fn_fields); - tree parmtype = parmtypes ? TREE_VALUE (parmtypes) : void_type_node; - - if (TREE_CODE (parmtype) == REFERENCE_TYPE - && TYPE_MAIN_VARIANT (TREE_TYPE (parmtype)) == t) - { - if (TREE_CHAIN (parmtypes) == NULL_TREE - || TREE_CHAIN (parmtypes) == void_list_node - || TREE_PURPOSE (TREE_CHAIN (parmtypes))) - { - if (TREE_PROTECTED (fn_fields)) - TYPE_HAS_NONPUBLIC_CTOR (t) = 1; - else if (TREE_PRIVATE (fn_fields)) - TYPE_HAS_NONPUBLIC_CTOR (t) = 2; - } - } - } - else if (fn_name == ansi_opname[(int) MODIFY_EXPR]) - { - tree parmtype = TREE_VALUE (FUNCTION_ARG_CHAIN (fn_fields)); - - if (copy_assignment_arg_p (parmtype, DECL_VIRTUAL_P (fn_fields))) - { - if (TREE_PROTECTED (fn_fields)) - TYPE_HAS_NONPUBLIC_ASSIGN_REF (t) = 1; - else if (TREE_PRIVATE (fn_fields)) - TYPE_HAS_NONPUBLIC_ASSIGN_REF (t) = 2; - } - } - } - - if (TYPE_HAS_DESTRUCTOR (t) && !TREE_VEC_ELT (method_vec, 1)) - /* We thought there was a destructor, but there wasn't. Some - parse errors cause this anomalous situation. */ - TYPE_HAS_DESTRUCTOR (t) = 0; - - /* Issue warnings about private constructors and such. If there are - no methods, then some public defaults are generated. */ - maybe_warn_about_overly_private_class (t); - - /* Now for each member function (except for constructors and - destructors), compute where member functions of the same - name reside in base classes. */ - if (n_baseclasses != 0 - && method_vec - && TREE_VEC_LENGTH (method_vec) > 2) - { - int len = TREE_VEC_LENGTH (method_vec); - tree baselink_vec = make_tree_vec (len); - int any_links = 0; - tree baselink_binfo = build_tree_list (NULL_TREE, TYPE_BINFO (t)); - - for (i = 2; i < len && TREE_VEC_ELT (method_vec, i); i++) - { - tree ovl = TREE_VEC_ELT (method_vec, i); - - TREE_VEC_ELT (baselink_vec, i) - = get_baselinks (baselink_binfo, t, - DECL_NAME (OVL_CURRENT (ovl))); - if (TREE_VEC_ELT (baselink_vec, i) != 0) - any_links = 1; - } - if (any_links != 0) - CLASSTYPE_BASELINK_VEC (t) = baselink_vec; - else - obstack_free (current_obstack, baselink_vec); - } -} - -/* Emit error when a duplicate definition of a type is seen. Patch up. */ - -void -duplicate_tag_error (t) - tree t; -{ - cp_error ("redefinition of `%#T'", t); - cp_error_at ("previous definition here", t); - - /* Pretend we haven't defined this type. */ - - /* All of the component_decl's were TREE_CHAINed together in the parser. - finish_struct_methods walks these chains and assembles all methods with - the same base name into DECL_CHAINs. Now we don't need the parser chains - anymore, so we unravel them. */ - - /* This used to be in finish_struct, but it turns out that the - TREE_CHAIN is used by dbxout_type_methods and perhaps some other - things... */ - if (CLASSTYPE_METHOD_VEC (t)) - { - tree method_vec = CLASSTYPE_METHOD_VEC (t); - int i, len = TREE_VEC_LENGTH (method_vec); - for (i = 0; i < len; i++) - { - tree unchain = TREE_VEC_ELT (method_vec, i); - while (unchain != NULL_TREE) - { - TREE_CHAIN (OVL_CURRENT (unchain)) = NULL_TREE; - unchain = OVL_NEXT (unchain); - } - } - } - - if (TYPE_LANG_SPECIFIC (t)) - { - tree as_list = CLASSTYPE_AS_LIST (t); - tree binfo = TYPE_BINFO (t); - tree binfo_as_list = CLASSTYPE_BINFO_AS_LIST (t); - int interface_only = CLASSTYPE_INTERFACE_ONLY (t); - int interface_unknown = CLASSTYPE_INTERFACE_UNKNOWN (t); - - bzero ((char *) TYPE_LANG_SPECIFIC (t), sizeof (struct lang_type)); - BINFO_BASETYPES(binfo) = NULL_TREE; - - CLASSTYPE_AS_LIST (t) = as_list; - TYPE_BINFO (t) = binfo; - CLASSTYPE_BINFO_AS_LIST (t) = binfo_as_list; - CLASSTYPE_INTERFACE_ONLY (t) = interface_only; - SET_CLASSTYPE_INTERFACE_UNKNOWN_X (t, interface_unknown); - TYPE_REDEFINED (t) = 1; - } - TYPE_SIZE (t) = NULL_TREE; - TYPE_MODE (t) = VOIDmode; - TYPE_FIELDS (t) = NULL_TREE; - TYPE_METHODS (t) = NULL_TREE; - TYPE_VFIELD (t) = NULL_TREE; - TYPE_CONTEXT (t) = NULL_TREE; -} - -/* finish up all new vtables. */ - -static void -finish_vtbls (binfo, do_self, t) - tree binfo; - int do_self; - tree t; -{ - tree binfos = BINFO_BASETYPES (binfo); - int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0; - - /* Should we use something besides CLASSTYPE_VFIELDS? */ - if (do_self && CLASSTYPE_VFIELDS (BINFO_TYPE (binfo))) - { - if (BINFO_NEW_VTABLE_MARKED (binfo)) - { - tree decl, context; - - decl = BINFO_VTABLE (binfo); - context = DECL_CONTEXT (decl); - DECL_CONTEXT (decl) = 0; - if (DECL_INITIAL (decl) != BINFO_VIRTUALS (binfo)) - DECL_INITIAL (decl) = build_nt (CONSTRUCTOR, NULL_TREE, - BINFO_VIRTUALS (binfo)); - cp_finish_decl (decl, DECL_INITIAL (decl), NULL_TREE, 0, 0); - DECL_CONTEXT (decl) = context; - } - CLEAR_BINFO_NEW_VTABLE_MARKED (binfo); - } - - for (i = 0; i < n_baselinks; i++) - { - tree base_binfo = TREE_VEC_ELT (binfos, i); - int is_not_base_vtable - = i != CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (binfo)); - if (TREE_VIA_VIRTUAL (base_binfo)) - { - base_binfo = binfo_member (BINFO_TYPE (base_binfo), CLASSTYPE_VBASECLASSES (t)); - } - finish_vtbls (base_binfo, is_not_base_vtable, t); - } -} - -/* True if we should override the given BASE_FNDECL with the given - FNDECL. */ - -static int -overrides (fndecl, base_fndecl) - tree fndecl, base_fndecl; -{ - /* Destructors have special names. */ - if (DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (base_fndecl)) - && DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (fndecl))) - return 1; - if (DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (base_fndecl)) - || DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (fndecl))) - return 0; - if (DECL_NAME (fndecl) == DECL_NAME (base_fndecl)) - { - tree types, base_types; -#if 0 - retypes = TREE_TYPE (TREE_TYPE (fndecl)); - base_retypes = TREE_TYPE (TREE_TYPE (base_fndecl)); -#endif - types = TYPE_ARG_TYPES (TREE_TYPE (fndecl)); - base_types = TYPE_ARG_TYPES (TREE_TYPE (base_fndecl)); - if ((TYPE_QUALS (TREE_TYPE (TREE_VALUE (base_types))) - == TYPE_QUALS (TREE_TYPE (TREE_VALUE (types)))) - && compparms (TREE_CHAIN (base_types), TREE_CHAIN (types))) - return 1; - } - return 0; -} - -static tree -get_class_offset_1 (parent, binfo, context, t, fndecl) - tree parent, binfo, context, t, fndecl; -{ - tree binfos = BINFO_BASETYPES (binfo); - int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0; - tree rval = NULL_TREE; - - if (binfo == parent) - return error_mark_node; - - for (i = 0; i < n_baselinks; i++) - { - tree base_binfo = TREE_VEC_ELT (binfos, i); - tree nrval; - - if (TREE_VIA_VIRTUAL (base_binfo)) - base_binfo = binfo_member (BINFO_TYPE (base_binfo), - CLASSTYPE_VBASECLASSES (t)); - nrval = get_class_offset_1 (parent, base_binfo, context, t, fndecl); - /* See if we have a new value */ - if (nrval && (nrval != error_mark_node || rval==0)) - { - /* Only compare if we have two offsets */ - if (rval && rval != error_mark_node - && ! tree_int_cst_equal (nrval, rval)) - { - /* Only give error if the two offsets are different */ - error ("every virtual function must have a unique final overrider"); - cp_error (" found two (or more) `%T' class subobjects in `%T'", context, t); - cp_error (" with virtual `%D' from virtual base class", fndecl); - return rval; - } - rval = nrval; - } - - if (rval && BINFO_TYPE (binfo) == context) - { - my_friendly_assert (rval == error_mark_node - || tree_int_cst_equal (rval, BINFO_OFFSET (binfo)), 999); - rval = BINFO_OFFSET (binfo); - } - } - return rval; -} - -/* Get the offset to the CONTEXT subobject that is related to the - given BINFO. */ - -static tree -get_class_offset (context, t, binfo, fndecl) - tree context, t, binfo, fndecl; -{ - tree first_binfo = binfo; - tree offset; - int i; - - if (context == t) - return integer_zero_node; - - if (BINFO_TYPE (binfo) == context) - return BINFO_OFFSET (binfo); - - /* Check less derived binfos first. */ - while (BINFO_BASETYPES (binfo) - && (i=CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (binfo))) != -1) - { - tree binfos = BINFO_BASETYPES (binfo); - binfo = TREE_VEC_ELT (binfos, i); - if (BINFO_TYPE (binfo) == context) - return BINFO_OFFSET (binfo); - } - - /* Ok, not found in the less derived binfos, now check the more - derived binfos. */ - offset = get_class_offset_1 (first_binfo, TYPE_BINFO (t), context, t, fndecl); - if (offset==0 || TREE_CODE (offset) != INTEGER_CST) - my_friendly_abort (999); /* we have to find it. */ - return offset; -} - -/* Skip RTTI information at the front of the virtual list. */ - -unsigned HOST_WIDE_INT -skip_rtti_stuff (virtuals) - tree *virtuals; -{ - int n; - - n = 0; - if (*virtuals) - { - /* We always reserve a slot for the offset/tdesc entry. */ - ++n; - *virtuals = TREE_CHAIN (*virtuals); - } - if (flag_vtable_thunks && *virtuals) - { - /* The second slot is reserved for the tdesc pointer when thunks - are used. */ - ++n; - *virtuals = TREE_CHAIN (*virtuals); - } - return n; -} - -static void -modify_one_vtable (binfo, t, fndecl, pfn) - tree binfo, t, fndecl, pfn; -{ - tree virtuals = BINFO_VIRTUALS (binfo); - unsigned HOST_WIDE_INT n; - - /* update rtti entry */ - if (flag_rtti) - { - if (binfo == TYPE_BINFO (t)) - { - if (! BINFO_NEW_VTABLE_MARKED (binfo)) - build_vtable (TYPE_BINFO (DECL_CONTEXT (CLASSTYPE_VFIELD (t))), t); - } - else - { - if (! BINFO_NEW_VTABLE_MARKED (binfo)) - prepare_fresh_vtable (binfo, t); - } - } - if (fndecl == NULL_TREE) - return; - - n = skip_rtti_stuff (&virtuals); - - while (virtuals) - { - tree current_fndecl = TREE_VALUE (virtuals); - current_fndecl = FNADDR_FROM_VTABLE_ENTRY (current_fndecl); - current_fndecl = TREE_OPERAND (current_fndecl, 0); - if (current_fndecl && overrides (fndecl, current_fndecl)) - { - tree base_offset, offset; - tree context = DECL_CLASS_CONTEXT (fndecl); - tree vfield = CLASSTYPE_VFIELD (t); - tree this_offset; - - offset = get_class_offset (context, t, binfo, fndecl); - - /* Find the right offset for the this pointer based on the - base class we just found. We have to take into - consideration the virtual base class pointers that we - stick in before the virtual function table pointer. - - Also, we want just the delta between the most base class - that we derived this vfield from and us. */ - base_offset = size_binop (PLUS_EXPR, - get_derived_offset (binfo, DECL_CONTEXT (current_fndecl)), - BINFO_OFFSET (binfo)); - this_offset = ssize_binop (MINUS_EXPR, offset, base_offset); - - if (binfo == TYPE_BINFO (t)) - { - /* In this case, it is *type*'s vtable we are modifying. - We start with the approximation that it's vtable is that - of the immediate base class. */ - if (! BINFO_NEW_VTABLE_MARKED (binfo)) - build_vtable (TYPE_BINFO (DECL_CONTEXT (vfield)), t); - } - else - { - /* This is our very own copy of `basetype' to play with. - Later, we will fill in all the virtual functions - that override the virtual functions in these base classes - which are not defined by the current type. */ - if (! BINFO_NEW_VTABLE_MARKED (binfo)) - prepare_fresh_vtable (binfo, t); - } - -#ifdef NOTQUITE - cp_warning ("in %D", DECL_NAME (BINFO_VTABLE (binfo))); -#endif - modify_vtable_entry (get_vtable_entry_n (BINFO_VIRTUALS (binfo), n), - build_vtable_entry (this_offset, pfn), - fndecl); - } - ++n; - virtuals = TREE_CHAIN (virtuals); - } -} - -/* These are the ones that are not through virtual base classes. */ - -static void -modify_all_direct_vtables (binfo, do_self, t, fndecl, pfn) - tree binfo; - int do_self; - tree t, fndecl, pfn; -{ - tree binfos = BINFO_BASETYPES (binfo); - int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0; - - /* Should we use something besides CLASSTYPE_VFIELDS? */ - if (do_self && CLASSTYPE_VFIELDS (BINFO_TYPE (binfo))) - { - modify_one_vtable (binfo, t, fndecl, pfn); - } - - for (i = 0; i < n_baselinks; i++) - { - tree base_binfo = TREE_VEC_ELT (binfos, i); - int is_not_base_vtable - = i != CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (binfo)); - if (! TREE_VIA_VIRTUAL (base_binfo)) - modify_all_direct_vtables (base_binfo, is_not_base_vtable, t, fndecl, pfn); - } -} - -/* Fixup all the delta entries in this one vtable that need updating. */ - -static void -fixup_vtable_deltas1 (binfo, t) - tree binfo, t; -{ - tree virtuals = BINFO_VIRTUALS (binfo); - unsigned HOST_WIDE_INT n; - - n = skip_rtti_stuff (&virtuals); - - while (virtuals) - { - tree fndecl = TREE_VALUE (virtuals); - tree pfn = FNADDR_FROM_VTABLE_ENTRY (fndecl); - tree delta = DELTA_FROM_VTABLE_ENTRY (fndecl); - fndecl = TREE_OPERAND (pfn, 0); - if (fndecl) - { - tree base_offset, offset; - tree context = DECL_CLASS_CONTEXT (fndecl); - tree vfield = CLASSTYPE_VFIELD (t); - tree this_offset; - - offset = get_class_offset (context, t, binfo, fndecl); - - /* Find the right offset for the this pointer based on the - base class we just found. We have to take into - consideration the virtual base class pointers that we - stick in before the virtual function table pointer. - - Also, we want just the delta between the most base class - that we derived this vfield from and us. */ - base_offset = size_binop (PLUS_EXPR, - get_derived_offset (binfo, - DECL_CONTEXT (fndecl)), - BINFO_OFFSET (binfo)); - this_offset = ssize_binop (MINUS_EXPR, offset, base_offset); - - if (! tree_int_cst_equal (this_offset, delta)) - { - /* Make sure we can modify the derived association with immunity. */ - if (binfo == TYPE_BINFO (t)) - { - /* In this case, it is *type*'s vtable we are modifying. - We start with the approximation that it's vtable is that - of the immediate base class. */ - if (! BINFO_NEW_VTABLE_MARKED (binfo)) - build_vtable (TYPE_BINFO (DECL_CONTEXT (vfield)), t); - } - else - { - /* This is our very own copy of `basetype' to play with. - Later, we will fill in all the virtual functions - that override the virtual functions in these base classes - which are not defined by the current type. */ - if (! BINFO_NEW_VTABLE_MARKED (binfo)) - prepare_fresh_vtable (binfo, t); - } - - modify_vtable_entry (get_vtable_entry_n (BINFO_VIRTUALS (binfo), n), - build_vtable_entry (this_offset, pfn), - fndecl); - } - } - ++n; - virtuals = TREE_CHAIN (virtuals); - } -} - -/* Fixup all the delta entries in all the direct vtables that need updating. - This happens when we have non-overridden virtual functions from a - virtual base class, that are at a different offset, in the new - hierarchy, because the layout of the virtual bases has changed. */ - -static void -fixup_vtable_deltas (binfo, init_self, t) - tree binfo; - int init_self; - tree t; -{ - tree binfos = BINFO_BASETYPES (binfo); - int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0; - - for (i = 0; i < n_baselinks; i++) - { - tree base_binfo = TREE_VEC_ELT (binfos, i); - int is_not_base_vtable - = i != CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (binfo)); - if (! TREE_VIA_VIRTUAL (base_binfo)) - fixup_vtable_deltas (base_binfo, is_not_base_vtable, t); - } - /* Should we use something besides CLASSTYPE_VFIELDS? */ - if (init_self && CLASSTYPE_VFIELDS (BINFO_TYPE (binfo))) - { - fixup_vtable_deltas1 (binfo, t); - } -} - -/* These are the ones that are through virtual base classes. */ - -static void -modify_all_indirect_vtables (binfo, do_self, via_virtual, t, fndecl, pfn) - tree binfo; - int do_self, via_virtual; - tree t, fndecl, pfn; -{ - tree binfos = BINFO_BASETYPES (binfo); - int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0; - - /* Should we use something besides CLASSTYPE_VFIELDS? */ - if (do_self && via_virtual && CLASSTYPE_VFIELDS (BINFO_TYPE (binfo))) - { - modify_one_vtable (binfo, t, fndecl, pfn); - } - - for (i = 0; i < n_baselinks; i++) - { - tree base_binfo = TREE_VEC_ELT (binfos, i); - int is_not_base_vtable - = i != CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (binfo)); - if (TREE_VIA_VIRTUAL (base_binfo)) - { - via_virtual = 1; - base_binfo = binfo_member (BINFO_TYPE (base_binfo), CLASSTYPE_VBASECLASSES (t)); - } - modify_all_indirect_vtables (base_binfo, is_not_base_vtable, via_virtual, t, fndecl, pfn); - } -} - -static void -modify_all_vtables (t, fndecl, vfn) - tree t, fndecl, vfn; -{ - /* Do these first, so that we will make use of any non-virtual class's - vtable, over a virtual classes vtable. */ - modify_all_direct_vtables (TYPE_BINFO (t), 1, t, fndecl, vfn); - if (TYPE_USES_VIRTUAL_BASECLASSES (t)) - modify_all_indirect_vtables (TYPE_BINFO (t), 1, 0, t, fndecl, vfn); -} - -/* Here, we already know that they match in every respect. - All we have to check is where they had their declarations. */ - -static int -strictly_overrides (fndecl1, fndecl2) - tree fndecl1, fndecl2; -{ - int distance = get_base_distance (DECL_CLASS_CONTEXT (fndecl2), - DECL_CLASS_CONTEXT (fndecl1), - 0, (tree *)0); - if (distance == -2 || distance > 0) - return 1; - return 0; -} - -/* Merge overrides for one vtable. - If we want to merge in same function, we are fine. - else - if one has a DECL_CLASS_CONTEXT that is a parent of the - other, than choose the more derived one - else - potentially ill-formed (see 10.3 [class.virtual]) - we have to check later to see if there was an - override in this class. If there was ok, if not - then it is ill-formed. (mrs) - - We take special care to reuse a vtable, if we can. */ - -static void -override_one_vtable (binfo, old, t) - tree binfo, old, t; -{ - tree virtuals = BINFO_VIRTUALS (binfo); - tree old_virtuals = BINFO_VIRTUALS (old); - enum { REUSE_NEW, REUSE_OLD, UNDECIDED, NEITHER } choose = UNDECIDED; - - /* If we have already committed to modifying it, then don't try and - reuse another vtable. */ - if (BINFO_NEW_VTABLE_MARKED (binfo)) - choose = NEITHER; - - skip_rtti_stuff (&virtuals); - skip_rtti_stuff (&old_virtuals); - - while (virtuals) - { - tree fndecl = TREE_VALUE (virtuals); - tree old_fndecl = TREE_VALUE (old_virtuals); - fndecl = FNADDR_FROM_VTABLE_ENTRY (fndecl); - old_fndecl = FNADDR_FROM_VTABLE_ENTRY (old_fndecl); - fndecl = TREE_OPERAND (fndecl, 0); - old_fndecl = TREE_OPERAND (old_fndecl, 0); - /* First check to see if they are the same. */ - if (DECL_ASSEMBLER_NAME (fndecl) == DECL_ASSEMBLER_NAME (old_fndecl)) - { - /* No need to do anything. */ - } - else if (strictly_overrides (fndecl, old_fndecl)) - { - if (choose == UNDECIDED) - choose = REUSE_NEW; - else if (choose == REUSE_OLD) - { - choose = NEITHER; - if (! BINFO_NEW_VTABLE_MARKED (binfo)) - { - prepare_fresh_vtable (binfo, t); - override_one_vtable (binfo, old, t); - return; - } - } - } - else if (strictly_overrides (old_fndecl, fndecl)) - { - if (choose == UNDECIDED) - choose = REUSE_OLD; - else if (choose == REUSE_NEW) - { - choose = NEITHER; - if (! BINFO_NEW_VTABLE_MARKED (binfo)) - { - prepare_fresh_vtable (binfo, t); - override_one_vtable (binfo, old, t); - return; - } - TREE_VALUE (virtuals) = TREE_VALUE (old_virtuals); - } - else if (choose == NEITHER) - { - TREE_VALUE (virtuals) = TREE_VALUE (old_virtuals); - } - } - else - { - choose = NEITHER; - if (! BINFO_NEW_VTABLE_MARKED (binfo)) - { - prepare_fresh_vtable (binfo, t); - override_one_vtable (binfo, old, t); - return; - } - { - /* This MUST be overridden, or the class is ill-formed. */ - tree fndecl = TREE_OPERAND (FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (virtuals)), 0); - tree vfn; - - fndecl = copy_node (fndecl); - copy_lang_decl (fndecl); - DECL_NEEDS_FINAL_OVERRIDER_P (fndecl) = 1; - /* Make sure we search for it later. */ - if (! CLASSTYPE_ABSTRACT_VIRTUALS (t)) - CLASSTYPE_ABSTRACT_VIRTUALS (t) = error_mark_node; - - vfn = build1 (ADDR_EXPR, vfunc_ptr_type_node, fndecl); - TREE_CONSTANT (vfn) = 1; - - /* We can use integer_zero_node, as we will core dump - if this is used anyway. */ - TREE_VALUE (virtuals) = build_vtable_entry (integer_zero_node, vfn); - } - } - virtuals = TREE_CHAIN (virtuals); - old_virtuals = TREE_CHAIN (old_virtuals); - } - - /* Let's reuse the old vtable. */ - if (choose == REUSE_OLD) - { - BINFO_VTABLE (binfo) = BINFO_VTABLE (old); - BINFO_VIRTUALS (binfo) = BINFO_VIRTUALS (old); - } -} - -/* Merge in overrides for virtual bases. - BINFO is the hierarchy we want to modify, and OLD has the potential - overrides. */ - -static void -merge_overrides (binfo, old, do_self, t) - tree binfo, old; - int do_self; - tree t; -{ - tree binfos = BINFO_BASETYPES (binfo); - tree old_binfos = BINFO_BASETYPES (old); - int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0; - - /* Should we use something besides CLASSTYPE_VFIELDS? */ - if (do_self && CLASSTYPE_VFIELDS (BINFO_TYPE (binfo))) - { - override_one_vtable (binfo, old, t); - } - - for (i = 0; i < n_baselinks; i++) - { - tree base_binfo = TREE_VEC_ELT (binfos, i); - tree old_base_binfo = TREE_VEC_ELT (old_binfos, i); - int is_not_base_vtable - = i != CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (binfo)); - if (! TREE_VIA_VIRTUAL (base_binfo)) - merge_overrides (base_binfo, old_base_binfo, is_not_base_vtable, t); - } -} - -/* Get the base virtual function declarations in T that are either - overridden or hidden by FNDECL as a list. We set TREE_PURPOSE with - the overrider/hider. */ - -static tree -get_basefndecls (fndecl, t) - tree fndecl, t; -{ - tree methods = TYPE_METHODS (t); - tree base_fndecls = NULL_TREE; - tree binfos = BINFO_BASETYPES (TYPE_BINFO (t)); - int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0; - - while (methods) - { - if (TREE_CODE (methods) == FUNCTION_DECL - && DECL_VINDEX (methods) != NULL_TREE - && DECL_NAME (fndecl) == DECL_NAME (methods)) - base_fndecls = temp_tree_cons (fndecl, methods, base_fndecls); - - methods = TREE_CHAIN (methods); - } - - if (base_fndecls) - return base_fndecls; - - for (i = 0; i < n_baseclasses; i++) - { - tree base_binfo = TREE_VEC_ELT (binfos, i); - tree basetype = BINFO_TYPE (base_binfo); - - base_fndecls = chainon (get_basefndecls (fndecl, basetype), - base_fndecls); - } - - return base_fndecls; -} - -/* Mark the functions that have been hidden with their overriders. - Since we start out with all functions already marked with a hider, - no need to mark functions that are just hidden. */ - -static void -mark_overriders (fndecl, base_fndecls) - tree fndecl, base_fndecls; -{ - while (base_fndecls) - { - if (overrides (TREE_VALUE (base_fndecls), fndecl)) - TREE_PURPOSE (base_fndecls) = fndecl; - - base_fndecls = TREE_CHAIN (base_fndecls); - } -} - -/* If this declaration supersedes the declaration of - a method declared virtual in the base class, then - mark this field as being virtual as well. */ - -static void -check_for_override (decl, ctype) - tree decl, ctype; -{ - tree binfos = BINFO_BASETYPES (TYPE_BINFO (ctype)); - int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0; - int virtualp = DECL_VIRTUAL_P (decl); - - for (i = 0; i < n_baselinks; i++) - { - tree base_binfo = TREE_VEC_ELT (binfos, i); - if (TYPE_VIRTUAL_P (BINFO_TYPE (base_binfo))) - { - tree tmp = get_matching_virtual - (base_binfo, decl, - DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (decl))); - if (tmp) - { - /* If this function overrides some virtual in some base - class, then the function itself is also necessarily - virtual, even if the user didn't explicitly say so. */ - DECL_VIRTUAL_P (decl) = 1; - - /* The TMP we really want is the one from the deepest - baseclass on this path, taking care not to - duplicate if we have already found it (via another - path to its virtual baseclass. */ - if (TREE_CODE (TREE_TYPE (decl)) == FUNCTION_TYPE) - { - cp_error_at ("method `%D' may not be declared static", - decl); - cp_error_at ("(since `%D' declared virtual in base class.)", - tmp); - break; - } - virtualp = 1; - -#if 0 /* The signature of an overriding function is not changed. */ - { - /* The argument types may have changed... */ - tree type = TREE_TYPE (decl); - tree argtypes = TYPE_ARG_TYPES (type); - tree base_variant = TREE_TYPE (TREE_VALUE (argtypes)); - tree raises = TYPE_RAISES_EXCEPTIONS (type); - - argtypes = commonparms (TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (tmp))), - TREE_CHAIN (argtypes)); - /* But the return type has not. */ - type = build_cplus_method_type (base_variant, TREE_TYPE (type), argtypes); - if (raises) - type = build_exception_variant (type, raises); - TREE_TYPE (decl) = type; - } -#endif - DECL_VINDEX (decl) - = tree_cons (NULL_TREE, tmp, DECL_VINDEX (decl)); - break; - } - } - } - if (virtualp) - { - if (DECL_VINDEX (decl) == NULL_TREE) - DECL_VINDEX (decl) = error_mark_node; - IDENTIFIER_VIRTUAL_P (DECL_NAME (decl)) = 1; - } -} - -/* Warn about hidden virtual functions that are not overridden in t. - We know that constructors and destructors don't apply. */ - -void -warn_hidden (t) - tree t; -{ - tree method_vec = CLASSTYPE_METHOD_VEC (t); - int n_methods = method_vec ? TREE_VEC_LENGTH (method_vec) : 0; - int i; - - /* We go through each separately named virtual function. */ - for (i = 2; i < n_methods && TREE_VEC_ELT (method_vec, i); ++i) - { - tree fns = TREE_VEC_ELT (method_vec, i); - tree fndecl; - - tree base_fndecls = NULL_TREE; - tree binfos = BINFO_BASETYPES (TYPE_BINFO (t)); - int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0; - - fndecl = OVL_CURRENT (fns); - if (DECL_VINDEX (fndecl) == NULL_TREE) - continue; - - /* First we get a list of all possible functions that might be - hidden from each base class. */ - for (i = 0; i < n_baseclasses; i++) - { - tree base_binfo = TREE_VEC_ELT (binfos, i); - tree basetype = BINFO_TYPE (base_binfo); - - base_fndecls = chainon (get_basefndecls (fndecl, basetype), - base_fndecls); - } - - fns = OVL_NEXT (fns); - if (fns) - fndecl = OVL_CURRENT (fns); - else - fndecl = NULL_TREE; - - /* ...then mark up all the base functions with overriders, preferring - overriders to hiders. */ - if (base_fndecls) - while (fndecl) - { - mark_overriders (fndecl, base_fndecls); - - fns = OVL_NEXT (fns); - if (fns) - fndecl = OVL_CURRENT (fns); - else - fndecl = NULL_TREE; - } - - /* Now give a warning for all base functions without overriders, - as they are hidden. */ - while (base_fndecls) - { - if (! overrides (TREE_VALUE (base_fndecls), - TREE_PURPOSE (base_fndecls))) - { - /* Here we know it is a hider, and no overrider exists. */ - cp_warning_at ("`%D' was hidden", TREE_VALUE (base_fndecls)); - cp_warning_at (" by `%D'", TREE_PURPOSE (base_fndecls)); - } - - base_fndecls = TREE_CHAIN (base_fndecls); - } - } -} - -/* Check for things that are invalid. There are probably plenty of other - things we should check for also. */ - -static void -finish_struct_anon (t) - tree t; -{ - tree field; - for (field = TYPE_FIELDS (t); field; field = TREE_CHAIN (field)) - { - if (TREE_STATIC (field)) - continue; - if (TREE_CODE (field) != FIELD_DECL) - continue; - - if (DECL_NAME (field) == NULL_TREE - && TREE_CODE (TREE_TYPE (field)) == UNION_TYPE) - { - tree* uelt = &TYPE_FIELDS (TREE_TYPE (field)); - for (; *uelt; uelt = &TREE_CHAIN (*uelt)) - { - if (DECL_ARTIFICIAL (*uelt)) - continue; - - if (DECL_NAME (*uelt) == constructor_name (t)) - cp_pedwarn_at ("ANSI C++ forbids member `%D' with same name as enclosing class", - *uelt); - - if (TREE_CODE (*uelt) != FIELD_DECL) - { - cp_pedwarn_at ("`%#D' invalid; an anonymous union can only have non-static data members", - *uelt); - continue; - } - - if (TREE_PRIVATE (*uelt)) - cp_pedwarn_at ("private member `%#D' in anonymous union", - *uelt); - else if (TREE_PROTECTED (*uelt)) - cp_pedwarn_at ("protected member `%#D' in anonymous union", - *uelt); - - TREE_PRIVATE (*uelt) = TREE_PRIVATE (field); - TREE_PROTECTED (*uelt) = TREE_PROTECTED (field); - } - } - } -} - -extern int interface_only, interface_unknown; - -/* Create default constructors, assignment operators, and so forth for - the type indicated by T, if they are needed. - CANT_HAVE_DEFAULT_CTOR, CANT_HAVE_CONST_CTOR, and - CANT_HAVE_ASSIGNMENT are nonzero if, for whatever reason, the class - cannot have a default constructor, copy constructor taking a const - reference argument, or an assignment operator, respectively. If a - virtual destructor is created, its DECL is returned; otherwise the - return value is NULL_TREE. */ - -static tree -add_implicitly_declared_members (t, cant_have_default_ctor, - cant_have_const_cctor, - cant_have_assignment) - tree t; - int cant_have_default_ctor; - int cant_have_const_cctor; - int cant_have_assignment; -{ - tree default_fn; - tree implicit_fns = NULL_TREE; - tree name = TYPE_IDENTIFIER (t); - tree virtual_dtor = NULL_TREE; - tree *f; - - /* Destructor. */ - if (TYPE_NEEDS_DESTRUCTOR (t) && !TYPE_HAS_DESTRUCTOR (t) - && !IS_SIGNATURE (t)) - { - default_fn = cons_up_default_function (t, name, 0); - check_for_override (default_fn, t); - - /* If we couldn't make it work, then pretend we didn't need it. */ - if (default_fn == void_type_node) - TYPE_NEEDS_DESTRUCTOR (t) = 0; - else - { - TREE_CHAIN (default_fn) = implicit_fns; - implicit_fns = default_fn; - - if (DECL_VINDEX (default_fn)) - virtual_dtor = default_fn; - } - } - TYPE_NEEDS_DESTRUCTOR (t) |= TYPE_HAS_DESTRUCTOR (t); - - /* Default constructor. */ - if (! TYPE_HAS_CONSTRUCTOR (t) && ! cant_have_default_ctor - && ! IS_SIGNATURE (t)) - { - default_fn = cons_up_default_function (t, name, 2); - TREE_CHAIN (default_fn) = implicit_fns; - implicit_fns = default_fn; - } - - /* Copy constructor. */ - if (! TYPE_HAS_INIT_REF (t) && ! IS_SIGNATURE (t) && ! TYPE_FOR_JAVA (t)) - { - /* ARM 12.18: You get either X(X&) or X(const X&), but - not both. --Chip */ - default_fn = cons_up_default_function (t, name, - 3 + cant_have_const_cctor); - TREE_CHAIN (default_fn) = implicit_fns; - implicit_fns = default_fn; - } - - /* Assignment operator. */ - if (! TYPE_HAS_ASSIGN_REF (t) && ! IS_SIGNATURE (t) && ! TYPE_FOR_JAVA (t)) - { - default_fn = cons_up_default_function (t, name, - 5 + cant_have_assignment); - TREE_CHAIN (default_fn) = implicit_fns; - implicit_fns = default_fn; - } - - /* Now, hook all of the new functions on to TYPE_METHODS, - and add them to the CLASSTYPE_METHOD_VEC. */ - for (f = &implicit_fns; *f; f = &TREE_CHAIN (*f)) - add_method (t, 0, *f); - *f = TYPE_METHODS (t); - TYPE_METHODS (t) = implicit_fns; - - return virtual_dtor; -} - -/* Create a RECORD_TYPE or UNION_TYPE node for a C struct or union declaration - (or C++ class declaration). - - For C++, we must handle the building of derived classes. - Also, C++ allows static class members. The way that this is - handled is to keep the field name where it is (as the DECL_NAME - of the field), and place the overloaded decl in the DECL_FIELD_BITPOS - of the field. layout_record and layout_union will know about this. - - More C++ hair: inline functions have text in their - DECL_PENDING_INLINE_INFO nodes which must somehow be parsed into - meaningful tree structure. After the struct has been laid out, set - things up so that this can happen. - - And still more: virtual functions. In the case of single inheritance, - when a new virtual function is seen which redefines a virtual function - from the base class, the new virtual function is placed into - the virtual function table at exactly the same address that - it had in the base class. When this is extended to multiple - inheritance, the same thing happens, except that multiple virtual - function tables must be maintained. The first virtual function - table is treated in exactly the same way as in the case of single - inheritance. Additional virtual function tables have different - DELTAs, which tell how to adjust `this' to point to the right thing. - - ATTRIBUTES is the set of decl attributes to be applied, if any. */ - -tree -finish_struct_1 (t, warn_anon) - tree t; - int warn_anon; -{ - int old; - enum tree_code code = TREE_CODE (t); - tree fields = TYPE_FIELDS (t); - tree x, last_x, method_vec; - int has_virtual; - int max_has_virtual; - tree pending_virtuals = NULL_TREE; - tree pending_hard_virtuals = NULL_TREE; - tree abstract_virtuals = NULL_TREE; - tree vfield; - tree vfields; - tree virtual_dtor; - int cant_have_default_ctor; - int cant_have_const_ctor; - int no_const_asn_ref; - int has_mutable = 0; - - /* The index of the first base class which has virtual - functions. Only applied to non-virtual baseclasses. */ - int first_vfn_base_index; - - int n_baseclasses; - int any_default_members = 0; - int const_sans_init = 0; - int ref_sans_init = 0; - tree access_decls = NULL_TREE; - int aggregate = 1; - int empty = 1; - int has_pointers = 0; - - if (warn_anon && code != UNION_TYPE && ANON_AGGRNAME_P (TYPE_IDENTIFIER (t))) - pedwarn ("anonymous class type not used to declare any objects"); - - if (TYPE_SIZE (t)) - { - if (IS_AGGR_TYPE (t)) - cp_error ("redefinition of `%#T'", t); - else - my_friendly_abort (172); - popclass (0); - return t; - } - - GNU_xref_decl (current_function_decl, t); - - /* If this type was previously laid out as a forward reference, - make sure we lay it out again. */ - - TYPE_SIZE (t) = NULL_TREE; - CLASSTYPE_GOT_SEMICOLON (t) = 0; - -#if 0 - /* This is in general too late to do this. I moved the main case up to - left_curly, what else needs to move? */ - if (! IS_SIGNATURE (t)) - { - my_friendly_assert (CLASSTYPE_INTERFACE_ONLY (t) == interface_only, 999); - my_friendly_assert (CLASSTYPE_INTERFACE_KNOWN (t) == ! interface_unknown, 999); - } -#endif - - old = suspend_momentary (); - - /* Install struct as DECL_FIELD_CONTEXT of each field decl. - Also process specified field sizes. - Set DECL_FIELD_SIZE to the specified size, or 0 if none specified. - The specified size is found in the DECL_INITIAL. - Store 0 there, except for ": 0" fields (so we can find them - and delete them, below). */ - - if (TYPE_BINFO_BASETYPES (t)) - n_baseclasses = TREE_VEC_LENGTH (TYPE_BINFO_BASETYPES (t)); - else - n_baseclasses = 0; - - if (n_baseclasses > 0) - { - struct base_info base_info; - - first_vfn_base_index = finish_base_struct (t, &base_info); - /* Remember where we got our vfield from. */ - CLASSTYPE_VFIELD_PARENT (t) = first_vfn_base_index; - has_virtual = base_info.has_virtual; - max_has_virtual = base_info.max_has_virtual; - CLASSTYPE_N_SUPERCLASSES (t) += base_info.n_ancestors; - vfield = base_info.vfield; - vfields = base_info.vfields; - CLASSTYPE_RTTI (t) = base_info.rtti; - cant_have_default_ctor = base_info.cant_have_default_ctor; - cant_have_const_ctor = base_info.cant_have_const_ctor; - no_const_asn_ref = base_info.no_const_asn_ref; - aggregate = 0; - } - else - { - first_vfn_base_index = -1; - has_virtual = 0; - max_has_virtual = has_virtual; - vfield = NULL_TREE; - vfields = NULL_TREE; - CLASSTYPE_RTTI (t) = NULL_TREE; - cant_have_default_ctor = 0; - cant_have_const_ctor = 0; - no_const_asn_ref = 0; - } - -#if 0 - /* Both of these should be done before now. */ - if (write_virtuals == 3 && CLASSTYPE_INTERFACE_KNOWN (t) - && ! IS_SIGNATURE (t)) - { - my_friendly_assert (CLASSTYPE_INTERFACE_ONLY (t) == interface_only, 999); - my_friendly_assert (CLASSTYPE_VTABLE_NEEDS_WRITING (t) == ! interface_only, 999); - } -#endif - - /* The three of these are approximations which may later be - modified. Needed at this point to make add_virtual_function - and modify_vtable_entries work. */ - CLASSTYPE_VFIELDS (t) = vfields; - CLASSTYPE_VFIELD (t) = vfield; - - for (x = TYPE_METHODS (t); x; x = TREE_CHAIN (x)) - { - GNU_xref_member (current_class_name, x); - - /* If this was an evil function, don't keep it in class. */ - if (IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (x))) - continue; - - /* Do both of these, even though they're in the same union; - if the insn `r' member and the size `i' member are - different sizes, as on the alpha, the larger of the two - will end up with garbage in it. */ - DECL_SAVED_INSNS (x) = NULL_RTX; - DECL_FIELD_SIZE (x) = 0; - - check_for_override (x, t); - if (DECL_ABSTRACT_VIRTUAL_P (x) && ! DECL_VINDEX (x)) - cp_error_at ("initializer specified for non-virtual method `%D'", x); - - /* The name of the field is the original field name - Save this in auxiliary field for later overloading. */ - if (DECL_VINDEX (x)) - { - add_virtual_function (&pending_virtuals, &pending_hard_virtuals, - &has_virtual, x, t); - if (DECL_ABSTRACT_VIRTUAL_P (x)) - abstract_virtuals = tree_cons (NULL_TREE, x, abstract_virtuals); -#if 0 - /* XXX Why did I comment this out? (jason) */ - else - TREE_USED (x) = 1; -#endif - } - } - - if (n_baseclasses) - fields = chainon (build_vbase_pointer_fields (t), fields); - - last_x = NULL_TREE; - for (x = fields; x; x = TREE_CHAIN (x)) - { - GNU_xref_member (current_class_name, x); - - if (TREE_CODE (x) == FIELD_DECL) - { - DECL_PACKED (x) |= TYPE_PACKED (t); - - if (DECL_C_BIT_FIELD (x) && integer_zerop (DECL_INITIAL (x))) - /* A zero-width bitfield doesn't do the trick. */; - else - empty = 0; - } - - if (TREE_CODE (x) == USING_DECL) - { - /* Save access declarations for later. */ - if (last_x) - TREE_CHAIN (last_x) = TREE_CHAIN (x); - else - fields = TREE_CHAIN (x); - - access_decls = scratch_tree_cons (NULL_TREE, x, access_decls); - continue; - } - - last_x = x; - - if (TREE_CODE (x) == TYPE_DECL - || TREE_CODE (x) == TEMPLATE_DECL) - continue; - - /* If we've gotten this far, it's a data member, possibly static, - or an enumerator. */ - - DECL_FIELD_CONTEXT (x) = t; - - /* ``A local class cannot have static data members.'' ARM 9.4 */ - if (current_function_decl && TREE_STATIC (x)) - cp_error_at ("field `%D' in local class cannot be static", x); - - /* Perform error checking that did not get done in - grokdeclarator. */ - if (TREE_CODE (TREE_TYPE (x)) == FUNCTION_TYPE) - { - cp_error_at ("field `%D' invalidly declared function type", - x); - TREE_TYPE (x) = build_pointer_type (TREE_TYPE (x)); - } - else if (TREE_CODE (TREE_TYPE (x)) == METHOD_TYPE) - { - cp_error_at ("field `%D' invalidly declared method type", x); - TREE_TYPE (x) = build_pointer_type (TREE_TYPE (x)); - } - else if (TREE_CODE (TREE_TYPE (x)) == OFFSET_TYPE) - { - cp_error_at ("field `%D' invalidly declared offset type", x); - TREE_TYPE (x) = build_pointer_type (TREE_TYPE (x)); - } - -#if 0 - if (DECL_NAME (x) == constructor_name (t)) - cant_have_default_ctor = 1; -#endif - - if (TREE_TYPE (x) == error_mark_node) - continue; - - DECL_SAVED_INSNS (x) = NULL_RTX; - DECL_FIELD_SIZE (x) = 0; - - /* When this goes into scope, it will be a non-local reference. */ - DECL_NONLOCAL (x) = 1; - - if (TREE_CODE (x) == CONST_DECL) - continue; - - if (TREE_CODE (x) == VAR_DECL) - { - if (TREE_CODE (t) == UNION_TYPE) - /* Unions cannot have static members. */ - cp_error_at ("field `%D' declared static in union", x); - - continue; - } - - /* Now it can only be a FIELD_DECL. */ - - if (TREE_PRIVATE (x) || TREE_PROTECTED (x)) - aggregate = 0; - - /* If this is of reference type, check if it needs an init. - Also do a little ANSI jig if necessary. */ - if (TREE_CODE (TREE_TYPE (x)) == REFERENCE_TYPE) - { - if (DECL_INITIAL (x) == NULL_TREE) - ref_sans_init = 1; - - /* ARM $12.6.2: [A member initializer list] (or, for an - aggregate, initialization by a brace-enclosed list) is the - only way to initialize nonstatic const and reference - members. */ - cant_have_default_ctor = 1; - TYPE_HAS_COMPLEX_ASSIGN_REF (t) = 1; - - if (! TYPE_HAS_CONSTRUCTOR (t) && extra_warnings) - { - if (DECL_NAME (x)) - cp_warning_at ("non-static reference `%#D' in class without a constructor", x); - else - cp_warning_at ("non-static reference in class without a constructor", x); - } - } - - if (TREE_CODE (TREE_TYPE (x)) == POINTER_TYPE) - has_pointers = 1; - - if (DECL_MUTABLE_P (x) || TYPE_HAS_MUTABLE_P (TREE_TYPE (x))) - has_mutable = 1; - - /* If any field is const, the structure type is pseudo-const. */ - if (TREE_READONLY (x)) - { - C_TYPE_FIELDS_READONLY (t) = 1; - if (DECL_INITIAL (x) == NULL_TREE) - const_sans_init = 1; - - /* ARM $12.6.2: [A member initializer list] (or, for an - aggregate, initialization by a brace-enclosed list) is the - only way to initialize nonstatic const and reference - members. */ - cant_have_default_ctor = 1; - TYPE_HAS_COMPLEX_ASSIGN_REF (t) = 1; - - if (! TYPE_HAS_CONSTRUCTOR (t) && !IS_SIGNATURE (t) - && extra_warnings) - { - if (DECL_NAME (x)) - cp_warning_at ("non-static const member `%#D' in class without a constructor", x); - else - cp_warning_at ("non-static const member in class without a constructor", x); - } - } - else - { - /* A field that is pseudo-const makes the structure - likewise. */ - tree t1 = TREE_TYPE (x); - while (TREE_CODE (t1) == ARRAY_TYPE) - t1 = TREE_TYPE (t1); - if (IS_AGGR_TYPE (t1)) - { - if (C_TYPE_FIELDS_READONLY (t1)) - C_TYPE_FIELDS_READONLY (t) = 1; - if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (t1)) - const_sans_init = 1; - } - } - - /* We set DECL_C_BIT_FIELD in grokbitfield. - If the type and width are valid, we'll also set DECL_BIT_FIELD. */ - if (DECL_C_BIT_FIELD (x)) - { - /* Invalid bit-field size done by grokfield. */ - /* Detect invalid bit-field type. */ - if (DECL_INITIAL (x) - && ! INTEGRAL_TYPE_P (TREE_TYPE (x))) - { - cp_error_at ("bit-field `%#D' with non-integral type", x); - DECL_INITIAL (x) = NULL; - } - - /* Detect and ignore out of range field width. */ - if (DECL_INITIAL (x)) - { - tree w = DECL_INITIAL (x); - register int width = 0; - - /* Avoid the non_lvalue wrapper added by fold for PLUS_EXPRs. */ - STRIP_NOPS (w); - - /* detect invalid field size. */ - if (TREE_CODE (w) == CONST_DECL) - w = DECL_INITIAL (w); - else if (TREE_READONLY_DECL_P (w)) - w = decl_constant_value (w); - - if (TREE_CODE (w) != INTEGER_CST) - { - cp_error_at ("bit-field `%D' width not an integer constant", - x); - DECL_INITIAL (x) = NULL_TREE; - } - else if (width = TREE_INT_CST_LOW (w), - width < 0) - { - DECL_INITIAL (x) = NULL; - cp_error_at ("negative width in bit-field `%D'", x); - } - else if (width == 0 && DECL_NAME (x) != 0) - { - DECL_INITIAL (x) = NULL; - cp_error_at ("zero width for bit-field `%D'", x); - } - else if (width - > TYPE_PRECISION (long_long_unsigned_type_node)) - { - /* The backend will dump if you try to use something - too big; avoid that. */ - DECL_INITIAL (x) = NULL; - sorry ("bit-fields larger than %d bits", - TYPE_PRECISION (long_long_unsigned_type_node)); - cp_error_at (" in declaration of `%D'", x); - } - else if (width > TYPE_PRECISION (TREE_TYPE (x)) - && TREE_CODE (TREE_TYPE (x)) != ENUMERAL_TYPE - && TREE_CODE (TREE_TYPE (x)) != BOOLEAN_TYPE) - { - cp_warning_at ("width of `%D' exceeds its type", x); - } - else if (TREE_CODE (TREE_TYPE (x)) == ENUMERAL_TYPE - && ((min_precision (TYPE_MIN_VALUE (TREE_TYPE (x)), - TREE_UNSIGNED (TREE_TYPE (x))) > width) - || (min_precision (TYPE_MAX_VALUE (TREE_TYPE (x)), - TREE_UNSIGNED (TREE_TYPE (x))) > width))) - { - cp_warning_at ("`%D' is too small to hold all values of `%#T'", - x, TREE_TYPE (x)); - } - - if (DECL_INITIAL (x)) - { - DECL_INITIAL (x) = NULL_TREE; - DECL_FIELD_SIZE (x) = width; - DECL_BIT_FIELD (x) = 1; - - if (width == 0) - { -#ifdef EMPTY_FIELD_BOUNDARY - DECL_ALIGN (x) = MAX (DECL_ALIGN (x), - EMPTY_FIELD_BOUNDARY); -#endif -#ifdef PCC_BITFIELD_TYPE_MATTERS - if (PCC_BITFIELD_TYPE_MATTERS) - DECL_ALIGN (x) = MAX (DECL_ALIGN (x), - TYPE_ALIGN (TREE_TYPE (x))); -#endif - } - } - } - else - /* Non-bit-fields are aligned for their type. */ - DECL_ALIGN (x) = MAX (DECL_ALIGN (x), TYPE_ALIGN (TREE_TYPE (x))); - } - else - { - tree type = TREE_TYPE (x); - - while (TREE_CODE (type) == ARRAY_TYPE) - type = TREE_TYPE (type); - - if (TYPE_LANG_SPECIFIC (type) && ! ANON_UNION_P (x) - && ! TYPE_PTRMEMFUNC_P (type)) - { - /* Never let anything with uninheritable virtuals - make it through without complaint. */ - if (CLASSTYPE_ABSTRACT_VIRTUALS (type)) - abstract_virtuals_error (x, type); - - /* Don't let signatures make it through either. */ - if (IS_SIGNATURE (type)) - signature_error (x, type); - - if (code == UNION_TYPE) - { - char *fie = NULL; - if (TYPE_NEEDS_CONSTRUCTING (type)) - fie = "constructor"; - else if (TYPE_NEEDS_DESTRUCTOR (type)) - fie = "destructor"; - else if (TYPE_HAS_COMPLEX_ASSIGN_REF (type)) - fie = "copy assignment operator"; - if (fie) - cp_error_at ("member `%#D' with %s not allowed in union", x, - fie); - } - else - { - TYPE_NEEDS_CONSTRUCTING (t) |= TYPE_NEEDS_CONSTRUCTING (type); - TYPE_NEEDS_DESTRUCTOR (t) |= TYPE_NEEDS_DESTRUCTOR (type); - TYPE_HAS_COMPLEX_ASSIGN_REF (t) |= TYPE_HAS_COMPLEX_ASSIGN_REF (type); - TYPE_HAS_COMPLEX_INIT_REF (t) |= TYPE_HAS_COMPLEX_INIT_REF (type); - } - - if (!TYPE_HAS_CONST_INIT_REF (type)) - cant_have_const_ctor = 1; - - if (!TYPE_HAS_CONST_ASSIGN_REF (type)) - no_const_asn_ref = 1; - - if (TYPE_HAS_CONSTRUCTOR (type) - && ! TYPE_HAS_DEFAULT_CONSTRUCTOR (type)) - { - cant_have_default_ctor = 1; -#if 0 - /* This is wrong for aggregates. */ - if (! TYPE_HAS_CONSTRUCTOR (t)) - { - if (DECL_NAME (x)) - cp_pedwarn_at ("member `%#D' with only non-default constructor", x); - else - cp_pedwarn_at ("member with only non-default constructor", x); - cp_pedwarn_at ("in class without a constructor", - x); - } -#endif - } - } - if (DECL_INITIAL (x) != NULL_TREE) - { - /* `build_class_init_list' does not recognize - non-FIELD_DECLs. */ - if (code == UNION_TYPE && any_default_members != 0) - cp_error_at ("multiple fields in union `%T' initialized"); - any_default_members = 1; - } - } - } - - /* If this type has any constant members which did not come - with their own initialization, mark that fact here. It is - not an error here, since such types can be saved either by their - constructors, or by fortuitous initialization. */ - CLASSTYPE_READONLY_FIELDS_NEED_INIT (t) = const_sans_init; - CLASSTYPE_REF_FIELDS_NEED_INIT (t) = ref_sans_init; - CLASSTYPE_ABSTRACT_VIRTUALS (t) = abstract_virtuals; - CLASSTYPE_HAS_MUTABLE (t) = has_mutable; - - /* Effective C++ rule 11. */ - if (has_pointers && warn_ecpp && TYPE_HAS_CONSTRUCTOR (t) - && ! (TYPE_HAS_INIT_REF (t) && TYPE_HAS_ASSIGN_REF (t))) - { - cp_warning ("`%#T' has pointer data members", t); - - if (! TYPE_HAS_INIT_REF (t)) - { - cp_warning (" but does not override `%T(const %T&)'", t, t); - if (! TYPE_HAS_ASSIGN_REF (t)) - cp_warning (" or `operator=(const %T&)'", t); - } - else if (! TYPE_HAS_ASSIGN_REF (t)) - cp_warning (" but does not override `operator=(const %T&)'", t); - } - - /* Do some bookkeeping that will guide the generation of implicitly - declared member functions. */ - TYPE_HAS_COMPLEX_INIT_REF (t) - |= (TYPE_HAS_INIT_REF (t) || TYPE_USES_VIRTUAL_BASECLASSES (t) - || has_virtual || any_default_members); - TYPE_NEEDS_CONSTRUCTING (t) - |= (TYPE_HAS_CONSTRUCTOR (t) || TYPE_USES_VIRTUAL_BASECLASSES (t) - || has_virtual || any_default_members); - if (! IS_SIGNATURE (t)) - CLASSTYPE_NON_AGGREGATE (t) - = ! aggregate || has_virtual || TYPE_HAS_CONSTRUCTOR (t); - TYPE_HAS_REAL_ASSIGNMENT (t) |= TYPE_HAS_ASSIGNMENT (t); - TYPE_HAS_REAL_ASSIGN_REF (t) |= TYPE_HAS_ASSIGN_REF (t); - TYPE_HAS_COMPLEX_ASSIGN_REF (t) - |= TYPE_HAS_ASSIGN_REF (t) || TYPE_USES_VIRTUAL_BASECLASSES (t); - - /* Synthesize any needed methods. Note that methods will be synthesized - for anonymous unions; grok_x_components undoes that. */ - virtual_dtor - = add_implicitly_declared_members (t, cant_have_default_ctor, - cant_have_const_ctor, - no_const_asn_ref); - if (virtual_dtor) - add_virtual_function (&pending_virtuals, &pending_hard_virtuals, - &has_virtual, virtual_dtor, t); - - if (TYPE_METHODS (t)) - { - finish_struct_methods (t); - method_vec = CLASSTYPE_METHOD_VEC (t); - } - else - { - method_vec = 0; - - /* Just in case these got accidentally - filled in by syntax errors. */ - TYPE_HAS_CONSTRUCTOR (t) = 0; - TYPE_HAS_DESTRUCTOR (t) = 0; - } - - for (access_decls = nreverse (access_decls); access_decls; - access_decls = TREE_CHAIN (access_decls)) - handle_using_decl (TREE_VALUE (access_decls), t, method_vec, fields); - - if (vfield == NULL_TREE && has_virtual) - { - /* We build this decl with vtbl_ptr_type_node, which is a - `vtable_entry_type*'. It might seem more precise to use - `vtable_entry_type (*)[N]' where N is the number of firtual - functions. However, that would require the vtable pointer in - base classes to have a different type than the vtable pointer - in derived classes. We could make that happen, but that - still wouldn't solve all the problems. In particular, the - type-based alias analysis code would decide that assignments - to the base class vtable pointer can't alias assignments to - the derived class vtable pointer, since they have different - types. Thus, in an derived class destructor, where the base - class constructor was inlined, we could generate bad code for - setting up the vtable pointer. - - Therefore, we use one type for all vtable pointers. We still - use a type-correct type; it's just doesn't indicate the array - bounds. That's better than using `void*' or some such; it's - cleaner, and it let's the alias analysis code know that these - stores cannot alias stores to void*! */ - vfield = build_lang_field_decl (FIELD_DECL, get_vfield_name (t), - vtbl_ptr_type_node); - /* If you change any of the below, take a look at all the - other VFIELD_BASEs and VTABLE_BASEs in the code, and change - them too. */ - DECL_ASSEMBLER_NAME (vfield) = get_identifier (VFIELD_BASE); - CLASSTYPE_VFIELD (t) = vfield; - DECL_VIRTUAL_P (vfield) = 1; - DECL_ARTIFICIAL (vfield) = 1; - DECL_FIELD_CONTEXT (vfield) = t; - DECL_CLASS_CONTEXT (vfield) = t; - DECL_FCONTEXT (vfield) = t; - DECL_SAVED_INSNS (vfield) = NULL_RTX; - DECL_FIELD_SIZE (vfield) = 0; - DECL_ALIGN (vfield) = TYPE_ALIGN (ptr_type_node); -#if 0 - /* This is more efficient, but breaks binary compatibility, turn - it on sometime when we don't care. If we turn it on, we also - have to enable the code in dfs_init_vbase_pointers. */ - /* vfield is always first entry in structure. */ - TREE_CHAIN (vfield) = fields; - fields = vfield; -#else - if (last_x) - { - my_friendly_assert (TREE_CHAIN (last_x) == NULL_TREE, 175); - TREE_CHAIN (last_x) = vfield; - last_x = vfield; - } - else - fields = vfield; -#endif - empty = 0; - vfields = chainon (vfields, CLASSTYPE_AS_LIST (t)); - } - - /* Now DECL_INITIAL is null on all members except for zero-width bit-fields. - - C++: maybe we will support default field initialization some day... */ - - /* Delete all duplicate fields from the fields */ - delete_duplicate_fields (fields); - - /* Catch function/field name conflict. We don't need to do this for a - signature, since it can only contain the fields constructed in - append_signature_fields. */ - if (! IS_SIGNATURE (t)) - { - int n_methods = method_vec ? TREE_VEC_LENGTH (method_vec) : 0; - for (x = fields; x; x = TREE_CHAIN (x)) - { - tree name = DECL_NAME (x); - int i; - - if (TREE_CODE (x) == TYPE_DECL && DECL_ARTIFICIAL (x)) - continue; - - for (i = 2; i < n_methods && TREE_VEC_ELT (method_vec, i); ++i) - if (DECL_NAME (OVL_CURRENT (TREE_VEC_ELT (method_vec, i))) - == name) - { - cp_error_at ("data member `%#D' conflicts with", x); - cp_error_at ("function member `%#D'", - OVL_CURRENT (TREE_VEC_ELT (method_vec, i))); - break; - } - } - } - - /* Now we have the nearly final fieldlist for the data fields. Record it, - then lay out the structure or union (including the fields). */ - - TYPE_FIELDS (t) = fields; - - if (n_baseclasses) - { - last_x = build_base_fields (t); - - /* If all our bases are empty, we can be empty too. */ - for (x = last_x; empty && x; x = TREE_CHAIN (x)) - if (DECL_SIZE (x) != integer_zero_node) - empty = 0; - } - if (empty) - { - /* C++: do not let empty structures exist. */ - tree decl = build_lang_field_decl - (FIELD_DECL, NULL_TREE, char_type_node); - TREE_CHAIN (decl) = fields; - TYPE_FIELDS (t) = decl; - } - if (n_baseclasses) - TYPE_FIELDS (t) = chainon (last_x, TYPE_FIELDS (t)); - - layout_type (t); - - /* Remember the size and alignment of the class before adding - the virtual bases. */ - if (empty && flag_new_abi) - CLASSTYPE_SIZE (t) = integer_zero_node; - else if (flag_new_abi && TYPE_HAS_COMPLEX_INIT_REF (t) - && TYPE_HAS_COMPLEX_ASSIGN_REF (t)) - CLASSTYPE_SIZE (t) = TYPE_BINFO_SIZE (t); - else - CLASSTYPE_SIZE (t) = TYPE_SIZE (t); - CLASSTYPE_ALIGN (t) = TYPE_ALIGN (t); - - finish_struct_anon (t); - - /* Set the TYPE_DECL for this type to contain the right - value for DECL_OFFSET, so that we can use it as part - of a COMPONENT_REF for multiple inheritance. */ - - layout_decl (TYPE_MAIN_DECL (t), 0); - - /* Now fix up any virtual base class types that we left lying - around. We must get these done before we try to lay out the - virtual function table. */ - pending_hard_virtuals = nreverse (pending_hard_virtuals); - - if (n_baseclasses) - /* layout_basetypes will remove the base subobject fields. */ - max_has_virtual = layout_basetypes (t, max_has_virtual); - else if (empty) - TYPE_FIELDS (t) = fields; - - my_friendly_assert (TYPE_FIELDS (t) == fields, 981117); - - /* Delete all zero-width bit-fields from the front of the fieldlist */ - while (fields && DECL_C_BIT_FIELD (fields) - && DECL_INITIAL (fields)) - fields = TREE_CHAIN (fields); - /* Delete all such fields from the rest of the fields. */ - for (x = fields; x;) - { - if (TREE_CHAIN (x) && DECL_C_BIT_FIELD (TREE_CHAIN (x)) - && DECL_INITIAL (TREE_CHAIN (x))) - TREE_CHAIN (x) = TREE_CHAIN (TREE_CHAIN (x)); - else - x = TREE_CHAIN (x); - } - TYPE_FIELDS (t) = fields; - - if (TYPE_USES_VIRTUAL_BASECLASSES (t)) - { - tree vbases; - - vbases = CLASSTYPE_VBASECLASSES (t); - CLASSTYPE_N_VBASECLASSES (t) = list_length (vbases); - - { - /* Now fixup overrides of all functions in vtables from all - direct or indirect virtual base classes. */ - tree binfos = BINFO_BASETYPES (TYPE_BINFO (t)); - int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0; - - for (i = 0; i < n_baseclasses; i++) - { - tree base_binfo = TREE_VEC_ELT (binfos, i); - tree basetype = BINFO_TYPE (base_binfo); - tree vbases; - - vbases = CLASSTYPE_VBASECLASSES (basetype); - while (vbases) - { - merge_overrides (binfo_member (BINFO_TYPE (vbases), - CLASSTYPE_VBASECLASSES (t)), - vbases, 1, t); - vbases = TREE_CHAIN (vbases); - } - } - } - } - - /* Set up the DECL_FIELD_BITPOS of the vfield if we need to, as we - might need to know it for setting up the offsets in the vtable - (or in thunks) below. */ - if (vfield != NULL_TREE - && DECL_FIELD_CONTEXT (vfield) != t) - { - tree binfo = get_binfo (DECL_FIELD_CONTEXT (vfield), t, 0); - tree offset = BINFO_OFFSET (binfo); - - vfield = copy_node (vfield); - copy_lang_decl (vfield); - - if (! integer_zerop (offset)) - offset = size_binop (MULT_EXPR, offset, size_int (BITS_PER_UNIT)); - DECL_FIELD_CONTEXT (vfield) = t; - DECL_CLASS_CONTEXT (vfield) = t; - DECL_FIELD_BITPOS (vfield) - = size_binop (PLUS_EXPR, offset, DECL_FIELD_BITPOS (vfield)); - CLASSTYPE_VFIELD (t) = vfield; - } - -#ifdef NOTQUITE - cp_warning ("Doing hard virtuals for %T...", t); -#endif - - if (has_virtual > max_has_virtual) - max_has_virtual = has_virtual; - if (max_has_virtual > 0) - TYPE_VIRTUAL_P (t) = 1; - - if (flag_rtti && TYPE_VIRTUAL_P (t) && !pending_hard_virtuals) - modify_all_vtables (t, NULL_TREE, NULL_TREE); - - while (pending_hard_virtuals) - { - modify_all_vtables (t, - TREE_PURPOSE (pending_hard_virtuals), - TREE_VALUE (pending_hard_virtuals)); - pending_hard_virtuals = TREE_CHAIN (pending_hard_virtuals); - } - - if (TYPE_USES_VIRTUAL_BASECLASSES (t)) - { - tree vbases; - /* Now fixup any virtual function entries from virtual bases - that have different deltas. This has to come after we do the - pending hard virtuals, as we might have a function that comes - from multiple virtual base instances that is only overridden - by a hard virtual above. */ - vbases = CLASSTYPE_VBASECLASSES (t); - while (vbases) - { - /* We might be able to shorten the amount of work we do by - only doing this for vtables that come from virtual bases - that have differing offsets, but don't want to miss any - entries. */ - fixup_vtable_deltas (vbases, 1, t); - vbases = TREE_CHAIN (vbases); - } - } - - /* Under our model of GC, every C++ class gets its own virtual - function table, at least virtually. */ - if (pending_virtuals) - { - pending_virtuals = nreverse (pending_virtuals); - /* We must enter these virtuals into the table. */ - if (first_vfn_base_index < 0) - { - /* The second slot is for the tdesc pointer when thunks are used. */ - if (flag_vtable_thunks) - pending_virtuals = tree_cons (NULL_TREE, NULL_TREE, pending_virtuals); - - /* The first slot is for the rtti offset. */ - pending_virtuals = tree_cons (NULL_TREE, NULL_TREE, pending_virtuals); - - set_rtti_entry (pending_virtuals, - convert (ssizetype, integer_zero_node), t); - build_vtable (NULL_TREE, t); - } - else - { - /* Here we know enough to change the type of our virtual - function table, but we will wait until later this function. */ - - if (! BINFO_NEW_VTABLE_MARKED (TYPE_BINFO (t))) - build_vtable (TREE_VEC_ELT (TYPE_BINFO_BASETYPES (t), first_vfn_base_index), t); - } - - /* If this type has basetypes with constructors, then those - constructors might clobber the virtual function table. But - they don't if the derived class shares the exact vtable of the base - class. */ - - CLASSTYPE_NEEDS_VIRTUAL_REINIT (t) = 1; - } - else if (first_vfn_base_index >= 0) - { - tree binfo = TREE_VEC_ELT (TYPE_BINFO_BASETYPES (t), first_vfn_base_index); - /* This class contributes nothing new to the virtual function - table. However, it may have declared functions which - went into the virtual function table "inherited" from the - base class. If so, we grab a copy of those updated functions, - and pretend they are ours. */ - - /* See if we should steal the virtual info from base class. */ - if (TYPE_BINFO_VTABLE (t) == NULL_TREE) - TYPE_BINFO_VTABLE (t) = BINFO_VTABLE (binfo); - if (TYPE_BINFO_VIRTUALS (t) == NULL_TREE) - TYPE_BINFO_VIRTUALS (t) = BINFO_VIRTUALS (binfo); - if (TYPE_BINFO_VTABLE (t) != BINFO_VTABLE (binfo)) - CLASSTYPE_NEEDS_VIRTUAL_REINIT (t) = 1; - } - - if (max_has_virtual || first_vfn_base_index >= 0) - { - CLASSTYPE_VSIZE (t) = has_virtual; - if (first_vfn_base_index >= 0) - { - if (pending_virtuals) - TYPE_BINFO_VIRTUALS (t) = chainon (TYPE_BINFO_VIRTUALS (t), - pending_virtuals); - } - else if (has_virtual) - { - TYPE_BINFO_VIRTUALS (t) = pending_virtuals; - DECL_VIRTUAL_P (TYPE_BINFO_VTABLE (t)) = 1; - } - } - - /* Now lay out the virtual function table. */ - if (has_virtual) - { - /* Use size_int so values are memoized in common cases. */ - tree itype = build_index_type (size_int (has_virtual)); - tree atype = build_cplus_array_type (vtable_entry_type, itype); - - layout_type (atype); - - CLASSTYPE_VFIELD (t) = vfield; - - /* We may have to grow the vtable. */ - if (TREE_TYPE (TYPE_BINFO_VTABLE (t)) != atype) - { - TREE_TYPE (TYPE_BINFO_VTABLE (t)) = atype; - DECL_SIZE (TYPE_BINFO_VTABLE (t)) = 0; - layout_decl (TYPE_BINFO_VTABLE (t), 0); - /* At one time the vtable info was grabbed 2 words at a time. This - fails on sparc unless you have 8-byte alignment. (tiemann) */ - DECL_ALIGN (TYPE_BINFO_VTABLE (t)) - = MAX (TYPE_ALIGN (double_type_node), - DECL_ALIGN (TYPE_BINFO_VTABLE (t))); - } - } - else if (first_vfn_base_index >= 0) - CLASSTYPE_VFIELD (t) = vfield; - CLASSTYPE_VFIELDS (t) = vfields; - - finish_struct_bits (t, max_has_virtual); - - /* Complete the rtl for any static member objects of the type we're - working on. */ - for (x = fields; x; x = TREE_CHAIN (x)) - { - if (TREE_CODE (x) == VAR_DECL && TREE_STATIC (x) - && TREE_TYPE (x) == t) - { - DECL_MODE (x) = TYPE_MODE (t); - make_decl_rtl (x, NULL, 0); - } - } - - if (TYPE_HAS_CONSTRUCTOR (t)) - { - tree vfields = CLASSTYPE_VFIELDS (t); - - while (vfields) - { - /* Mark the fact that constructor for T - could affect anybody inheriting from T - who wants to initialize vtables for VFIELDS's type. */ - if (VF_DERIVED_VALUE (vfields)) - TREE_ADDRESSABLE (vfields) = 1; - vfields = TREE_CHAIN (vfields); - } - if (any_default_members != 0) - build_class_init_list (t); - } - else if (TYPE_NEEDS_CONSTRUCTING (t)) - build_class_init_list (t); - - /* Write out inline function definitions. */ - do_inline_function_hair (t, CLASSTYPE_INLINE_FRIENDS (t)); - CLASSTYPE_INLINE_FRIENDS (t) = 0; - - if (CLASSTYPE_VSIZE (t) != 0) - { -#if 0 - /* This is now done above. */ - if (DECL_FIELD_CONTEXT (vfield) != t) - { - tree binfo = get_binfo (DECL_FIELD_CONTEXT (vfield), t, 0); - tree offset = BINFO_OFFSET (binfo); - - vfield = copy_node (vfield); - copy_lang_decl (vfield); - - if (! integer_zerop (offset)) - offset = size_binop (MULT_EXPR, offset, size_int (BITS_PER_UNIT)); - DECL_FIELD_CONTEXT (vfield) = t; - DECL_CLASS_CONTEXT (vfield) = t; - DECL_FIELD_BITPOS (vfield) - = size_binop (PLUS_EXPR, offset, DECL_FIELD_BITPOS (vfield)); - CLASSTYPE_VFIELD (t) = vfield; - } -#endif - - /* In addition to this one, all the other vfields should be listed. */ - /* Before that can be done, we have to have FIELD_DECLs for them, and - a place to find them. */ - TYPE_NONCOPIED_PARTS (t) = build_tree_list (default_conversion (TYPE_BINFO_VTABLE (t)), vfield); - - if (warn_nonvdtor && TYPE_HAS_DESTRUCTOR (t) - && DECL_VINDEX (TREE_VEC_ELT (method_vec, 1)) == NULL_TREE) - cp_warning ("`%#T' has virtual functions but non-virtual destructor", - t); - } - - /* Make the rtl for any new vtables we have created, and unmark - the base types we marked. */ - finish_vtbls (TYPE_BINFO (t), 1, t); - hack_incomplete_structures (t); - -#if 0 - if (TYPE_NAME (t) && TYPE_IDENTIFIER (t)) - undo_template_name_overload (TYPE_IDENTIFIER (t), 1); -#endif - - resume_momentary (old); - - if (warn_overloaded_virtual) - warn_hidden (t); - -#if 0 - /* This has to be done after we have sorted out what to do with - the enclosing type. */ - if (write_symbols != DWARF_DEBUG) - { - /* Be smarter about nested classes here. If a type is nested, - only output it if we would output the enclosing type. */ - if (DECL_CLASS_SCOPE_P (TYPE_MAIN_DECL (t))) - DECL_IGNORED_P (TYPE_MAIN_DECL (t)) = TREE_ASM_WRITTEN (TYPE_MAIN_DECL (t)); - } -#endif - - if (write_symbols != DWARF_DEBUG && write_symbols != DWARF2_DEBUG) - { - /* If the type has methods, we want to think about cutting down - the amount of symbol table stuff we output. The value stored in - the TYPE_DECL's DECL_IGNORED_P slot is a first approximation. - For example, if a member function is seen and we decide to - write out that member function, then we can change the value - of the DECL_IGNORED_P slot, and the type will be output when - that member function's debug info is written out. - - We can't do this with DWARF, which does not support name - references between translation units. */ - if (CLASSTYPE_METHOD_VEC (t)) - { - /* Don't output full info about any type - which does not have its implementation defined here. */ - if (CLASSTYPE_INTERFACE_ONLY (t)) - TYPE_DECL_SUPPRESS_DEBUG (TYPE_MAIN_DECL (t)) = 1; -#if 0 - /* XXX do something about this. */ - else if (CLASSTYPE_INTERFACE_UNKNOWN (t)) - /* Only a first approximation! */ - TYPE_DECL_SUPPRESS_DEBUG (TYPE_MAIN_DECL (t)) = 1; -#endif - } - else if (CLASSTYPE_INTERFACE_ONLY (t)) - TYPE_DECL_SUPPRESS_DEBUG (TYPE_MAIN_DECL (t)) = 1; - } - - /* Finish debugging output for this type. */ - rest_of_type_compilation (t, toplevel_bindings_p ()); - - return t; -} - -/* In [basic.scope.class] we have: - - A name N used in a class S shall refer to the same declaration in - its context and when re-evaluated in the completed scope of S. - - This function checks this condition for X, which is a member of - T. */ - -static void -check_member_decl_is_same_in_complete_scope (t, x) - tree t; - tree x; -{ - /* A name N used in a class S shall refer to the same declaration in - its context and when re-evaluated in the completed scope of S. - - Enums, types and static vars have already been checked. */ - if (TREE_CODE (x) != USING_DECL - && TREE_CODE (x) != TYPE_DECL && !DECL_CLASS_TEMPLATE_P (x) - && TREE_CODE (x) != CONST_DECL && TREE_CODE (x) != VAR_DECL) - { - tree name = DECL_NAME (x); - tree icv; - - /* Don't get confused by access decls. */ - if (name && TREE_CODE (name) == IDENTIFIER_NODE) - icv = IDENTIFIER_CLASS_VALUE (name); - else - icv = NULL_TREE; - - /* This should match pushdecl_class_level. */ - if (icv && icv != x - && flag_optional_diags - /* Don't complain about constructors. */ - && name != constructor_name (current_class_type) - /* Or inherited names. */ - && id_in_current_class (name) - /* Or shadowed tags. */ - && !(TREE_CODE (icv) == TYPE_DECL && DECL_CONTEXT (icv) == t)) - { - cp_pedwarn_at ("declaration of identifier `%D' as `%+#D'", - name, x); - cp_pedwarn_at ("conflicts with other use in class as `%#D'", - icv); - } - } -} - -/* When T was built up, the member declarations were added in reverse - order. Rearrange them to declaration order. */ - -void -unreverse_member_declarations (t) - tree t; -{ - tree next; - tree prev; - tree x; - - /* The TYPE_FIELDS, TYPE_METHODS, and CLASSTYPE_TAGS are all in - reverse order. Put them in declaration order now. */ - TYPE_METHODS (t) = nreverse (TYPE_METHODS (t)); - CLASSTYPE_TAGS (t) = nreverse (CLASSTYPE_TAGS (t)); - - /* Actually, for the TYPE_FIELDS, only the non TYPE_DECLs are in - reverse order, so we can't just use nreverse. */ - prev = NULL_TREE; - for (x = TYPE_FIELDS (t); - x && TREE_CODE (x) != TYPE_DECL; - x = next) - { - next = TREE_CHAIN (x); - TREE_CHAIN (x) = prev; - prev = x; - } - if (prev) - { - TREE_CHAIN (TYPE_FIELDS (t)) = x; - if (prev) - TYPE_FIELDS (t) = prev; - } -} - -tree -finish_struct (t, attributes, warn_anon) - tree t, attributes; - int warn_anon; -{ - tree name = TYPE_NAME (t); - tree x; - - if (TREE_CODE (name) == TYPE_DECL) - { - extern int lineno; - - DECL_SOURCE_FILE (name) = input_filename; - /* For TYPE_DECL that are not typedefs (those marked with a line - number of zero, we don't want to mark them as real typedefs. - If this fails one needs to make sure real typedefs have a - previous line number, even if it is wrong, that way the below - will fill in the right line number. (mrs) */ - if (DECL_SOURCE_LINE (name)) - DECL_SOURCE_LINE (name) = lineno; - name = DECL_NAME (name); - } - - /* Append the fields we need for constructing signature tables. */ - if (IS_SIGNATURE (t)) - append_signature_fields (t); - - /* Now that we've got all the field declarations, reverse everything - as necessary. */ - unreverse_member_declarations (t); - - if (flag_optional_diags) - { - for (x = TYPE_METHODS (t); x; x = TREE_CHAIN (x)) - check_member_decl_is_same_in_complete_scope (t, x); - for (x = TYPE_FIELDS (t); x; x = TREE_CHAIN (x)) - check_member_decl_is_same_in_complete_scope (t, x); - } - - /* Mark all the tags in the class as class-local. */ - for (x = CLASSTYPE_TAGS (t); x; x = TREE_CHAIN (x)) - TREE_NONLOCAL_FLAG (TREE_VALUE (x)) = 0; - - cplus_decl_attributes (t, attributes, NULL_TREE); - - if (processing_template_decl) - { - tree d = getdecls (); - for (; d; d = TREE_CHAIN (d)) - { - /* If this is the decl for the class or one of the template - parms, we've seen all the injected decls. */ - if ((TREE_CODE (d) == TYPE_DECL - && (TREE_TYPE (d) == t - || TREE_CODE (TREE_TYPE (d)) == TEMPLATE_TYPE_PARM - || TREE_CODE (TREE_TYPE (d)) == TEMPLATE_TEMPLATE_PARM)) - || TREE_CODE (d) == CONST_DECL) - break; - /* Don't inject cache decls. */ - else if (IDENTIFIER_TEMPLATE (DECL_NAME (d))) - continue; - DECL_TEMPLATE_INJECT (CLASSTYPE_TI_TEMPLATE (t)) - = tree_cons (NULL_TREE, d, - DECL_TEMPLATE_INJECT (CLASSTYPE_TI_TEMPLATE (t))); - } - finish_struct_methods (t); - TYPE_SIZE (t) = integer_zero_node; - } - else - t = finish_struct_1 (t, warn_anon); - - TYPE_BEING_DEFINED (t) = 0; - if (current_class_type) - popclass (0); - else - error ("trying to finish struct, but kicked out due to previous parse errors."); - - return t; -} - -/* Return the dynamic type of INSTANCE, if known. - Used to determine whether the virtual function table is needed - or not. - - *NONNULL is set iff INSTANCE can be known to be nonnull, regardless - of our knowledge of its type. */ - -tree -fixed_type_or_null (instance, nonnull) - tree instance; - int *nonnull; -{ - switch (TREE_CODE (instance)) - { - case INDIRECT_REF: - /* Check that we are not going through a cast of some sort. */ - if (TREE_TYPE (instance) - == TREE_TYPE (TREE_TYPE (TREE_OPERAND (instance, 0)))) - instance = TREE_OPERAND (instance, 0); - /* fall through... */ - case CALL_EXPR: - /* This is a call to a constructor, hence it's never zero. */ - if (TREE_HAS_CONSTRUCTOR (instance)) - { - if (nonnull) - *nonnull = 1; - return TREE_TYPE (instance); - } - return NULL_TREE; - - case SAVE_EXPR: - /* This is a call to a constructor, hence it's never zero. */ - if (TREE_HAS_CONSTRUCTOR (instance)) - { - if (nonnull) - *nonnull = 1; - return TREE_TYPE (instance); - } - return fixed_type_or_null (TREE_OPERAND (instance, 0), nonnull); - - case RTL_EXPR: - return NULL_TREE; - - case PLUS_EXPR: - case MINUS_EXPR: - if (TREE_CODE (TREE_OPERAND (instance, 1)) == INTEGER_CST) - /* Propagate nonnull. */ - fixed_type_or_null (TREE_OPERAND (instance, 0), nonnull); - if (TREE_CODE (TREE_OPERAND (instance, 0)) == ADDR_EXPR) - return fixed_type_or_null (TREE_OPERAND (instance, 0), nonnull); - return NULL_TREE; - - case NOP_EXPR: - case CONVERT_EXPR: - return fixed_type_or_null (TREE_OPERAND (instance, 0), nonnull); - - case ADDR_EXPR: - if (nonnull) - *nonnull = 1; - return fixed_type_or_null (TREE_OPERAND (instance, 0), nonnull); - - case COMPONENT_REF: - return fixed_type_or_null (TREE_OPERAND (instance, 1), nonnull); - - case VAR_DECL: - case FIELD_DECL: - if (TREE_CODE (TREE_TYPE (instance)) == ARRAY_TYPE - && IS_AGGR_TYPE (TREE_TYPE (TREE_TYPE (instance)))) - { - if (nonnull) - *nonnull = 1; - return TREE_TYPE (TREE_TYPE (instance)); - } - /* fall through... */ - case TARGET_EXPR: - case PARM_DECL: - if (IS_AGGR_TYPE (TREE_TYPE (instance))) - { - if (nonnull) - *nonnull = 1; - return TREE_TYPE (instance); - } - else if (nonnull) - { - if (instance == current_class_ptr - && flag_this_is_variable <= 0) - { - /* Normally, 'this' must be non-null. */ - if (flag_this_is_variable == 0) - *nonnull = 1; - - /* <0 means we're in a constructor and we know our type. */ - if (flag_this_is_variable < 0) - return TREE_TYPE (TREE_TYPE (instance)); - } - else if (TREE_CODE (TREE_TYPE (instance)) == REFERENCE_TYPE) - /* Reference variables should be references to objects. */ - *nonnull = 1; - } - return NULL_TREE; - - default: - return NULL_TREE; - } -} - -/* Return non-zero if the dynamic type of INSTANCE is known, and equivalent - to the static type. We also handle the case where INSTANCE is really - a pointer. - - Used to determine whether the virtual function table is needed - or not. - - *NONNULL is set iff INSTANCE can be known to be nonnull, regardless - of our knowledge of its type. */ - -int -resolves_to_fixed_type_p (instance, nonnull) - tree instance; - int *nonnull; -{ - tree t = TREE_TYPE (instance); - tree fixed = fixed_type_or_null (instance, nonnull); - if (fixed == NULL_TREE) - return 0; - if (POINTER_TYPE_P (t)) - t = TREE_TYPE (t); - return same_type_p (TYPE_MAIN_VARIANT (t), TYPE_MAIN_VARIANT (fixed)); -} - - -void -init_class_processing () -{ - current_class_depth = 0; - current_class_stack_size = 10; - current_class_stack - = (class_stack_node_t) xmalloc (current_class_stack_size - * sizeof (struct class_stack_node)); - - current_lang_stacksize = 10; - current_lang_base = (tree *)xmalloc(current_lang_stacksize * sizeof (tree)); - current_lang_stack = current_lang_base; - - access_default_node = build_int_2 (0, 0); - access_public_node = build_int_2 (1, 0); - access_protected_node = build_int_2 (2, 0); - access_private_node = build_int_2 (3, 0); - access_default_virtual_node = build_int_2 (4, 0); - access_public_virtual_node = build_int_2 (5, 0); - access_protected_virtual_node = build_int_2 (6, 0); - access_private_virtual_node = build_int_2 (7, 0); - - /* Keep these values lying around. */ - base_layout_decl = build_lang_field_decl (FIELD_DECL, NULL_TREE, error_mark_node); - TREE_TYPE (base_layout_decl) = make_node (RECORD_TYPE); - - gcc_obstack_init (&class_obstack); -} - -/* Set current scope to NAME. CODE tells us if this is a - STRUCT, UNION, or ENUM environment. - - NAME may end up being NULL_TREE if this is an anonymous or - late-bound struct (as in "struct { ... } foo;") */ - -/* Set global variables CURRENT_CLASS_NAME and CURRENT_CLASS_TYPE to - appropriate values, found by looking up the type definition of - NAME (as a CODE). - - If MODIFY is 1, we set IDENTIFIER_CLASS_VALUE's of names - which can be seen locally to the class. They are shadowed by - any subsequent local declaration (including parameter names). - - If MODIFY is 2, we set IDENTIFIER_CLASS_VALUE's of names - which have static meaning (i.e., static members, static - member functions, enum declarations, etc). - - If MODIFY is 3, we set IDENTIFIER_CLASS_VALUE of names - which can be seen locally to the class (as in 1), but - know that we are doing this for declaration purposes - (i.e. friend foo::bar (int)). - - So that we may avoid calls to lookup_name, we cache the _TYPE - nodes of local TYPE_DECLs in the TREE_TYPE field of the name. - - For multiple inheritance, we perform a two-pass depth-first search - of the type lattice. The first pass performs a pre-order search, - marking types after the type has had its fields installed in - the appropriate IDENTIFIER_CLASS_VALUE slot. The second pass merely - unmarks the marked types. If a field or member function name - appears in an ambiguous way, the IDENTIFIER_CLASS_VALUE of - that name becomes `error_mark_node'. */ - -void -pushclass (type, modify) - tree type; - int modify; -{ - type = TYPE_MAIN_VARIANT (type); - - /* Make sure there is enough room for the new entry on the stack. */ - if (current_class_depth + 1 >= current_class_stack_size) - { - current_class_stack_size *= 2; - current_class_stack - = (class_stack_node_t) xrealloc (current_class_stack, - current_class_stack_size - * sizeof (struct class_stack_node)); - } - - /* Insert a new entry on the class stack. */ - current_class_stack[current_class_depth].name = current_class_name; - current_class_stack[current_class_depth].type = current_class_type; - current_class_stack[current_class_depth].access = current_access_specifier; - current_class_depth++; - - /* Now set up the new type. */ - current_class_name = TYPE_NAME (type); - if (TREE_CODE (current_class_name) == TYPE_DECL) - current_class_name = DECL_NAME (current_class_name); - current_class_type = type; - - /* By default, things in classes are private, while things in - structures or unions are public. */ - current_access_specifier = (CLASSTYPE_DECLARED_CLASS (type) - ? access_private_node - : access_public_node); - - if (previous_class_type != NULL_TREE - && (type != previous_class_type || TYPE_SIZE (previous_class_type) == NULL_TREE) - && current_class_depth == 1) - { - /* Forcibly remove any old class remnants. */ - popclass (-1); - previous_class_type = NULL_TREE; - - /* Now, free the obstack on which we cached all the values. */ - obstack_free (&class_cache_obstack, class_cache_firstobj); - class_cache_firstobj - = (char*) obstack_finish (&class_cache_obstack); - } - - pushlevel_class (); - -#if 0 - if (CLASSTYPE_TEMPLATE_INFO (type)) - overload_template_name (type); -#endif - - if (modify) - { - tree tags; - tree this_fndecl = current_function_decl; - - if (current_function_decl - && DECL_CONTEXT (current_function_decl) - && TREE_CODE (DECL_CONTEXT (current_function_decl)) == FUNCTION_DECL) - current_function_decl = DECL_CONTEXT (current_function_decl); - else - current_function_decl = NULL_TREE; - - if (type != previous_class_type || current_class_depth > 1) - { -#ifdef MI_MATRIX - build_mi_matrix (type); - push_class_decls (type); - free_mi_matrix (); -#else - push_class_decls (type); -#endif - } - else - { - tree item; - - /* We are re-entering the same class we just left, so we - don't have to search the whole inheritance matrix to find - all the decls to bind again. Instead, we install the - cached class_shadowed list, and walk through it binding - names and setting up IDENTIFIER_TYPE_VALUEs. */ - set_class_shadows (previous_class_values); - for (item = previous_class_values; item; item = TREE_CHAIN (item)) - { - tree id = TREE_PURPOSE (item); - tree decl = TREE_TYPE (item); - - push_class_binding (id, decl); - if (TREE_CODE (decl) == TYPE_DECL) - set_identifier_type_value (id, TREE_TYPE (decl)); - } - unuse_fields (type); - } - - for (tags = CLASSTYPE_TAGS (type); tags; tags = TREE_CHAIN (tags)) - { - tree tag_type = TREE_VALUE (tags); - - TREE_NONLOCAL_FLAG (tag_type) = 1; - if (! TREE_PURPOSE (tags)) - continue; - if (! (IS_AGGR_TYPE_CODE (TREE_CODE (tag_type)) - && CLASSTYPE_IS_TEMPLATE (tag_type))) - pushtag (TREE_PURPOSE (tags), tag_type, 0); - } - - current_function_decl = this_fndecl; - } -} - -/* Get out of the current class scope. If we were in a class scope - previously, that is the one popped to. The flag MODIFY tells whether - the current scope declarations needs to be modified as a result of - popping to the previous scope. 0 is used for class definitions. */ - -void -popclass (modify) - int modify; -{ - if (modify < 0) - { - /* Back this old class out completely. */ - tree tags = CLASSTYPE_TAGS (previous_class_type); - tree t; - - /* This code can be seen as a cache miss. When we've cached a - class' scope's bindings and we can't use them, we need to reset - them. This is it! */ - for (t = previous_class_values; t; t = TREE_CHAIN (t)) - IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (t)) = NULL_TREE; - while (tags) - { - TREE_NONLOCAL_FLAG (TREE_VALUE (tags)) = 0; - tags = TREE_CHAIN (tags); - } - - return; - } - - if (modify) - { - /* Just remove from this class what didn't make - it into IDENTIFIER_CLASS_VALUE. */ - tree tags = CLASSTYPE_TAGS (current_class_type); - - while (tags) - { - TREE_NONLOCAL_FLAG (TREE_VALUE (tags)) = 0; - tags = TREE_CHAIN (tags); - } - } - - /* Force clearing of IDENTIFIER_CLASS_VALUEs after a class definition, - since not all class decls make it there currently. */ - poplevel_class (! modify); - - /* Since poplevel_class does the popping of class decls nowadays, - this really only frees the obstack used for these decls. - That's why it had to be moved down here. */ - if (modify) - pop_class_decls (); - - current_class_depth--; - current_class_name = current_class_stack[current_class_depth].name; - current_class_type = current_class_stack[current_class_depth].type; - current_access_specifier = current_class_stack[current_class_depth].access; -} - -/* Returns 1 if current_class_type is either T or a nested type of T. */ - -int -currently_open_class (t) - tree t; -{ - int i; - if (t == current_class_type) - return 1; - for (i = 0; i < current_class_depth; ++i) - if (current_class_stack [i].type == t) - return 1; - return 0; -} - -/* When entering a class scope, all enclosing class scopes' names with - static meaning (static variables, static functions, types and enumerators) - have to be visible. This recursive function calls pushclass for all - enclosing class contexts until global or a local scope is reached. - TYPE is the enclosed class and MODIFY is equivalent with the pushclass - formal of the same name. */ - -void -push_nested_class (type, modify) - tree type; - int modify; -{ - tree context; - - my_friendly_assert (!type || TREE_CODE (type) != NAMESPACE_DECL, 980711); - - if (type == NULL_TREE || type == error_mark_node || ! IS_AGGR_TYPE (type) - || TREE_CODE (type) == TEMPLATE_TYPE_PARM - || TREE_CODE (type) == TEMPLATE_TEMPLATE_PARM) - return; - - context = DECL_CONTEXT (TYPE_MAIN_DECL (type)); - - if (context && TREE_CODE (context) == RECORD_TYPE) - push_nested_class (context, 2); - pushclass (type, modify); -} - -/* Undoes a push_nested_class call. MODIFY is passed on to popclass. */ - -void -pop_nested_class (modify) - int modify; -{ - tree context = DECL_CONTEXT (TYPE_MAIN_DECL (current_class_type)); - - popclass (modify); - if (context && TREE_CODE (context) == RECORD_TYPE) - pop_nested_class (modify); -} - -/* Set global variables CURRENT_LANG_NAME to appropriate value - so that behavior of name-mangling machinery is correct. */ - -void -push_lang_context (name) - tree name; -{ - *current_lang_stack++ = current_lang_name; - if (current_lang_stack >= current_lang_base + current_lang_stacksize) - { - current_lang_base - = (tree *)xrealloc (current_lang_base, - sizeof (tree) * (current_lang_stacksize + 10)); - current_lang_stack = current_lang_base + current_lang_stacksize; - current_lang_stacksize += 10; - } - - if (name == lang_name_cplusplus || name == lang_name_java) - { - strict_prototype = strict_prototypes_lang_cplusplus; - current_lang_name = name; - } - else if (name == lang_name_c) - { - strict_prototype = strict_prototypes_lang_c; - current_lang_name = name; - } - else - error ("language string `\"%s\"' not recognized", IDENTIFIER_POINTER (name)); -} - -/* Get out of the current language scope. */ - -void -pop_lang_context () -{ - current_lang_name = *--current_lang_stack; - if (current_lang_name == lang_name_cplusplus - || current_lang_name == lang_name_java) - strict_prototype = strict_prototypes_lang_cplusplus; - else if (current_lang_name == lang_name_c) - strict_prototype = strict_prototypes_lang_c; -} - -/* Type instantiation routines. */ - -/* Given an OVERLOAD and a TARGET_TYPE, return the function that - matches the TARGET_TYPE. If there is no satisfactory match, return - error_mark_node, and issue an error message if COMPLAIN is - non-zero. If TEMPLATE_ONLY, the name of the overloaded function - was a template-id, and EXPLICIT_TARGS are the explicitly provided - template arguments. */ - -static tree -resolve_address_of_overloaded_function (target_type, - overload, - complain, - template_only, - explicit_targs) - tree target_type; - tree overload; - int complain; - int template_only; - tree explicit_targs; -{ - /* Here's what the standard says: - - [over.over] - - If the name is a function template, template argument deduction - is done, and if the argument deduction succeeds, the deduced - arguments are used to generate a single template function, which - is added to the set of overloaded functions considered. - - Non-member functions and static member functions match targets of - type "pointer-to-function" or "reference-to-function." Nonstatic - member functions match targets of type "pointer-to-member - function;" the function type of the pointer to member is used to - select the member function from the set of overloaded member - functions. If a nonstatic member function is selected, the - reference to the overloaded function name is required to have the - form of a pointer to member as described in 5.3.1. - - If more than one function is selected, any template functions in - the set are eliminated if the set also contains a non-template - function, and any given template function is eliminated if the - set contains a second template function that is more specialized - than the first according to the partial ordering rules 14.5.5.2. - After such eliminations, if any, there shall remain exactly one - selected function. */ - - int is_ptrmem = 0; - int is_reference = 0; - /* We store the matches in a TREE_LIST rooted here. The functions - are the TREE_PURPOSE, not the TREE_VALUE, in this list, for easy - interoperability with most_specialized_instantiation. */ - tree matches = NULL_TREE; - tree fn; - - /* By the time we get here, we should be seeing only real - pointer-to-member types, not the internal POINTER_TYPE to - METHOD_TYPE representation. */ - my_friendly_assert (!(TREE_CODE (target_type) == POINTER_TYPE - && (TREE_CODE (TREE_TYPE (target_type)) - == METHOD_TYPE)), 0); - - /* Check that the TARGET_TYPE is reasonable. */ - if (TYPE_PTRFN_P (target_type)) - /* This is OK. */ - ; - else if (TYPE_PTRMEMFUNC_P (target_type)) - /* This is OK, too. */ - is_ptrmem = 1; - else if (TREE_CODE (target_type) == FUNCTION_TYPE) - { - /* This is OK, too. This comes from a conversion to reference - type. */ - target_type = build_reference_type (target_type); - is_reference = 1; - } - else - { - if (complain) - cp_error("cannot resolve overloaded function `%D' based on conversion to type `%T'", - DECL_NAME (OVL_FUNCTION (overload)), target_type); - return error_mark_node; - } - - /* If we can find a non-template function that matches, we can just - use it. There's no point in generating template instantiations - if we're just going to throw them out anyhow. But, of course, we - can only do this when we don't *need* a template function. */ - if (!template_only) - { - tree fns; - - for (fns = overload; fns; fns = OVL_CHAIN (fns)) - { - tree fn = OVL_FUNCTION (fns); - tree fntype; - - if (TREE_CODE (fn) == TEMPLATE_DECL) - /* We're not looking for templates just yet. */ - continue; - - if ((TREE_CODE (TREE_TYPE (fn)) == METHOD_TYPE) - != is_ptrmem) - /* We're looking for a non-static member, and this isn't - one, or vice versa. */ - continue; - - /* See if there's a match. */ - fntype = TREE_TYPE (fn); - if (is_ptrmem) - fntype = build_ptrmemfunc_type (build_pointer_type (fntype)); - else if (!is_reference) - fntype = build_pointer_type (fntype); - - if (can_convert_arg (target_type, fntype, fn)) - matches = scratch_tree_cons (fn, NULL_TREE, matches); - } - } - - /* Now, if we've already got a match (or matches), there's no need - to proceed to the template functions. But, if we don't have a - match we need to look at them, too. */ - if (!matches) - { - tree target_fn_type; - tree target_arg_types; - tree fns; - - if (is_ptrmem) - { - target_fn_type - = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (target_type)); - target_arg_types = TREE_CHAIN (TYPE_ARG_TYPES (target_fn_type)); - } - else - { - target_fn_type = TREE_TYPE (target_type); - target_arg_types = TYPE_ARG_TYPES (target_fn_type); - } - - for (fns = overload; fns; fns = OVL_CHAIN (fns)) - { - tree fn = OVL_FUNCTION (fns); - tree fn_arg_types; - tree instantiation; - tree instantiation_type; - tree targs; - - if (TREE_CODE (fn) != TEMPLATE_DECL) - /* We're only looking for templates. */ - continue; - - if ((TREE_CODE (TREE_TYPE (fn)) == METHOD_TYPE) - != is_ptrmem) - /* We're looking for a non-static member, and this isn't - one, or vice versa. */ - continue; - - /* We don't use the `this' argument to do argument deduction - since that would prevent us from converting a base class - pointer-to-member to a derived class pointer-to-member. */ - fn_arg_types = TYPE_ARG_TYPES (TREE_TYPE (fn)); - if (is_ptrmem) - fn_arg_types = TREE_CHAIN (fn_arg_types); - - /* Try to do argument deduction. */ - targs = make_scratch_vec (DECL_NTPARMS (fn)); - if (type_unification (DECL_INNERMOST_TEMPLATE_PARMS (fn), - targs, - fn_arg_types, - target_arg_types, - explicit_targs, - DEDUCE_EXACT, - /*allow_incomplete=*/1) != 0) - /* Argument deduction failed. */ - continue; - - /* Instantiate the template. */ - instantiation = instantiate_template (fn, targs); - if (instantiation == error_mark_node) - /* Instantiation failed. */ - continue; - - /* See if there's a match. */ - instantiation_type = TREE_TYPE (instantiation); - if (is_ptrmem) - instantiation_type = - build_ptrmemfunc_type (build_pointer_type (instantiation_type)); - else if (!is_reference) - instantiation_type = build_pointer_type (instantiation_type); - if (can_convert_arg (target_type, instantiation_type, instantiation)) - matches = scratch_tree_cons (instantiation, fn, matches); - } - - /* Now, remove all but the most specialized of the matches. */ - if (matches) - { - tree match = most_specialized_instantiation (matches, - explicit_targs); - - if (match != error_mark_node) - matches = scratch_tree_cons (match, NULL_TREE, NULL_TREE); - } - } - - /* Now we should have exactly one function in MATCHES. */ - if (matches == NULL_TREE) - { - /* There were *no* matches. */ - if (complain) - { - cp_error ("no matches converting function `%D' to type `%#T'", - DECL_NAME (OVL_FUNCTION (overload)), - target_type); - - /* print_candidates expects a chain with the functions in - TREE_VALUE slots, so we cons one up here (we're losing anyway, - so why be clever?). */ - for (; overload; overload = OVL_NEXT (overload)) - matches = scratch_tree_cons (NULL_TREE, OVL_CURRENT (overload), - matches); - - print_candidates (matches); - } - return error_mark_node; - } - else if (TREE_CHAIN (matches)) - { - /* There were too many matches. */ - - if (complain) - { - tree match; - - cp_error ("converting overloaded function `%D' to type `%#T' is ambiguous", - DECL_NAME (OVL_FUNCTION (overload)), - target_type); - - /* Since print_candidates expects the functions in the - TREE_VALUE slot, we flip them here. */ - for (match = matches; match; match = TREE_CHAIN (match)) - TREE_VALUE (match) = TREE_PURPOSE (match); - - print_candidates (matches); - } - - return error_mark_node; - } - - /* Good, exactly one match. Now, convert it to the correct type. */ - fn = TREE_PURPOSE (matches); - - mark_used (fn); - - if (TYPE_PTRFN_P (target_type) || TYPE_PTRMEMFUNC_P (target_type)) - return build_unary_op (ADDR_EXPR, fn, 0); - else - { - /* The target must be a REFERENCE_TYPE. Above, build_unary_op - will mark the function as addressed, but here we must do it - explicitly. */ - mark_addressable (fn); - - return fn; - } -} - -/* This function will instantiate the type of the expression given in - RHS to match the type of LHSTYPE. If errors exist, then return - error_mark_node. We only complain is COMPLAIN is set. If we are - not complaining, never modify rhs, as overload resolution wants to - try many possible instantiations, in hopes that at least one will - work. - - For non-recursive calls, LHSTYPE should be a function, pointer to - function, or a pointer to member function. */ - -tree -instantiate_type (lhstype, rhs, complain) - tree lhstype, rhs; - int complain; -{ - if (TREE_CODE (lhstype) == UNKNOWN_TYPE) - { - if (complain) - error ("not enough type information"); - return error_mark_node; - } - - if (TREE_TYPE (rhs) != NULL_TREE && ! (type_unknown_p (rhs))) - { - if (same_type_p (lhstype, TREE_TYPE (rhs))) - return rhs; - if (complain) - cp_error ("argument of type `%T' does not match `%T'", - TREE_TYPE (rhs), lhstype); - return error_mark_node; - } - - /* We don't overwrite rhs if it is an overloaded function. - Copying it would destroy the tree link. */ - if (TREE_CODE (rhs) != OVERLOAD) - rhs = copy_node (rhs); - - /* This should really only be used when attempting to distinguish - what sort of a pointer to function we have. For now, any - arithmetic operation which is not supported on pointers - is rejected as an error. */ - - switch (TREE_CODE (rhs)) - { - case TYPE_EXPR: - case CONVERT_EXPR: - case SAVE_EXPR: - case CONSTRUCTOR: - case BUFFER_REF: - my_friendly_abort (177); - return error_mark_node; - - case INDIRECT_REF: - case ARRAY_REF: - { - tree new_rhs; - - new_rhs = instantiate_type (build_pointer_type (lhstype), - TREE_OPERAND (rhs, 0), complain); - if (new_rhs == error_mark_node) - return error_mark_node; - - TREE_TYPE (rhs) = lhstype; - TREE_OPERAND (rhs, 0) = new_rhs; - return rhs; - } - - case NOP_EXPR: - rhs = copy_node (TREE_OPERAND (rhs, 0)); - TREE_TYPE (rhs) = unknown_type_node; - return instantiate_type (lhstype, rhs, complain); - - case COMPONENT_REF: - { - tree field = TREE_OPERAND (rhs, 1); - tree r; - - my_friendly_assert (TREE_CODE (field) == TREE_LIST, 0); - - r = instantiate_type (lhstype, field, complain); - - if (r != error_mark_node && TYPE_PTRMEMFUNC_P (lhstype)) - { - if (complain) - { - tree t = TYPE_PTRMEMFUNC_OBJECT_TYPE (lhstype); - tree fn = TREE_VALUE (field); - if (TREE_CODE (fn) == OVERLOAD) - fn = OVL_FUNCTION (fn); - if (TREE_CODE (fn) == FUNCTION_DECL) - { - cp_error ("object-dependent reference `%E' can only be used in a call", - DECL_NAME (fn)); - cp_error (" to form a pointer to member function, say `&%T::%E'", - t, DECL_NAME (fn)); - } - else - cp_error ("object-dependent reference can only be used in a call"); - } - return error_mark_node; - } - - return r; - } - - case OFFSET_REF: - /* This can happen if we are forming a pointer-to-member for a - member template. */ - rhs = TREE_OPERAND (rhs, 1); - my_friendly_assert (TREE_CODE (rhs) == TEMPLATE_ID_EXPR, 0); - - /* Fall through. */ - - case TEMPLATE_ID_EXPR: - return - resolve_address_of_overloaded_function (lhstype, - TREE_OPERAND (rhs, 0), - complain, - /*template_only=*/1, - TREE_OPERAND (rhs, 1)); - - case OVERLOAD: - return - resolve_address_of_overloaded_function (lhstype, - rhs, - complain, - /*template_only=*/0, - /*explicit_targs=*/NULL_TREE); - - case TREE_LIST: - { - if (TREE_PURPOSE (rhs) == error_mark_node) - { - /* Make sure we don't drop the non-local flag, as the old code - would rely on it. */ - int nl = TREE_NONLOCAL_FLAG (rhs); - /* We don't need the type of this node. */ - rhs = TREE_VALUE (rhs); - my_friendly_assert (TREE_NONLOCAL_FLAG (rhs) == nl, 980331); - } - - /* Now we should have a baselink. */ - my_friendly_assert (TREE_CODE (TREE_PURPOSE (rhs)) == TREE_VEC, - 980331); - my_friendly_assert (TREE_CHAIN (rhs) == NULL_TREE, 181); - my_friendly_assert (TREE_CODE (TREE_VALUE (rhs)) == FUNCTION_DECL - || TREE_CODE (TREE_VALUE (rhs)) == OVERLOAD, - 182); - - return instantiate_type (lhstype, TREE_VALUE (rhs), complain); - } - - case CALL_EXPR: - /* This is too hard for now. */ - my_friendly_abort (183); - return error_mark_node; - - case PLUS_EXPR: - case MINUS_EXPR: - case COMPOUND_EXPR: - TREE_OPERAND (rhs, 0) - = instantiate_type (lhstype, TREE_OPERAND (rhs, 0), complain); - if (TREE_OPERAND (rhs, 0) == error_mark_node) - return error_mark_node; - TREE_OPERAND (rhs, 1) - = instantiate_type (lhstype, TREE_OPERAND (rhs, 1), complain); - if (TREE_OPERAND (rhs, 1) == error_mark_node) - return error_mark_node; - - TREE_TYPE (rhs) = lhstype; - return rhs; - - case MULT_EXPR: - case TRUNC_DIV_EXPR: - case FLOOR_DIV_EXPR: - case CEIL_DIV_EXPR: - case ROUND_DIV_EXPR: - case RDIV_EXPR: - case TRUNC_MOD_EXPR: - case FLOOR_MOD_EXPR: - case CEIL_MOD_EXPR: - case ROUND_MOD_EXPR: - case FIX_ROUND_EXPR: - case FIX_FLOOR_EXPR: - case FIX_CEIL_EXPR: - case FIX_TRUNC_EXPR: - case FLOAT_EXPR: - case NEGATE_EXPR: - case ABS_EXPR: - case MAX_EXPR: - case MIN_EXPR: - case FFS_EXPR: - - case BIT_AND_EXPR: - case BIT_IOR_EXPR: - case BIT_XOR_EXPR: - case LSHIFT_EXPR: - case RSHIFT_EXPR: - case LROTATE_EXPR: - case RROTATE_EXPR: - - case PREINCREMENT_EXPR: - case PREDECREMENT_EXPR: - case POSTINCREMENT_EXPR: - case POSTDECREMENT_EXPR: - if (complain) - error ("invalid operation on uninstantiated type"); - return error_mark_node; - - case TRUTH_AND_EXPR: - case TRUTH_OR_EXPR: - case TRUTH_XOR_EXPR: - case LT_EXPR: - case LE_EXPR: - case GT_EXPR: - case GE_EXPR: - case EQ_EXPR: - case NE_EXPR: - case TRUTH_ANDIF_EXPR: - case TRUTH_ORIF_EXPR: - case TRUTH_NOT_EXPR: - if (complain) - error ("not enough type information"); - return error_mark_node; - - case COND_EXPR: - if (type_unknown_p (TREE_OPERAND (rhs, 0))) - { - if (complain) - error ("not enough type information"); - return error_mark_node; - } - TREE_OPERAND (rhs, 1) - = instantiate_type (lhstype, TREE_OPERAND (rhs, 1), complain); - if (TREE_OPERAND (rhs, 1) == error_mark_node) - return error_mark_node; - TREE_OPERAND (rhs, 2) - = instantiate_type (lhstype, TREE_OPERAND (rhs, 2), complain); - if (TREE_OPERAND (rhs, 2) == error_mark_node) - return error_mark_node; - - TREE_TYPE (rhs) = lhstype; - return rhs; - - case MODIFY_EXPR: - TREE_OPERAND (rhs, 1) - = instantiate_type (lhstype, TREE_OPERAND (rhs, 1), complain); - if (TREE_OPERAND (rhs, 1) == error_mark_node) - return error_mark_node; - - TREE_TYPE (rhs) = lhstype; - return rhs; - - case ADDR_EXPR: - return instantiate_type (lhstype, TREE_OPERAND (rhs, 0), complain); - - case ENTRY_VALUE_EXPR: - my_friendly_abort (184); - return error_mark_node; - - case ERROR_MARK: - return error_mark_node; - - default: - my_friendly_abort (185); - return error_mark_node; - } -} - -/* Return the name of the virtual function pointer field - (as an IDENTIFIER_NODE) for the given TYPE. Note that - this may have to look back through base types to find the - ultimate field name. (For single inheritance, these could - all be the same name. Who knows for multiple inheritance). */ - -static tree -get_vfield_name (type) - tree type; -{ - tree binfo = TYPE_BINFO (type); - char *buf; - - while (BINFO_BASETYPES (binfo) - && TYPE_VIRTUAL_P (BINFO_TYPE (BINFO_BASETYPE (binfo, 0))) - && ! TREE_VIA_VIRTUAL (BINFO_BASETYPE (binfo, 0))) - binfo = BINFO_BASETYPE (binfo, 0); - - type = BINFO_TYPE (binfo); - buf = (char *) alloca (sizeof (VFIELD_NAME_FORMAT) - + TYPE_NAME_LENGTH (type) + 2); - sprintf (buf, VFIELD_NAME_FORMAT, TYPE_NAME_STRING (type)); - return get_identifier (buf); -} - -void -print_class_statistics () -{ -#ifdef GATHER_STATISTICS - fprintf (stderr, "convert_harshness = %d\n", n_convert_harshness); - fprintf (stderr, "compute_conversion_costs = %d\n", n_compute_conversion_costs); - fprintf (stderr, "build_method_call = %d (inner = %d)\n", - n_build_method_call, n_inner_fields_searched); - if (n_vtables) - { - fprintf (stderr, "vtables = %d; vtable searches = %d\n", - n_vtables, n_vtable_searches); - fprintf (stderr, "vtable entries = %d; vtable elems = %d\n", - n_vtable_entries, n_vtable_elems); - } -#endif -} - -/* Push an obstack which is sufficiently long-lived to hold such class - decls that may be cached in the previous_class_values list. The - effect is undone by pop_obstacks. */ - -void -maybe_push_cache_obstack () -{ - static int cache_obstack_initialized; - - if (!cache_obstack_initialized) - { - gcc_obstack_init (&class_cache_obstack); - class_cache_firstobj - = (char*) obstack_finish (&class_cache_obstack); - cache_obstack_initialized = 1; - } - - push_obstacks_nochange (); - current_obstack = &class_cache_obstack; -} - -/* Build a dummy reference to ourselves so Derived::Base (and A::A) works, - according to [class]: - The class-name is also inserted - into the scope of the class itself. For purposes of access checking, - the inserted class name is treated as if it were a public member name. */ - -tree -build_self_reference () -{ - tree name = constructor_name (current_class_type); - tree value = build_lang_decl (TYPE_DECL, name, current_class_type); - DECL_NONLOCAL (value) = 1; - DECL_CONTEXT (value) = current_class_type; - DECL_CLASS_CONTEXT (value) = current_class_type; - DECL_ARTIFICIAL (value) = 1; - - pushdecl_class_level (value); - return value; -} - -/* Returns 1 if TYPE contains only padding bytes. */ - -int -is_empty_class (type) - tree type; -{ - tree t; - - if (type == error_mark_node) - return 0; - - if (! IS_AGGR_TYPE (type)) - return 0; - - if (flag_new_abi) - return CLASSTYPE_SIZE (type) == integer_zero_node; - - if (TYPE_BINFO_BASETYPES (type)) - return 0; - t = TYPE_FIELDS (type); - while (t && TREE_CODE (t) != FIELD_DECL) - t = TREE_CHAIN (t); - return (t == NULL_TREE); -} - -/* Find the enclosing class of the given NODE. NODE can be a *_DECL or - a *_TYPE node. NODE can also be a local class. */ - -tree -get_enclosing_class (type) - tree type; -{ - tree node = type; - - while (node && TREE_CODE (node) != NAMESPACE_DECL) - { - switch (TREE_CODE_CLASS (TREE_CODE (node))) - { - case 'd': - node = DECL_CONTEXT (node); - break; - - case 't': - if (node != type) - return node; - node = TYPE_CONTEXT (node); - break; - - default: - my_friendly_abort (0); - } - } - return NULL_TREE; -} - -/* Return 1 if TYPE or one of its enclosing classes is derived from BASE. */ - -int -is_base_of_enclosing_class (base, type) - tree base, type; -{ - while (type) - { - if (get_binfo (base, type, 0)) - return 1; - - type = get_enclosing_class (type); - } - return 0; -} diff --git a/gcc/cp/config-lang.in b/gcc/cp/config-lang.in deleted file mode 100755 index dd31af4..0000000 --- a/gcc/cp/config-lang.in +++ /dev/null @@ -1,41 +0,0 @@ -# Top level configure fragment for GNU C++. -# Copyright (C) 1994, 1995, 1997, 1998 Free Software Foundation, Inc. - -#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 -#the Free Software Foundation, 59 Temple Place - Suite 330, -#Boston, MA 02111-1307, USA. - -# Configure looks for the existence of this file to auto-config each language. -# We define several parameters used by configure: -# -# language - name of language as it would appear in $(LANGUAGES) -# compilers - value to add to $(COMPILERS) -# stagestuff - files to add to $(STAGESTUFF) -# diff_excludes - files to ignore when building diffs between two versions. - -language="c++" - -compilers="cc1plus\$(exeext)" - -stagestuff="g++\$(exeext) g++-cross\$(exeext) cc1plus\$(exeext)" - -diff_excludes="-x parse.c -x parse.h" - -headers='$(CXX_EXTRA_HEADERS)' - -lib2funcs=cplib2.txt - -outputs=cp/Makefile diff --git a/gcc/cp/cp-tree.def b/gcc/cp/cp-tree.def deleted file mode 100755 index 2fdacfd..0000000 --- a/gcc/cp/cp-tree.def +++ /dev/null @@ -1,257 +0,0 @@ -/* This file contains the definitions and documentation for the - additional tree codes used in the GNU C++ compiler (see tree.def - for the standard codes). - Copyright (C) 1987, 1988, 1990, 1993, 1997, 1998 Free Software Foundation, Inc. - Hacked by Michael Tiemann (tiemann@cygnus.com) - -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 -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - - -/* Reference to the contents of an offset - (a value whose type is an OFFSET_TYPE). - Operand 0 is the object within which the offset is taken. - Operand 1 is the offset. The language independent OFFSET_REF - just won't work for us. */ -DEFTREECODE (OFFSET_REF, "offset_ref", 'r', 2) - -/* A pointer-to-member constant. For a pointer-to-member constant - `X::Y' The PTRMEM_CST_CLASS is the RECORD_TYPE for `X' and the - PTRMEM_CST_MEMBER is the _DECL for `Y'. */ -DEFTREECODE (PTRMEM_CST, "ptrmem_cst", 'c', 1) - -/* For NEW_EXPR, operand 0 is the placement list. - Operand 1 is the new-declarator. - Operand 2 is the initializer. */ -DEFTREECODE (NEW_EXPR, "nw_expr", 'e', 3) -DEFTREECODE (VEC_NEW_EXPR, "vec_nw_expr", 'e', 3) - -/* For DELETE_EXPR, operand 0 is the store to be destroyed. - Operand 1 is the value to pass to the destroying function - saying whether the store should be deallocated as well. */ -DEFTREECODE (DELETE_EXPR, "dl_expr", 'e', 2) -DEFTREECODE (VEC_DELETE_EXPR, "vec_dl_expr", 'e', 2) - -/* Value is reference to particular overloaded class method. - Operand 0 is the class name (an IDENTIFIER_NODE); - operand 1 is the field (also an IDENTIFIER_NODE). - The COMPLEXITY field holds the class level (usually 0). */ -DEFTREECODE (SCOPE_REF, "scope_ref", 'r', 2) - -/* When composing an object with a member, this is the result. - Operand 0 is the object. Operand 1 is the member (usually - a dereferenced pointer to member). */ -DEFTREECODE (MEMBER_REF, "member_ref", 'r', 2) - -/* Type conversion operator in C++. TREE_TYPE is type that this - operator converts to. Operand is expression to be converted. */ -DEFTREECODE (TYPE_EXPR, "type_expr", 'e', 1) - -/* For AGGR_INIT_EXPR, operand 0 is function which performs initialization, - operand 1 is argument list to initialization function, - and operand 2 is the slot which was allocated for this expression. */ -DEFTREECODE (AGGR_INIT_EXPR, "aggr_init_expr", 'e', 3) - -/* A throw expression. operand 0 is the expression, if there was one, - else it is NULL_TREE. */ -DEFTREECODE (THROW_EXPR, "throw_expr", 'e', 1) - -/* Initialization of a vector, used in build_new. Operand 0 is the target - of the initialization, operand 1 is the initializer, and operand 2 is - the number of elements. */ -DEFTREECODE (VEC_INIT_EXPR, "vec_init_expr", 'e', 3) - -/* Template definition. The following fields have the specified uses, - although there are other macros in cp-tree.h that should be used for - accessing this data. - DECL_ARGUMENTS template parm vector - DECL_TEMPLATE_INFO template text &c - DECL_VINDEX list of instantiations already produced; - only done for functions so far - For class template: - DECL_INITIAL associated templates (methods &c) - DECL_RESULT null - For non-class templates: - TREE_TYPE type of object to be constructed - DECL_RESULT decl for object to be created - (e.g., FUNCTION_DECL with tmpl parms used) - */ -DEFTREECODE (TEMPLATE_DECL, "template_decl", 'd', 0) - -/* Index into a template parameter list. The TEMPLATE_PARM_IDX gives - the index (from 0) of the parameter, while the TEMPLATE_PARM_LEVEL - gives the level (from 1) of the parameter. - - Here's an example: - - template // Index 0, Level 1. - struct S - { - template // Index 1, Level 2. - void f(); - }; - - The DESCENDANTS will be a chain of TEMPLATE_PARM_INDEXs descended - from this one. The first descendant will have the same IDX, but - its LEVEL will be one less. The TREE_CHAIN field is used to chain - together the descendants. The TEMPLATE_PARM_DECL is the - declaration of this parameter, either a TYPE_DECL or CONST_DECL. - The TEMPLATE_PARM_ORIG_LEVEL is the LEVEL of the most distant - parent, i.e., the LEVEL that the parameter originally had when it - was declared. For example, if we instantiate S, we will have: - - struct S - { - template // Index 1, Level 1, Orig Level 2 - void f(); - }; - - The LEVEL is the level of the parameter when we are worrying about - the types of things; the ORIG_LEVEL is the level when we are - worrying about instantiating things. */ -DEFTREECODE (TEMPLATE_PARM_INDEX, "template_parm_index", 'x', - /* The addition of (sizeof(char*) - 1) in the next - expression is to ensure against the case where - sizeof(char*) does not evenly divide - sizeof(HOST_WIDE_INT). */ - 2 + ((3 * sizeof (HOST_WIDE_INT) + sizeof(char*) - 1) - / sizeof (char*))) - -/* Index into a template parameter list. This parameter must be a type. - The TYPE_FIELDS value will be a TEMPLATE_PARM_INDEX. */ -DEFTREECODE (TEMPLATE_TYPE_PARM, "template_type_parm", 't', 0) - -/* Index into a template parameter list. This parameter must be a type. - If it is used in signature of a template, TEMPLATE_INFO is NULL_TREE. - Otherwise it is used to declare a type like TT. - The TYPE_FIELDS value will be a TEMPLATE_PARM_INDEX. */ -DEFTREECODE (TEMPLATE_TEMPLATE_PARM, "template_template_parm", 't', 0) - -/* A type designated by `typename T::t'. TYPE_CONTEXT is `T', - TYPE_NAME is a TYPE_DECL for `t'. If TREE_TYPE is present, this - type was generated by the implicit typename extension, and the - TREE_TYPE is a _TYPE from a baseclass of `T'. */ -DEFTREECODE (TYPENAME_TYPE, "typename_type", 't', 0) - -/* A type designated by `__typeof (expr)'. TYPE_FIELDS is the - expression in question. */ -DEFTREECODE (TYPEOF_TYPE, "typeof_type", 't', 0) - -/* A thunk is a stub function. - - Thunks are used to implement multiple inheritance: - At run-time, such a thunk subtracts THUNK_DELTA (an int, not a tree) - from the this pointer, and then jumps to DECL_INITIAL - (which is an ADDR_EXPR whose operand is a FUNCTION_DECL). - - Other kinds of thunks may be defined later. */ -DEFTREECODE (THUNK_DECL, "thunk_decl", 'd', 0) - -/* A using declaration. DECL_INITIAL contains the specified scope. - This is not an alias, but is later expanded into multiple aliases. */ -DEFTREECODE (USING_DECL, "using_decl", 'd', 0) - -/* An un-parsed default argument. Looks like an IDENTIFIER_NODE. */ -DEFTREECODE (DEFAULT_ARG, "default_arg", 'c', 2) - -/* A template-id, like foo. The first operand is the template. - The second is the list of explicitly specified arguments. The - template will be a FUNCTION_DECL, TEMPLATE_DECL, or a list of - overloaded functions and templates if the template-id refers to - a global template. If the template-id refers to a member template, - the template may be an IDENTIFIER_NODE. */ -DEFTREECODE (TEMPLATE_ID_EXPR, "template_id_expr", 'e', 2) - -/* An association between name and entity. Parameters are the scope - and the (non-type) value. TREE_TYPE indicates the type bound to - the name. */ -DEFTREECODE (CPLUS_BINDING, "binding", 'x', 2) - -/* A list-like node for chaining overloading candidates. TREE_TYPE is - the original name, and the parameter is the FUNCTION_DECL. */ -DEFTREECODE (OVERLOAD, "overload", 'x', 1) - -/* A generic wrapper for something not tree that we want to include in - tree structure. */ -DEFTREECODE (WRAPPER, "wrapper", 'x', 1) - -/* A node to remember a source position. */ -DEFTREECODE (SRCLOC, "srcloc", 'x', 2) - -/* Used to represent deferred name lookup for dependent names while - parsing a template declaration. The first argument is an - IDENTIFIER_NODE for the name in question. The TREE_TYPE is - unused. */ -DEFTREECODE (LOOKUP_EXPR, "lookup_expr", 'e', 1) - -/* A whole bunch of tree codes for the initial, superficial parsing of - templates. */ -DEFTREECODE (MODOP_EXPR, "modop_expr", 'e', 3) -DEFTREECODE (CAST_EXPR, "cast_expr", '1', 1) -DEFTREECODE (REINTERPRET_CAST_EXPR, "reinterpret_cast_expr", '1', 1) -DEFTREECODE (CONST_CAST_EXPR, "const_cast_expr", '1', 1) -DEFTREECODE (STATIC_CAST_EXPR, "static_cast_expr", '1', 1) -DEFTREECODE (DYNAMIC_CAST_EXPR, "dynamic_cast_expr", '1', 1) -DEFTREECODE (SIZEOF_EXPR, "sizeof_expr", '1', 1) -DEFTREECODE (ALIGNOF_EXPR, "alignof_expr", '1', 1) -DEFTREECODE (ARROW_EXPR, "arrow_expr", 'e', 1) -DEFTREECODE (DOTSTAR_EXPR, "dotstar_expr", 'e', 2) -DEFTREECODE (TYPEID_EXPR, "typeid_expr", 'e', 1) - -DEFTREECODE (EXPR_STMT, "expr_stmt", 'e', 1) -DEFTREECODE (COMPOUND_STMT, "compound_stmt", 'e', 1) -DEFTREECODE (DECL_STMT, "decl_stmt", 'e', 3) -DEFTREECODE (IF_STMT, "if_stmt", 'e', 3) -DEFTREECODE (FOR_STMT, "for_stmt", 'e', 4) -DEFTREECODE (WHILE_STMT, "while_stmt", 'e', 2) -DEFTREECODE (DO_STMT, "do_stmt", 'e', 2) -DEFTREECODE (RETURN_STMT, "return_stmt", 'e', 1) -DEFTREECODE (BREAK_STMT, "break_stmt", 'e', 0) -DEFTREECODE (CONTINUE_STMT, "continue_stmt", 'e', 0) -DEFTREECODE (SWITCH_STMT, "switch_stmt", 'e', 2) -DEFTREECODE (GOTO_STMT, "goto_stmt", 'e', 1) -DEFTREECODE (ASM_STMT, "asm_stmt", 'e', 5) - -DEFTREECODE (CTOR_INITIALIZER, "ctor_initializer", 'e', 2) -DEFTREECODE (CASE_LABEL, "case_label", 'e', 2) -DEFTREECODE (RETURN_INIT, "return_init", 'e', 2) -DEFTREECODE (TRY_BLOCK, "try_stmt", 'e', 2) -DEFTREECODE (HANDLER, "catch_stmt", 'e', 2) - -DEFTREECODE (TAG_DEFN, "tag_defn", 'e', 0) - -/* And some codes for expressing conversions for overload resolution. */ - -DEFTREECODE (IDENTITY_CONV, "identity_conv", 'e', 1) -DEFTREECODE (LVALUE_CONV, "lvalue_conv", 'e', 1) -DEFTREECODE (QUAL_CONV, "qual_conv", 'e', 1) -DEFTREECODE (STD_CONV, "std_conv", 'e', 1) -DEFTREECODE (PTR_CONV, "ptr_conv", 'e', 1) -DEFTREECODE (PMEM_CONV, "pmem_conv", 'e', 1) -DEFTREECODE (BASE_CONV, "base_conv", 'e', 1) -DEFTREECODE (REF_BIND, "ref_bind", 'e', 1) -DEFTREECODE (USER_CONV, "user_conv", 'e', 2) -DEFTREECODE (AMBIG_CONV, "ambig_conv", 'e', 1) -DEFTREECODE (RVALUE_CONV, "rvalue_conv", 'e', 1) - -/* -Local variables: -mode:c -End: -*/ diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h deleted file mode 100755 index 3035a89..0000000 --- a/gcc/cp/cp-tree.h +++ /dev/null @@ -1,3441 +0,0 @@ -/* Definitions for C++ parsing and type checking. - Copyright (C) 1987, 92-97, 1998, 1999 Free Software Foundation, Inc. - Hacked by Michael Tiemann (tiemann@cygnus.com) - -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 -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#ifndef _CP_TREE_H -#define _CP_TREE_H - -/* Usage of TREE_LANG_FLAG_?: - 0: TREE_NONLOCAL_FLAG (in TREE_LIST or _TYPE). - BINFO_MARKED (BINFO nodes). - COMPOUND_STMT_NO_SCOPE (in COMPOUND_STMT). - NEW_EXPR_USE_GLOBAL (in NEW_EXPR). - DELETE_EXPR_USE_GLOBAL (in DELETE_EXPR). - LOOKUP_EXPR_GLOBAL (in LOOKUP_EXPR). - TREE_NEGATED_INT (in INTEGER_CST). - IDENTIFIER_MARKED (used by search routines). - LOCAL_BINDING_P (in CPLUS_BINDING) - 1: IDENTIFIER_VIRTUAL_P. - TI_PENDING_TEMPLATE_FLAG. - TEMPLATE_PARMS_FOR_INLINE. - DELETE_EXPR_USE_VEC (in DELETE_EXPR). - (TREE_CALLS_NEW) (in _EXPR or _REF) (commented-out). - TYPE_USES_COMPLEX_INHERITANCE (in _TYPE). - C_DECLARED_LABEL_FLAG. - 2: IDENTIFIER_OPNAME_P. - BINFO_VBASE_MARKED. - BINFO_FIELDS_MARKED. - TYPE_VIRTUAL_P. - 3: TYPE_USES_VIRTUAL_BASECLASSES (in a class TYPE). - BINFO_VTABLE_PATH_MARKED. - BINFO_PUSHDECLS_MARKED. - (TREE_REFERENCE_EXPR) (in NON_LVALUE_EXPR) (commented-out). - 4: BINFO_NEW_VTABLE_MARKED. - TREE_HAS_CONSTRUCTOR (in INDIRECT_REF, SAVE_EXPR, CONSTRUCTOR, - or FIELD_DECL). - 5: Not used. - 6: Not used. - - Usage of TYPE_LANG_FLAG_?: - 0: C_TYPE_FIELDS_READONLY (in RECORD_TYPE or UNION_TYPE). - 1: TYPE_HAS_CONSTRUCTOR. - 2: TYPE_HAS_DESTRUCTOR. - 3: TYPE_FOR_JAVA. - 4: TYPE_NEEDS_DESTRUCTOR. - 5: IS_AGGR_TYPE. - 6: TYPE_BUILT_IN. - - Usage of DECL_LANG_FLAG_?: - 0: DECL_ERROR_REPORTED (in VAR_DECL). - DECL_TEMPLATE_PARM_P (in CONST_DECL, TYPE_DECL, or TEMPLATE_DECL) - 1: C_TYPEDEF_EXPLICITLY_SIGNED (in TYPE_DECL). - DECL_TEMPLATE_INSTANTIATED (in a VAR_DECL or a FUNCTION_DECL) - 2: DECL_THIS_EXTERN (in VAR_DECL or FUNCTION_DECL). - 3: DECL_IN_AGGR_P. - 4: DECL_MAYBE_TEMPLATE. - 5: DECL_INTERFACE_KNOWN. - 6: DECL_THIS_STATIC (in VAR_DECL or FUNCTION_DECL). - 7: DECL_DEAD_FOR_LOCAL (in VAR_DECL). - - Usage of language-independent fields in a language-dependent manner: - - TYPE_ALIAS_SET - This field is used by TYPENAME_TYPEs, TEMPLATE_TYPE_PARMs, and so - forth as a substitute for the mark bits provided in `lang_type'. - At present, only the six low-order bits are used. - - TYPE_BINFO - For an ENUMERAL_TYPE, this is ENUM_TEMPLATE_INFO. - For a TYPENAME_TYPE, this is TYPENAME_TYPE_FULLNAME. - For a TEMPLATE_TEMPLATE_PARM, this is - TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO. -*/ - -/* Language-dependent contents of an identifier. */ - -struct lang_identifier -{ - struct tree_identifier ignore; - tree namespace_bindings; - tree bindings; - tree class_value; - tree class_template_info; - struct lang_id2 *x; -}; - -struct lang_id2 -{ - tree label_value, implicit_decl; - tree type_desc, as_list, error_locus; -}; - -typedef struct -{ - tree t; - int new_type_flag; -} flagged_type_tree; - -typedef struct -{ - char common[sizeof (struct tree_common)]; - struct rtx_def *rtl; /* Unused, but required to match up with what - the middle-end expects. */ - HOST_WIDE_INT index; - HOST_WIDE_INT level; - HOST_WIDE_INT orig_level; - tree decl; -} template_parm_index; - -typedef struct ptrmem_cst -{ - char common[sizeof (struct tree_common)]; - tree member; -}* ptrmem_cst_t; - -/* Nonzero if this binding is for a local scope, as opposed to a class - or namespace scope. */ -#define LOCAL_BINDING_P(NODE) TREE_LANG_FLAG_0(NODE) - -/* For a binding between a name and an entity at a non-local scope, - defines the scope where the binding is declared. (Either a class - _TYPE node, or a NAMESPACE_DECL.) This macro should be used only - for namespace-level bindings; on the IDENTIFIER_BINDING list - BINDING_LEVEL is used instead. */ -#define BINDING_SCOPE(NODE) (((struct tree_binding*)NODE)->scope.scope) - -/* This is the declaration bound to the name. Possible values: - variable, overloaded function, namespace, template, enumerator. */ -#define BINDING_VALUE(NODE) (((struct tree_binding*)NODE)->value) - -/* If name is bound to a type, this is the type (struct, union, enum). */ -#define BINDING_TYPE(NODE) TREE_TYPE(NODE) - -#define IDENTIFIER_GLOBAL_VALUE(NODE) \ - namespace_binding (NODE, global_namespace) -#define SET_IDENTIFIER_GLOBAL_VALUE(NODE, VAL) \ - set_namespace_binding (NODE, global_namespace, VAL) -#define IDENTIFIER_NAMESPACE_VALUE(NODE) \ - namespace_binding (NODE, current_namespace) -#define SET_IDENTIFIER_NAMESPACE_VALUE(NODE, VAL) \ - set_namespace_binding (NODE, current_namespace, VAL) - -struct tree_binding -{ - char common[sizeof (struct tree_common)]; - union { - tree scope; - struct binding_level *level; - } scope; - tree value; -}; - -/* The overloaded FUNCTION_DECL. */ -#define OVL_FUNCTION(NODE) (((struct tree_overload*)NODE)->function) -#define OVL_CHAIN(NODE) TREE_CHAIN(NODE) -/* Polymorphic access to FUNCTION and CHAIN. */ -#define OVL_CURRENT(NODE) \ - ((TREE_CODE(NODE)==OVERLOAD) ? OVL_FUNCTION(NODE) : NODE) -#define OVL_NEXT(NODE) \ - ((TREE_CODE(NODE)==OVERLOAD) ? TREE_CHAIN(NODE) : NULL_TREE) -/* If set, this was imported in a using declaration. - This is not to confuse with being used somewhere, which - is not important for this node. */ -#define OVL_USED(NODE) TREE_USED(NODE) - -struct tree_overload -{ - char common[sizeof (struct tree_common)]; - tree function; -}; - -#define WRAPPER_PTR(NODE) (((struct tree_wrapper*)NODE)->u.ptr) -#define WRAPPER_INT(NODE) (((struct tree_wrapper*)NODE)->u.i) - -struct tree_wrapper -{ - char common[sizeof (struct tree_common)]; - union { - void *ptr; - int i; - } u; -}; - -#define SRCLOC_FILE(NODE) (((struct tree_srcloc*)NODE)->filename) -#define SRCLOC_LINE(NODE) (((struct tree_srcloc*)NODE)->linenum) -struct tree_srcloc -{ - char common[sizeof (struct tree_common)]; - char *filename; - int linenum; -}; - -/* To identify to the debug emitters if it should pay attention to the - flag `-Wtemplate-debugging'. */ -#define HAVE_TEMPLATES 1 - -/* Macros for access to language-specific slots in an identifier. */ - -#define IDENTIFIER_NAMESPACE_BINDINGS(NODE) \ - (((struct lang_identifier *)(NODE))->namespace_bindings) -#define IDENTIFIER_TEMPLATE(NODE) \ - (((struct lang_identifier *)(NODE))->class_template_info) - -/* The IDENTIFIER_BINDING is the innermost CPLUS_BINDING for the - identifier. It's TREE_CHAIN is the next outermost binding. Each - BINDING_VALUE is a DECL for the associated declaration. Thus, - name lookup consists simply of pulling off the node at the front - of the list (modulo oddities for looking up the names of types, - and such.) You can use BINDING_SCOPE or BINDING_LEVEL to - determine the scope that bound the name. */ -#define IDENTIFIER_BINDING(NODE) \ - (((struct lang_identifier*) (NODE))->bindings) - -/* The IDENTIFIER_VALUE is the value of the IDENTIFIER_BINDING, or - NULL_TREE if there is no binding. */ -#define IDENTIFIER_VALUE(NODE) \ - (IDENTIFIER_BINDING (NODE) \ - ? BINDING_VALUE (IDENTIFIER_BINDING (NODE)) \ - : NULL_TREE) - -/* If we are currently in class scope, then IDENTIFIER_CLASS_VALUE - indicates the class-scoped binding of NODE. This is just a pointer - to the BINDING_VALUE of one of the bindings in the - IDENTIFIER_BINDINGs list, so any time that this is set so is - IDENTIFIER_BINDING. */ -#define IDENTIFIER_CLASS_VALUE(NODE) \ - (((struct lang_identifier *) (NODE))->class_value) - -/* The amount of time used by the file whose special "time identifier" - is NODE, represented as an INTEGER_CST. See get_time_identifier. */ -#define TIME_IDENTIFIER_TIME(NODE) IDENTIFIER_BINDING(NODE) - -/* For a "time identifier" this is a INTEGER_CST. The - TREE_INT_CST_LOW is 1 if the corresponding file is "interface only". - The TRE_INT_CST_HIGH is 1 if it is "interface unknown". */ -#define TIME_IDENTIFIER_FILEINFO(NODE) IDENTIFIER_CLASS_VALUE (NODE) - -/* TREE_TYPE only indicates on local and class scope the current - type. For namespace scope, the presence of a type in any namespace - is indicated with global_type_node, and the real type behind must - be found through lookup. */ -#define IDENTIFIER_TYPE_VALUE(NODE) (identifier_type_value(NODE)) -#define REAL_IDENTIFIER_TYPE_VALUE(NODE) (TREE_TYPE (NODE)) -#define SET_IDENTIFIER_TYPE_VALUE(NODE,TYPE) (TREE_TYPE (NODE) = TYPE) -#define IDENTIFIER_HAS_TYPE_VALUE(NODE) (IDENTIFIER_TYPE_VALUE (NODE) ? 1 : 0) - -#define LANG_ID_FIELD(NAME,NODE) \ - (((struct lang_identifier *)(NODE))->x \ - ? ((struct lang_identifier *)(NODE))->x->NAME : 0) -#define SET_LANG_ID(NODE,VALUE,NAME) \ - (((struct lang_identifier *)(NODE))->x == 0 \ - ? ((struct lang_identifier *)(NODE))->x \ - = (struct lang_id2 *)perm_calloc (1, sizeof (struct lang_id2)) : 0, \ - ((struct lang_identifier *)(NODE))->x->NAME = (VALUE)) - -#define IDENTIFIER_LABEL_VALUE(NODE) LANG_ID_FIELD(label_value, NODE) -#define SET_IDENTIFIER_LABEL_VALUE(NODE,VALUE) \ - SET_LANG_ID(NODE, VALUE, label_value) - -#define IDENTIFIER_IMPLICIT_DECL(NODE) LANG_ID_FIELD(implicit_decl, NODE) -#define SET_IDENTIFIER_IMPLICIT_DECL(NODE,VALUE) \ - SET_LANG_ID(NODE, VALUE, implicit_decl) - -#define IDENTIFIER_AS_DESC(NODE) LANG_ID_FIELD(type_desc, NODE) -#define SET_IDENTIFIER_AS_DESC(NODE,DESC) \ - SET_LANG_ID(NODE, DESC, type_desc) - -#define IDENTIFIER_AS_LIST(NODE) LANG_ID_FIELD(as_list, NODE) -#define SET_IDENTIFIER_AS_LIST(NODE,LIST) \ - SET_LANG_ID(NODE, LIST, as_list) - -#define IDENTIFIER_ERROR_LOCUS(NODE) LANG_ID_FIELD(error_locus, NODE) -#define SET_IDENTIFIER_ERROR_LOCUS(NODE,VALUE) \ - SET_LANG_ID(NODE, VALUE, error_locus) - - -#define IDENTIFIER_VIRTUAL_P(NODE) TREE_LANG_FLAG_1(NODE) - -/* Nonzero if this identifier is the prefix for a mangled C++ operator name. */ -#define IDENTIFIER_OPNAME_P(NODE) TREE_LANG_FLAG_2(NODE) - -/* Nonzero if this identifier is the name of a type-conversion - operator. */ -#define IDENTIFIER_TYPENAME_P(NODE) \ - (! strncmp (IDENTIFIER_POINTER (NODE), \ - OPERATOR_TYPENAME_FORMAT, \ - strlen (OPERATOR_TYPENAME_FORMAT))) - -/* Nonzero means reject anything that ANSI standard C forbids. */ -extern int pedantic; - -/* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is read-only. */ -#define C_TYPE_FIELDS_READONLY(type) TYPE_LANG_FLAG_0 (type) - -/* Record in each node resulting from a binary operator - what operator was specified for it. */ -#define C_EXP_ORIGINAL_CODE(exp) ((enum tree_code) TREE_COMPLEXITY (exp)) - -/* Store a value in that field. */ -#define C_SET_EXP_ORIGINAL_CODE(exp, code) \ - (TREE_COMPLEXITY (exp) = (int)(code)) - -/* If non-zero, a VAR_DECL whose cleanup will cause a throw to the - next exception handler. */ -extern tree exception_throw_decl; - -extern tree double_type_node, long_double_type_node, float_type_node; -extern tree char_type_node, unsigned_char_type_node, signed_char_type_node; -extern tree ptrdiff_type_node; - -extern tree short_integer_type_node, short_unsigned_type_node; -extern tree long_integer_type_node, long_unsigned_type_node; -extern tree long_long_integer_type_node, long_long_unsigned_type_node; -extern tree unsigned_type_node; -extern tree string_type_node, char_array_type_node, int_array_type_node; -extern tree wchar_array_type_node; -extern tree wchar_type_node, signed_wchar_type_node, unsigned_wchar_type_node; - -extern tree complex_integer_type_node; -extern tree complex_float_type_node; -extern tree complex_double_type_node; -extern tree complex_long_double_type_node; - -extern tree intQI_type_node, unsigned_intQI_type_node; -extern tree intHI_type_node, unsigned_intHI_type_node; -extern tree intSI_type_node, unsigned_intSI_type_node; -extern tree intDI_type_node, unsigned_intDI_type_node; -#if HOST_BITS_PER_WIDE_INT >= 64 -extern tree intTI_type_node, unsigned_intTI_type_node; -#endif - -extern tree java_byte_type_node; -extern tree java_short_type_node; -extern tree java_int_type_node; -extern tree java_long_type_node; -extern tree java_float_type_node; -extern tree java_double_type_node; -extern tree java_char_type_node; -extern tree java_boolean_type_node; - -extern int current_function_returns_value; -extern int current_function_returns_null; -extern tree current_function_return_value; - -extern tree current_namespace; -extern tree global_namespace; - -extern tree ridpointers[]; -extern tree ansi_opname[]; -extern tree ansi_assopname[]; - -/* Nonzero means `$' can be in an identifier. */ - -extern int dollars_in_ident; - -/* Nonzero means allow type mismatches in conditional expressions; - just make their values `void'. */ - -extern int flag_cond_mismatch; - -/* Nonzero means don't recognize the keyword `asm'. */ - -extern int flag_no_asm; - -/* For cross referencing. */ - -extern int flag_gnu_xref; - -/* For environments where you can use GNU binutils (as, ld in particular). */ - -extern int flag_gnu_binutils; - -/* Nonzero means ignore `#ident' directives. */ - -extern int flag_no_ident; - -/* Nonzero means warn about implicit declarations. */ - -extern int warn_implicit; - -/* Nonzero means warn about usage of long long when `-pedantic'. */ - -extern int warn_long_long; - -/* Nonzero means warn when all ctors or dtors are private, and the class - has no friends. */ - -extern int warn_ctor_dtor_privacy; - -/* Nonzero means warn about function definitions that default the return type - or that use a null return and have a return-type other than void. */ - -extern int warn_return_type; - -/* Nonzero means give string constants the type `const char *', as mandated - by the standard. */ - -extern int flag_const_strings; - -/* Nonzero means warn about deprecated conversion from string constant to - `char *'. */ - -extern int warn_write_strings; - -/* Nonzero means warn about sizeof(function) or addition/subtraction - of function pointers. */ - -extern int warn_pointer_arith; - -/* Nonzero means warn about suggesting putting in ()'s. */ - -extern int warn_parentheses; - -/* Nonzero means warn about multiple (redundant) decls for the same single - variable or function. */ - -extern int warn_redundant_decls; - -/* Warn if initializer is not completely bracketed. */ - -extern int warn_missing_braces; - -/* Warn about comparison of signed and unsigned values. */ - -extern int warn_sign_compare; - -/* Warn about a subscript that has type char. */ - -extern int warn_char_subscripts; - -/* Nonzero means warn about pointer casts that can drop a type qualifier - from the pointer target type. */ - -extern int warn_cast_qual; - -/* Warn about *printf or *scanf format/argument anomalies. */ - -extern int warn_format; - -/* Nonzero means warn about non virtual destructors in classes that have - virtual functions. */ - -extern int warn_nonvdtor; - -/* Non-zero means warn when we convert a pointer to member function - into a pointer to (void or function). */ - -extern int warn_pmf2ptr; - -/* Nonzero means warn about violation of some Effective C++ style rules. */ - -extern int warn_ecpp; - -/* Nonzero means warn where overload resolution chooses a promotion from - unsigned to signed over a conversion to an unsigned of the same size. */ - -extern int warn_sign_promo; - -/* Non-zero means warn when a function is declared extern and later inline. */ - -extern int warn_extern_inline; - -/* Non-zero means warn when an old-style cast is used. */ - -extern int warn_old_style_cast; - -/* Nonzero means to treat bitfields as unsigned unless they say `signed'. */ - -extern int flag_signed_bitfields; - -/* 3 means write out only virtuals function tables `defined' - in this implementation file. - 2 means write out only specific virtual function tables - and give them (C) public access. - 1 means write out virtual function tables and give them - (C) public access. - 0 means write out virtual function tables and give them - (C) static access (default). - -1 means declare virtual function tables extern. */ - -extern int write_virtuals; - -/* True for more efficient but incompatible (not fully tested) - vtable implementation (using thunks). - 0 is old behavior; 1 is new behavior. */ -extern int flag_vtable_thunks; - -/* INTERFACE_ONLY nonzero means that we are in an "interface" - section of the compiler. INTERFACE_UNKNOWN nonzero means - we cannot trust the value of INTERFACE_ONLY. If INTERFACE_UNKNOWN - is zero and INTERFACE_ONLY is zero, it means that we are responsible - for exporting definitions that others might need. */ -extern int interface_only, interface_unknown; - -/* Nonzero means we should attempt to elide constructors when possible. */ - -extern int flag_elide_constructors; - -/* Nonzero means enable obscure ANSI features and disable GNU extensions - that might cause ANSI-compliant code to be miscompiled. */ - -extern int flag_ansi; - -/* Nonzero means recognize and handle signature language constructs. */ - -extern int flag_handle_signatures; - -/* Nonzero means that member functions defined in class scope are - inline by default. */ - -extern int flag_default_inline; - -/* The name-mangling scheme to use. Versions of gcc before 2.8 use - version 0. */ -extern int name_mangling_version; - -/* Nonzero means that guiding declarations are allowed. */ -extern int flag_guiding_decls; - -/* Nonzero if squashed mangling is to be performed. - This uses the B and K codes to reference previously seen class types - and class qualifiers. */ -extern int flag_do_squangling; - -/* Nonzero if we want to issue diagnostics that the standard says are not - required. */ -extern int flag_optional_diags; - -/* Nonzero means do not consider empty argument prototype to mean function - takes no arguments. */ -extern int flag_strict_prototype; - -/* Nonzero means output .vtable_{entry,inherit} for use in doing vtable gc. */ -extern int flag_vtable_gc; - -/* Nonzero means make the default pedwarns warnings instead of errors. - The value of this flag is ignored if -pedantic is specified. */ -extern int flag_permissive; - -/* C++ language-specific tree codes. */ -#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) SYM, -enum cplus_tree_code { - __DUMMY = LAST_AND_UNUSED_TREE_CODE, -#include "cp-tree.def" - LAST_CPLUS_TREE_CODE -}; -#undef DEFTREECODE - -enum languages { lang_c, lang_cplusplus, lang_java }; - -/* Macros to make error reporting functions' lives easier. */ -#define TYPE_IDENTIFIER(NODE) (DECL_NAME (TYPE_NAME (NODE))) -#define TYPE_NAME_STRING(NODE) (IDENTIFIER_POINTER (TYPE_IDENTIFIER (NODE))) -#define TYPE_NAME_LENGTH(NODE) (IDENTIFIER_LENGTH (TYPE_IDENTIFIER (NODE))) - -#define TYPE_ASSEMBLER_NAME_STRING(NODE) (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (TYPE_NAME (NODE)))) -#define TYPE_ASSEMBLER_NAME_LENGTH(NODE) (IDENTIFIER_LENGTH (DECL_ASSEMBLER_NAME (TYPE_NAME (NODE)))) - -/* The _DECL for this _TYPE. */ -#define TYPE_MAIN_DECL(NODE) (TYPE_STUB_DECL (TYPE_MAIN_VARIANT (NODE))) - -/* Nonzero if T is a class (or struct or union) type. Also nonzero - for template type parameters and typename types. Despite its name, - this macro has nothing to do with the definition of aggregate given - in the standard. Think of this macro as MAYBE_CLASS_TYPE_P. */ -#define IS_AGGR_TYPE(t) \ - (TREE_CODE (t) == TEMPLATE_TYPE_PARM \ - || TREE_CODE (t) == TYPENAME_TYPE \ - || TREE_CODE (t) == TYPEOF_TYPE \ - || TYPE_LANG_FLAG_5 (t)) - -/* Set IS_AGGR_TYPE for T to VAL. T must be a class, struct, or - union type. */ -#define SET_IS_AGGR_TYPE(T, VAL) \ - (TYPE_LANG_FLAG_5 (T) = (VAL)) - -/* Nonzero if T is a class type. Zero for template type parameters, - typename types, and so forth. */ -#define CLASS_TYPE_P(t) \ - (IS_AGGR_TYPE_CODE (TREE_CODE (t)) && IS_AGGR_TYPE (t)) - -#define IS_AGGR_TYPE_CODE(t) (t == RECORD_TYPE || t == UNION_TYPE) -#define IS_AGGR_TYPE_2(TYPE1,TYPE2) \ - (TREE_CODE (TYPE1) == TREE_CODE (TYPE2) \ - && IS_AGGR_TYPE (TYPE1)&IS_AGGR_TYPE (TYPE2)) -#define IS_OVERLOAD_TYPE(t) \ - (IS_AGGR_TYPE (t) || TREE_CODE (t) == ENUMERAL_TYPE) - -/* In a *_TYPE, nonzero means a built-in type. */ -#define TYPE_BUILT_IN(NODE) TYPE_LANG_FLAG_6(NODE) - -/* True if this a "Java" type, defined in 'extern "Java"'. */ -#define TYPE_FOR_JAVA(NODE) TYPE_LANG_FLAG_3(NODE) - -/* The type qualifiers for this type, including the qualifiers on the - elements for an array type. */ -#define CP_TYPE_QUALS(NODE) \ - ((TREE_CODE (NODE) != ARRAY_TYPE) \ - ? TYPE_QUALS (NODE) : cp_type_quals (NODE)) - -/* Nonzero if this type is const-qualified. */ -#define CP_TYPE_CONST_P(NODE) \ - ((CP_TYPE_QUALS (NODE) & TYPE_QUAL_CONST) != 0) - -/* Nonzero if this type is volatile-qualified. */ -#define CP_TYPE_VOLATILE_P(NODE) \ - ((CP_TYPE_QUALS (NODE) & TYPE_QUAL_VOLATILE) != 0) - -/* Nonzero if this type is restrict-qualified. */ -#define CP_TYPE_RESTRICT_P(NODE) \ - ((CP_TYPE_QUALS (NODE) & TYPE_QUAL_RESTRICT) != 0) - -/* Nonzero if this type is const-qualified, but not - volatile-qualified. Other qualifiers are ignored. This macro is - used to test whether or not it is OK to bind an rvalue to a - reference. */ -#define CP_TYPE_CONST_NON_VOLATILE_P(NODE) \ - ((CP_TYPE_QUALS (NODE) & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE)) \ - == TYPE_QUAL_CONST) - -#define DELTA_FROM_VTABLE_ENTRY(ENTRY) \ - (!flag_vtable_thunks ? \ - TREE_VALUE (CONSTRUCTOR_ELTS (ENTRY)) \ - : TREE_CODE (TREE_OPERAND ((ENTRY), 0)) != THUNK_DECL ? integer_zero_node \ - : build_int_2 (THUNK_DELTA (TREE_OPERAND ((ENTRY), 0)), 0)) - -/* Virtual function addresses can be gotten from a virtual function - table entry using this macro. */ -#define FNADDR_FROM_VTABLE_ENTRY(ENTRY) \ - (!flag_vtable_thunks ? \ - TREE_VALUE (TREE_CHAIN (TREE_CHAIN (CONSTRUCTOR_ELTS (ENTRY)))) \ - : TREE_CODE (TREE_OPERAND ((ENTRY), 0)) != THUNK_DECL ? (ENTRY) \ - : DECL_INITIAL (TREE_OPERAND ((ENTRY), 0))) -#define SET_FNADDR_FROM_VTABLE_ENTRY(ENTRY,VALUE) \ - (TREE_VALUE (TREE_CHAIN (TREE_CHAIN (CONSTRUCTOR_ELTS (ENTRY)))) = (VALUE)) -#define FUNCTION_ARG_CHAIN(NODE) (TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (NODE)))) -#define PROMOTES_TO_AGGR_TYPE(NODE,CODE) \ - (((CODE) == TREE_CODE (NODE) \ - && IS_AGGR_TYPE (TREE_TYPE (NODE))) \ - || IS_AGGR_TYPE (NODE)) - -/* Nonzero iff TYPE is uniquely derived from PARENT. Under MI, PARENT can - be an ambiguous base class of TYPE, and this macro will be false. */ -#define UNIQUELY_DERIVED_FROM_P(PARENT, TYPE) (get_base_distance (PARENT, TYPE, 0, (tree *)0) >= 0) -#define ACCESSIBLY_DERIVED_FROM_P(PARENT, TYPE) (get_base_distance (PARENT, TYPE, -1, (tree *)0) >= 0) -#define ACCESSIBLY_UNIQUELY_DERIVED_P(PARENT, TYPE) (get_base_distance (PARENT, TYPE, 1, (tree *)0) >= 0) -#define DERIVED_FROM_P(PARENT, TYPE) (get_base_distance (PARENT, TYPE, 0, (tree *)0) != -1) - -/* This structure provides additional information above and beyond - what is provide in the ordinary tree_type. In the past, we used it - for the types of class types, template parameters types, typename - types, and so forth. However, there can be many (tens to hundreds - of thousands) of template parameter types in a compilation, and - there's no need for this additional information in that case. - Therefore, we now use this data structure only for class types. - - In the past, it was thought that there would be relatively few - class types. However, in the presence of heavy use of templates, - many (i.e., thousands) of classes can easily be generated. - Therefore, we should endeavor to keep the size of this structure to - a minimum. */ -struct lang_type -{ - struct - { - unsigned has_type_conversion : 1; - unsigned has_init_ref : 1; - unsigned has_assignment : 1; - unsigned has_default_ctor : 1; - unsigned uses_multiple_inheritance : 1; - unsigned const_needs_init : 1; - unsigned ref_needs_init : 1; - unsigned has_const_assign_ref : 1; - - unsigned has_nonpublic_ctor : 2; - unsigned has_nonpublic_assign_ref : 2; - unsigned vtable_needs_writing : 1; - unsigned has_assign_ref : 1; - unsigned gets_new : 2; - - unsigned gets_delete : 2; - unsigned has_call_overloaded : 1; - unsigned has_array_ref_overloaded : 1; - unsigned has_arrow_overloaded : 1; - unsigned interface_only : 1; - unsigned interface_unknown : 1; - unsigned needs_virtual_reinit : 1; - - unsigned marks: 6; - unsigned vec_delete_takes_size : 1; - unsigned declared_class : 1; - - unsigned being_defined : 1; - unsigned redefined : 1; - unsigned debug_requested : 1; - unsigned use_template : 2; - unsigned got_semicolon : 1; - unsigned ptrmemfunc_flag : 1; - unsigned is_signature : 1; - - unsigned is_signature_pointer : 1; - unsigned is_signature_reference : 1; - unsigned has_opaque_typedecls : 1; - unsigned sigtable_has_been_generated : 1; - unsigned was_anonymous : 1; - unsigned has_real_assignment : 1; - unsigned has_real_assign_ref : 1; - unsigned has_const_init_ref : 1; - - unsigned has_complex_init_ref : 1; - unsigned has_complex_assign_ref : 1; - unsigned has_abstract_assign_ref : 1; - unsigned non_aggregate : 1; - unsigned is_partial_instantiation : 1; - unsigned has_mutable : 1; - - /* The MIPS compiler gets it wrong if this struct also - does not fill out to a multiple of 4 bytes. Add a - member `dummy' with new bits if you go over the edge. */ - unsigned dummy : 10; - } type_flags; - - int n_ancestors; - int n_vancestors; - int vsize; - int max_depth; - int vfield_parent; - - union tree_node *baselink_vec; - union tree_node *vfields; - union tree_node *vbases; - - union tree_node *tags; - - union tree_node *search_slot; - - unsigned char align; - /* Room for another three unsigned chars. */ - - union tree_node *size; - - union tree_node *base_init_list; - union tree_node *abstract_virtuals; - union tree_node *as_list; - union tree_node *id_as_list; - union tree_node *binfo_as_list; - union tree_node *friend_classes; - - union tree_node *rtti; - - union tree_node *methods; - - union tree_node *signature; - union tree_node *signature_pointer_to; - union tree_node *signature_reference_to; - - union tree_node *template_info; -}; - -/* Indicates whether or not (and how) a template was expanded for this class. - 0=no information yet/non-template class - 1=implicit template instantiation - 2=explicit template specialization - 3=explicit template instantiation */ -#define CLASSTYPE_USE_TEMPLATE(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.use_template) - -/* Fields used for storing information before the class is defined. - After the class is defined, these fields hold other information. */ - -/* List of friends which were defined inline in this class definition. */ -#define CLASSTYPE_INLINE_FRIENDS(NODE) (TYPE_NONCOPIED_PARTS (NODE)) - -/* Nonzero for _CLASSTYPE means that the _CLASSTYPE either has - a special meaning for the assignment operator ("operator="), - or one of its fields (or base members) has a special meaning - defined. */ -#define TYPE_HAS_ASSIGNMENT(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_assignment) -#define TYPE_HAS_REAL_ASSIGNMENT(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_real_assignment) - -/* Nonzero for _CLASSTYPE means that operator new and delete are defined, - respectively. */ -#define TYPE_GETS_NEW(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.gets_new) -#define TYPE_GETS_DELETE(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.gets_delete) -#define TYPE_GETS_REG_DELETE(NODE) (TYPE_GETS_DELETE (NODE) & 1) - -/* Nonzero for _CLASSTYPE means that operator vec delete is defined and - takes the optional size_t argument. */ -#define TYPE_VEC_DELETE_TAKES_SIZE(NODE) \ - (TYPE_LANG_SPECIFIC(NODE)->type_flags.vec_delete_takes_size) -#define TYPE_VEC_NEW_USES_COOKIE(NODE) \ - (TYPE_NEEDS_DESTRUCTOR (NODE) \ - || (TYPE_LANG_SPECIFIC (NODE) && TYPE_VEC_DELETE_TAKES_SIZE (NODE))) - -/* Nonzero for TREE_LIST or _TYPE node means that this node is class-local. */ -#define TREE_NONLOCAL_FLAG(NODE) (TREE_LANG_FLAG_0 (NODE)) - -/* Nonzero means that this _CLASSTYPE node defines ways of converting - itself to other types. */ -#define TYPE_HAS_CONVERSION(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_type_conversion) - -/* Nonzero means that this _CLASSTYPE node overloads operator=(X&). */ -#define TYPE_HAS_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_assign_ref) -#define TYPE_HAS_CONST_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_const_assign_ref) - -/* Nonzero means that this _CLASSTYPE node has an X(X&) constructor. */ -#define TYPE_HAS_INIT_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_init_ref) -#define TYPE_HAS_CONST_INIT_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_const_init_ref) - -/* Nonzero means that this type is being defined. I.e., the left brace - starting the definition of this type has been seen. */ -#define TYPE_BEING_DEFINED(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.being_defined) -/* Nonzero means that this type has been redefined. In this case, if - convenient, don't reprocess any methods that appear in its redefinition. */ -#define TYPE_REDEFINED(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.redefined) - -/* Nonzero means that this type is a signature. */ -# define IS_SIGNATURE(NODE) (TYPE_LANG_SPECIFIC(NODE)?TYPE_LANG_SPECIFIC(NODE)->type_flags.is_signature:0) -# define SET_SIGNATURE(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.is_signature=1) -# define CLEAR_SIGNATURE(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.is_signature=0) - -/* Nonzero means that this type is a signature pointer type. */ -# define IS_SIGNATURE_POINTER(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.is_signature_pointer) - -/* Nonzero means that this type is a signature reference type. */ -# define IS_SIGNATURE_REFERENCE(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.is_signature_reference) - -/* Nonzero means that this signature contains opaque type declarations. */ -#define SIGNATURE_HAS_OPAQUE_TYPEDECLS(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_opaque_typedecls) - -/* Nonzero means that a signature table has been generated - for this signature. */ -#define SIGTABLE_HAS_BEEN_GENERATED(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.sigtable_has_been_generated) - -/* If NODE is a class, this is the signature type that contains NODE's - signature after it has been computed using sigof(). */ -#define CLASSTYPE_SIGNATURE(NODE) (TYPE_LANG_SPECIFIC(NODE)->signature) - -/* If NODE is a signature pointer or signature reference, this is the - signature type the pointer/reference points to. */ -#define SIGNATURE_TYPE(NODE) (TYPE_LANG_SPECIFIC(NODE)->signature) - -/* If NODE is a signature, this is a vector of all methods defined - in the signature or in its base types together with their default - implementations. */ -#define SIGNATURE_METHOD_VEC(NODE) (TYPE_LANG_SPECIFIC(NODE)->signature) - -/* If NODE is a signature, this is the _TYPE node that contains NODE's - signature pointer type. */ -#define SIGNATURE_POINTER_TO(NODE) (TYPE_LANG_SPECIFIC(NODE)->signature_pointer_to) - -/* If NODE is a signature, this is the _TYPE node that contains NODE's - signature reference type. */ -#define SIGNATURE_REFERENCE_TO(NODE) (TYPE_LANG_SPECIFIC(NODE)->signature_reference_to) - -/* The is the VAR_DECL that contains NODE's rtti. */ -#define CLASSTYPE_RTTI(NODE) (TYPE_LANG_SPECIFIC(NODE)->rtti) - -/* Nonzero means that this _CLASSTYPE node overloads operator(). */ -#define TYPE_OVERLOADS_CALL_EXPR(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_call_overloaded) - -/* Nonzero means that this _CLASSTYPE node overloads operator[]. */ -#define TYPE_OVERLOADS_ARRAY_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_array_ref_overloaded) - -/* Nonzero means that this _CLASSTYPE node overloads operator->. */ -#define TYPE_OVERLOADS_ARROW(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_arrow_overloaded) - -/* Nonzero means that this _CLASSTYPE (or one of its ancestors) uses - multiple inheritance. If this is 0 for the root of a type - hierarchy, then we can use more efficient search techniques. */ -#define TYPE_USES_MULTIPLE_INHERITANCE(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.uses_multiple_inheritance) - -/* Nonzero means that this _CLASSTYPE (or one of its ancestors) uses - virtual base classes. If this is 0 for the root of a type - hierarchy, then we can use more efficient search techniques. */ -#define TYPE_USES_VIRTUAL_BASECLASSES(NODE) (TREE_LANG_FLAG_3(NODE)) - -/* Vector member functions defined in this class. Each element is - either a FUNCTION_DECL, a TEMPLATE_DECL, or an OVERLOAD. The first - two elements are for constructors, and destructors, respectively. - Any user-defined conversion operators follow these. These are - followed by ordinary member functions. There may be empty entries - at the end of the vector. */ -#define CLASSTYPE_METHOD_VEC(NODE) (TYPE_LANG_SPECIFIC(NODE)->methods) - -/* The first type conversion operator in the class (the others can be - searched with TREE_CHAIN), or the first non-constructor function if - there are no type conversion operators. */ -#define CLASSTYPE_FIRST_CONVERSION(NODE) \ - TREE_VEC_LENGTH (CLASSTYPE_METHOD_VEC (NODE)) > 2 \ - ? TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (NODE), 2) \ - : NULL_TREE; - -/* Pointer from any member function to the head of the list of - member functions of the type that member function belongs to. */ -#define CLASSTYPE_BASELINK_VEC(NODE) (TYPE_LANG_SPECIFIC(NODE)->baselink_vec) - -/* Mark bits for depth-first and breath-first searches. */ - -/* Get the value of the Nth mark bit. */ -#define CLASSTYPE_MARKED_N(NODE, N) \ - (((CLASS_TYPE_P (NODE) ? TYPE_LANG_SPECIFIC (NODE)->type_flags.marks \ - : TYPE_ALIAS_SET (NODE)) & (1 << N)) != 0) - -/* Set the Nth mark bit. */ -#define SET_CLASSTYPE_MARKED_N(NODE, N) \ - (CLASS_TYPE_P (NODE) \ - ? (TYPE_LANG_SPECIFIC (NODE)->type_flags.marks |= (1 << (N))) \ - : (TYPE_ALIAS_SET (NODE) |= (1 << (N)))) - -/* Clear the Nth mark bit. */ -#define CLEAR_CLASSTYPE_MARKED_N(NODE, N) \ - (CLASS_TYPE_P (NODE) \ - ? (TYPE_LANG_SPECIFIC (NODE)->type_flags.marks &= ~(1 << (N))) \ - : (TYPE_ALIAS_SET (NODE) &= ~(1 << (N)))) - -/* Get the value of the mark bits. */ -#define CLASSTYPE_MARKED(NODE) CLASSTYPE_MARKED_N(NODE, 0) -#define CLASSTYPE_MARKED2(NODE) CLASSTYPE_MARKED_N(NODE, 1) -#define CLASSTYPE_MARKED3(NODE) CLASSTYPE_MARKED_N(NODE, 2) -#define CLASSTYPE_MARKED4(NODE) CLASSTYPE_MARKED_N(NODE, 3) -#define CLASSTYPE_MARKED5(NODE) CLASSTYPE_MARKED_N(NODE, 4) -#define CLASSTYPE_MARKED6(NODE) CLASSTYPE_MARKED_N(NODE, 5) - -/* Macros to modify the above flags */ -#define SET_CLASSTYPE_MARKED(NODE) SET_CLASSTYPE_MARKED_N(NODE, 0) -#define CLEAR_CLASSTYPE_MARKED(NODE) CLEAR_CLASSTYPE_MARKED_N(NODE, 0) -#define SET_CLASSTYPE_MARKED2(NODE) SET_CLASSTYPE_MARKED_N(NODE, 1) -#define CLEAR_CLASSTYPE_MARKED2(NODE) CLEAR_CLASSTYPE_MARKED_N(NODE, 1) -#define SET_CLASSTYPE_MARKED3(NODE) SET_CLASSTYPE_MARKED_N(NODE, 2) -#define CLEAR_CLASSTYPE_MARKED3(NODE) CLEAR_CLASSTYPE_MARKED_N(NODE, 2) -#define SET_CLASSTYPE_MARKED4(NODE) SET_CLASSTYPE_MARKED_N(NODE, 3) -#define CLEAR_CLASSTYPE_MARKED4(NODE) CLEAR_CLASSTYPE_MARKED_N(NODE, 3) -#define SET_CLASSTYPE_MARKED5(NODE) SET_CLASSTYPE_MARKED_N(NODE, 4) -#define CLEAR_CLASSTYPE_MARKED5(NODE) CLEAR_CLASSTYPE_MARKED_N(NODE, 4) -#define SET_CLASSTYPE_MARKED6(NODE) SET_CLASSTYPE_MARKED_N(NODE, 5) -#define CLEAR_CLASSTYPE_MARKED6(NODE) CLEAR_CLASSTYPE_MARKED_N(NODE, 5) - -/* A list of the nested tag-types (class, struct, union, or enum) - found within this class. The TREE_PURPOSE of each node is the name - of the type; the TREE_VALUE is the type itself. This list includes - nested member class templates. */ -#define CLASSTYPE_TAGS(NODE) (TYPE_LANG_SPECIFIC(NODE)->tags) - -/* If this class has any bases, this is the number of the base class from - which our VFIELD is based, -1 otherwise. If this class has no base - classes, this is not used. - In D : B1, B2, PARENT would be 0, if D's vtable came from B1, - 1, if D's vtable came from B2. */ -#define CLASSTYPE_VFIELD_PARENT(NODE) (TYPE_LANG_SPECIFIC(NODE)->vfield_parent) - -/* Remove when done merging. */ -#define CLASSTYPE_VFIELD(NODE) TYPE_VFIELD(NODE) - -/* The number of virtual functions defined for this - _CLASSTYPE node. */ -#define CLASSTYPE_VSIZE(NODE) (TYPE_LANG_SPECIFIC(NODE)->vsize) -/* The virtual base classes that this type uses. */ -#define CLASSTYPE_VBASECLASSES(NODE) (TYPE_LANG_SPECIFIC(NODE)->vbases) -/* The virtual function pointer fields that this type contains. */ -#define CLASSTYPE_VFIELDS(NODE) (TYPE_LANG_SPECIFIC(NODE)->vfields) - -/* Number of baseclasses defined for this type. - 0 means no base classes. */ -#define CLASSTYPE_N_BASECLASSES(NODE) \ - (TYPE_BINFO_BASETYPES (NODE) ? TREE_VEC_LENGTH (TYPE_BINFO_BASETYPES(NODE)) : 0) - -/* Memoize the number of super classes (base classes) that this node - has. That way we can know immediately (albeit conservatively how - large a multiple-inheritance matrix we need to build to find - derivation information. */ -#define CLASSTYPE_N_SUPERCLASSES(NODE) (TYPE_LANG_SPECIFIC(NODE)->n_ancestors) -#define CLASSTYPE_N_VBASECLASSES(NODE) (TYPE_LANG_SPECIFIC(NODE)->n_vancestors) - -/* Record how deep the inheritance is for this class so `void*' conversions - are less favorable than a conversion to the most base type. */ -#define CLASSTYPE_MAX_DEPTH(NODE) (TYPE_LANG_SPECIFIC(NODE)->max_depth) - -/* Used for keeping search-specific information. Any search routine - which uses this must define what exactly this slot is used for. */ -#define CLASSTYPE_SEARCH_SLOT(NODE) (TYPE_LANG_SPECIFIC(NODE)->search_slot) - -/* These are the size, mode and alignment of the type without its - virtual base classes, for when we use this type as a base itself. */ -#define CLASSTYPE_SIZE(NODE) (TYPE_LANG_SPECIFIC(NODE)->size) -#define CLASSTYPE_ALIGN(NODE) (TYPE_LANG_SPECIFIC(NODE)->align) - -/* A cons list of structure elements which either have constructors - to be called, or virtual function table pointers which - need initializing. Depending on what is being initialized, - the TREE_PURPOSE and TREE_VALUE fields have different meanings: - - Member initialization: - Base class construction: - Base class initialization: - Whole type: . */ -#define CLASSTYPE_BASE_INIT_LIST(NODE) (TYPE_LANG_SPECIFIC(NODE)->base_init_list) - -/* A cons list of virtual functions which cannot be inherited by - derived classes. When deriving from this type, the derived - class must provide its own definition for each of these functions. */ -#define CLASSTYPE_ABSTRACT_VIRTUALS(NODE) (TYPE_LANG_SPECIFIC(NODE)->abstract_virtuals) - -/* Nonzero means that this aggr type has been `closed' by a semicolon. */ -#define CLASSTYPE_GOT_SEMICOLON(NODE) (TYPE_LANG_SPECIFIC (NODE)->type_flags.got_semicolon) - -/* Nonzero means that the main virtual function table pointer needs to be - set because base constructors have placed the wrong value there. - If this is zero, it means that they placed the right value there, - and there is no need to change it. */ -#define CLASSTYPE_NEEDS_VIRTUAL_REINIT(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.needs_virtual_reinit) - -/* Nonzero means that if this type has virtual functions, that - the virtual function table will be written out. */ -#define CLASSTYPE_VTABLE_NEEDS_WRITING(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.vtable_needs_writing) - -/* Nonzero means that this type has an X() constructor. */ -#define TYPE_HAS_DEFAULT_CONSTRUCTOR(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_default_ctor) - -/* Nonzero means the type declared a ctor as private or protected. We - use this to make sure we don't try to generate a copy ctor for a - class that has a member of type NODE. */ -#define TYPE_HAS_NONPUBLIC_CTOR(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_nonpublic_ctor) - -/* Ditto, for operator=. */ -#define TYPE_HAS_NONPUBLIC_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_nonpublic_assign_ref) - -/* Nonzero means that this type contains a mutable member */ -#define CLASSTYPE_HAS_MUTABLE(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_mutable) -#define TYPE_HAS_MUTABLE_P(NODE) (cp_has_mutable_p (NODE)) - -/* Many routines need to cons up a list of basetypes for access - checking. This field contains a TREE_LIST node whose TREE_VALUE - is the main variant of the type, and whose TREE_VIA_PUBLIC - and TREE_VIA_VIRTUAL bits are correctly set. */ -#define CLASSTYPE_AS_LIST(NODE) (TYPE_LANG_SPECIFIC(NODE)->as_list) -/* Same, but cache a list whose value is the name of this type. */ -#define CLASSTYPE_ID_AS_LIST(NODE) (TYPE_LANG_SPECIFIC(NODE)->id_as_list) -/* Same, but cache a list whose value is the binfo of this type. */ -#define CLASSTYPE_BINFO_AS_LIST(NODE) (TYPE_LANG_SPECIFIC(NODE)->binfo_as_list) - -/* A list of class types with which this type is a friend. The - TREE_VALUE is normally a TYPE, but will be a TEMPLATE_DECL in the - case of a template friend. */ -#define CLASSTYPE_FRIEND_CLASSES(NODE) (TYPE_LANG_SPECIFIC(NODE)->friend_classes) - -/* Say whether this node was declared as a "class" or a "struct". */ -#define CLASSTYPE_DECLARED_CLASS(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.declared_class) - -/* Nonzero if this class has const members which have no specified initialization. */ -#define CLASSTYPE_READONLY_FIELDS_NEED_INIT(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.const_needs_init) - -/* Nonzero if this class has ref members which have no specified initialization. */ -#define CLASSTYPE_REF_FIELDS_NEED_INIT(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.ref_needs_init) - -/* Nonzero if this class is included from a header file which employs - `#pragma interface', and it is not included in its implementation file. */ -#define CLASSTYPE_INTERFACE_ONLY(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.interface_only) - -/* Same as above, but for classes whose purpose we do not know. */ -#define CLASSTYPE_INTERFACE_UNKNOWN(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.interface_unknown) -#define CLASSTYPE_INTERFACE_KNOWN(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.interface_unknown == 0) -#define SET_CLASSTYPE_INTERFACE_UNKNOWN_X(NODE,X) (TYPE_LANG_SPECIFIC(NODE)->type_flags.interface_unknown = !!(X)) -#define SET_CLASSTYPE_INTERFACE_UNKNOWN(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.interface_unknown = 1) -#define SET_CLASSTYPE_INTERFACE_KNOWN(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.interface_unknown = 0) - -/* Nonzero if a _DECL node requires us to output debug info for this class. */ -#define CLASSTYPE_DEBUG_REQUESTED(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.debug_requested) - -/* Additional macros for inheritance information. */ - -/* The BINFO_INHERITANCE_CHAIN is used opposite to the description in - gcc/tree.h. In particular if D is derived from B then the BINFO - for B (in D) will have a BINFO_INHERITANCE_CHAIN pointing to - D. In tree.h, this pointer is described as pointing in other - direction. - - After a call to get_vbase_types, the vbases are chained together in - depth-first order via TREE_CHAIN. Other than that, TREE_CHAIN is - unused. */ - -/* Nonzero means marked by DFS or BFS search, including searches - by `get_binfo' and `get_base_distance'. */ -#define BINFO_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?CLASSTYPE_MARKED(BINFO_TYPE(NODE)):TREE_LANG_FLAG_0(NODE)) -/* Macros needed because of C compilers that don't allow conditional - expressions to be lvalues. Grr! */ -#define SET_BINFO_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?SET_CLASSTYPE_MARKED(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_0(NODE)=1)) -#define CLEAR_BINFO_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?CLEAR_CLASSTYPE_MARKED(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_0(NODE)=0)) - -/* Nonzero means marked in search through virtual inheritance hierarchy. */ -#define BINFO_VBASE_MARKED(NODE) CLASSTYPE_MARKED2 (BINFO_TYPE (NODE)) -/* Modifier macros */ -#define SET_BINFO_VBASE_MARKED(NODE) SET_CLASSTYPE_MARKED2 (BINFO_TYPE (NODE)) -#define CLEAR_BINFO_VBASE_MARKED(NODE) CLEAR_CLASSTYPE_MARKED2 (BINFO_TYPE (NODE)) - -/* Nonzero means marked in search for members or member functions. */ -#define BINFO_FIELDS_MARKED(NODE) \ - (TREE_VIA_VIRTUAL(NODE)?CLASSTYPE_MARKED2 (BINFO_TYPE (NODE)):TREE_LANG_FLAG_2(NODE)) -#define SET_BINFO_FIELDS_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?SET_CLASSTYPE_MARKED2(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_2(NODE)=1)) -#define CLEAR_BINFO_FIELDS_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?CLEAR_CLASSTYPE_MARKED2(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_2(NODE)=0)) - -/* Nonzero means that this class is on a path leading to a new vtable. */ -#define BINFO_VTABLE_PATH_MARKED(NODE) \ - (TREE_VIA_VIRTUAL(NODE)?CLASSTYPE_MARKED3(BINFO_TYPE(NODE)):TREE_LANG_FLAG_3(NODE)) -#define SET_BINFO_VTABLE_PATH_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?SET_CLASSTYPE_MARKED3(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_3(NODE)=1)) -#define CLEAR_BINFO_VTABLE_PATH_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?CLEAR_CLASSTYPE_MARKED3(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_3(NODE)=0)) - -/* Nonzero means that this class has a new vtable. */ -#define BINFO_NEW_VTABLE_MARKED(NODE) \ - (TREE_VIA_VIRTUAL(NODE)?CLASSTYPE_MARKED4(BINFO_TYPE(NODE)):TREE_LANG_FLAG_4(NODE)) -#define SET_BINFO_NEW_VTABLE_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?SET_CLASSTYPE_MARKED4(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_4(NODE)=1)) -#define CLEAR_BINFO_NEW_VTABLE_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?CLEAR_CLASSTYPE_MARKED4(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_4(NODE)=0)) - -/* Nonzero means this class has done dfs_pushdecls. */ -#define BINFO_PUSHDECLS_MARKED(NODE) BINFO_VTABLE_PATH_MARKED (NODE) -#define SET_BINFO_PUSHDECLS_MARKED(NODE) SET_BINFO_VTABLE_PATH_MARKED (NODE) -#define CLEAR_BINFO_PUSHDECLS_MARKED(NODE) CLEAR_BINFO_VTABLE_PATH_MARKED (NODE) - -/* Used by various search routines. */ -#define IDENTIFIER_MARKED(NODE) TREE_LANG_FLAG_0 (NODE) - -/* Accessor macros for the vfield slots in structures. */ - -/* Get the assoc info that caused this vfield to exist. */ -#define VF_BINFO_VALUE(NODE) TREE_PURPOSE (NODE) - -/* Get that same information as a _TYPE. */ -#define VF_BASETYPE_VALUE(NODE) TREE_VALUE (NODE) - -/* Get the value of the top-most type dominating the non-`normal' vfields. */ -#define VF_DERIVED_VALUE(NODE) (VF_BINFO_VALUE (NODE) ? BINFO_TYPE (VF_BINFO_VALUE (NODE)) : NULL_TREE) - -/* Get the value of the top-most type that's `normal' for the vfield. */ -#define VF_NORMAL_VALUE(NODE) TREE_TYPE (NODE) - -/* Nonzero for TREE_LIST node means that this list of things - is a list of parameters, as opposed to a list of expressions. */ -#define TREE_PARMLIST(NODE) ((NODE)->common.unsigned_flag) /* overloaded! */ - -/* For FUNCTION_TYPE or METHOD_TYPE, a list of the exceptions that - this type can raise. Each TREE_VALUE is a _TYPE. The TREE_VALUE - will be NULL_TREE to indicate a throw specification of `(...)', or, - equivalently, no throw specification. */ -#define TYPE_RAISES_EXCEPTIONS(NODE) TYPE_NONCOPIED_PARTS (NODE) - -/* The binding level associated with the namespace. */ -#define NAMESPACE_LEVEL(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.level) - -struct lang_decl_flags -{ -#ifdef ONLY_INT_FIELDS - int language : 8; -#else - enum languages language : 8; -#endif - - unsigned operator_attr : 1; - unsigned constructor_attr : 1; - unsigned returns_first_arg : 1; - unsigned preserves_first_arg : 1; - unsigned friend_attr : 1; - unsigned static_function : 1; - unsigned const_memfunc : 1; - unsigned volatile_memfunc : 1; - - unsigned abstract_virtual : 1; - unsigned permanent_attr : 1 ; - unsigned constructor_for_vbase_attr : 1; - unsigned mutable_flag : 1; - unsigned is_default_implementation : 1; - unsigned saved_inline : 1; - unsigned use_template : 2; - - unsigned nonconverting : 1; - unsigned declared_inline : 1; - unsigned not_really_extern : 1; - unsigned comdat : 1; - unsigned needs_final_overrider : 1; - unsigned bitfield : 1; - unsigned defined_in_class : 1; - unsigned dummy : 1; - - tree access; - tree context; - tree memfunc_pointer_to; - tree template_info; - struct binding_level *level; -}; - -struct lang_decl -{ - struct lang_decl_flags decl_flags; - - tree main_decl_variant; - struct pending_inline *pending_inline_info; -}; - -/* Non-zero if NODE is a _DECL with TREE_READONLY set. */ -#define TREE_READONLY_DECL_P(NODE) \ - (TREE_READONLY (NODE) && TREE_CODE_CLASS (TREE_CODE (NODE)) == 'd') - -/* Non-zero iff DECL is memory-based. The DECL_RTL of - certain const variables might be a CONST_INT, or a REG - in some cases. We cannot use `memory_operand' as a test - here because on most RISC machines, a variable's address - is not, by itself, a legitimate address. */ -#define DECL_IN_MEMORY_P(NODE) \ - (DECL_RTL (NODE) != NULL_RTX && GET_CODE (DECL_RTL (NODE)) == MEM) - -/* For FUNCTION_DECLs: return the language in which this decl - was declared. */ -#define DECL_LANGUAGE(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.language) - -/* For FUNCTION_DECLs: nonzero means that this function is a constructor. */ -#define DECL_CONSTRUCTOR_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.constructor_attr) - -/* There ought to be a better way to find out whether or not something is - a destructor. */ -#define DECL_DESTRUCTOR_P(NODE) \ - (DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (NODE)) \ - && DECL_LANGUAGE (NODE) == lang_cplusplus) - -#define DECL_CONV_FN_P(NODE) \ - (IDENTIFIER_TYPENAME_P (DECL_NAME (NODE)) && TREE_TYPE (DECL_NAME (NODE))) - -/* For FUNCTION_DECLs: nonzero means that this function is a constructor - for an object with virtual baseclasses. */ -#define DECL_CONSTRUCTOR_FOR_VBASE_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.constructor_for_vbase_attr) - -/* For FUNCTION_DECLs: nonzero means that this function is a default - implementation of a signature method. */ -#define IS_DEFAULT_IMPLEMENTATION(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.is_default_implementation) - -/* For FUNCTION_DECLs: nonzero means that the constructor - is known to return a non-zero `this' unchanged. */ -#define DECL_RETURNS_FIRST_ARG(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.returns_first_arg) - -/* Nonzero for FUNCTION_DECL means that this constructor is known to - not make any assignment to `this', and therefore can be trusted - to return it unchanged. Otherwise, we must re-assign `current_class_ptr' - after performing base initializations. */ -#define DECL_PRESERVES_THIS(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.preserves_first_arg) - -/* Nonzero for _DECL means that this decl appears in (or will appear - in) as a member in a RECORD_TYPE or UNION_TYPE node. It is also for - detecting circularity in case members are multiply defined. In the - case of a VAR_DECL, it is also used to determine how program storage - should be allocated. */ -#define DECL_IN_AGGR_P(NODE) (DECL_LANG_FLAG_3(NODE)) - -/* Nonzero if the DECL was defined in the class definition itself, - rather than outside the class. */ -#define DECL_DEFINED_IN_CLASS_P(DECL) \ - (DECL_LANG_SPECIFIC (DECL)->decl_flags.defined_in_class) - -/* Nonzero for FUNCTION_DECL means that this decl is just a - friend declaration, and should not be added to the list of - member functions for this class. */ -#define DECL_FRIEND_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.friend_attr) - -/* Nonzero for FUNCTION_DECL means that this decl is a static - member function. */ -#define DECL_STATIC_FUNCTION_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.static_function) - -/* Nonzero for a class member means that it is shared between all objects - of that class. */ -#define SHARED_MEMBER_P(NODE) \ - (TREE_CODE (NODE) == VAR_DECL || TREE_CODE (NODE) == TYPE_DECL \ - || TREE_CODE (NODE) == CONST_DECL) - -/* Nonzero for FUNCTION_DECL means that this decl is a non-static - member function. */ -#define DECL_NONSTATIC_MEMBER_FUNCTION_P(NODE) \ - (TREE_CODE (TREE_TYPE (NODE)) == METHOD_TYPE) - -/* Nonzero for FUNCTION_DECL means that this decl is a member function - (static or non-static). */ -#define DECL_FUNCTION_MEMBER_P(NODE) \ - (DECL_NONSTATIC_MEMBER_FUNCTION_P (NODE) || DECL_STATIC_FUNCTION_P (NODE)) - -/* Nonzero for FUNCTION_DECL means that this member function - has `this' as const X *const. */ -#define DECL_CONST_MEMFUNC_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.const_memfunc) - -/* Nonzero for FUNCTION_DECL means that this member function - has `this' as volatile X *const. */ -#define DECL_VOLATILE_MEMFUNC_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.volatile_memfunc) - -/* Nonzero for _DECL means that this member object type - is mutable. */ -#define DECL_MUTABLE_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.mutable_flag) - -/* Nonzero for _DECL means that this constructor is a non-converting - constructor. */ -#define DECL_NONCONVERTING_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.nonconverting) - -/* Nonzero for FUNCTION_DECL means that this member function - exists as part of an abstract class's interface. */ -#define DECL_ABSTRACT_VIRTUAL_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.abstract_virtual) - -/* Nonzero for FUNCTION_DECL means that this member function - must be overridden by derived classes. */ -#define DECL_NEEDS_FINAL_OVERRIDER_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.needs_final_overrider) - -/* Nonzero if allocated on permanent_obstack. */ -#define LANG_DECL_PERMANENT(LANGDECL) ((LANGDECL)->decl_flags.permanent_attr) - -/* The _TYPE context in which this _DECL appears. This field holds the - class where a virtual function instance is actually defined, and the - lexical scope of a friend function defined in a class body. */ -#define DECL_CLASS_CONTEXT(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.context) -#define DECL_REAL_CONTEXT(NODE) \ - ((TREE_CODE (NODE) == FUNCTION_DECL && DECL_FUNCTION_MEMBER_P (NODE)) \ - ? DECL_CLASS_CONTEXT (NODE) : CP_DECL_CONTEXT (NODE)) - -/* NULL_TREE in DECL_CONTEXT represents the global namespace. */ -#define CP_DECL_CONTEXT(NODE) \ - (DECL_CONTEXT (NODE) ? DECL_CONTEXT (NODE) : global_namespace) -#define FROB_CONTEXT(NODE) ((NODE) == global_namespace ? NULL_TREE : (NODE)) - -/* 1 iff NODE has namespace scope, including the global namespace. */ -#define DECL_NAMESPACE_SCOPE_P(NODE) \ - (DECL_CONTEXT (NODE) == NULL_TREE \ - || TREE_CODE (DECL_CONTEXT (NODE)) == NAMESPACE_DECL) - -/* 1 iff NODE is a class member. */ -#define DECL_CLASS_SCOPE_P(NODE) \ - (DECL_CONTEXT (NODE) \ - && TREE_CODE_CLASS (TREE_CODE (DECL_CONTEXT (NODE))) == 't') - -/* 1 iff NODE is function-local. */ -#define DECL_FUNCTION_SCOPE_P(NODE) \ - (DECL_CONTEXT (NODE) \ - && TREE_CODE (DECL_CONTEXT (NODE)) == FUNCTION_DECL) - -/* For a NAMESPACE_DECL: the list of using namespace directives - The PURPOSE is the used namespace, the value is the namespace - that is the common ancestor. */ -#define DECL_NAMESPACE_USING(NODE) DECL_VINDEX(NODE) - -/* In a NAMESPACE_DECL, the DECL_INITIAL is used to record all users - of a namespace, to record the transitive closure of using namespace. */ -#define DECL_NAMESPACE_USERS(NODE) DECL_INITIAL (NODE) - -/* In a NAMESPACE_DECL, points to the original namespace if this is - a namespace alias. */ -#define DECL_NAMESPACE_ALIAS(NODE) DECL_ABSTRACT_ORIGIN (NODE) -#define ORIGINAL_NAMESPACE(NODE) \ - (DECL_NAMESPACE_ALIAS (NODE) ? DECL_NAMESPACE_ALIAS (NODE) : (NODE)) - -/* In a TREE_LIST concatenating using directives, indicate indirekt - directives */ -#define TREE_INDIRECT_USING(NODE) ((NODE)->common.lang_flag_0) - -/* In a VAR_DECL for a variable declared in a for statement, - this is the shadowed (local) variable. */ -#define DECL_SHADOWED_FOR_VAR(NODE) DECL_RESULT(NODE) - -/* Points back to the decl which caused this lang_decl to be allocated. */ -#define DECL_MAIN_VARIANT(NODE) (DECL_LANG_SPECIFIC(NODE)->main_decl_variant) - -/* For a FUNCTION_DECL: if this function was declared inline inside of - a class declaration, this is where the text for the function is - squirreled away. */ -#define DECL_PENDING_INLINE_INFO(NODE) (DECL_LANG_SPECIFIC(NODE)->pending_inline_info) - -/* True if on the saved_inlines (see decl2.c) list. */ -#define DECL_SAVED_INLINE(DECL) \ - (DECL_LANG_SPECIFIC(DECL)->decl_flags.saved_inline) - -/* For a FUNCTION_DECL: if this function was declared inside a signature - declaration, this is the corresponding member function pointer that was - created for it. */ -#define DECL_MEMFUNC_POINTER_TO(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.memfunc_pointer_to) - -/* For a FIELD_DECL: this points to the signature member function from - which this signature member function pointer was created. */ -#define DECL_MEMFUNC_POINTING_TO(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.memfunc_pointer_to) - -/* For a VAR_DECL or FUNCTION_DECL: template-specific information. */ -#define DECL_TEMPLATE_INFO(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.template_info) - -/* Template information for a RECORD_TYPE or UNION_TYPE. */ -#define CLASSTYPE_TEMPLATE_INFO(NODE) (TYPE_LANG_SPECIFIC(NODE)->template_info) - -/* Template information for an ENUMERAL_TYPE. Although an enumeration may - not be a primary template, it may be declared within the scope of a - primary template and the enumeration constants may depend on - non-type template parameters. */ -#define ENUM_TEMPLATE_INFO(NODE) (TYPE_BINFO (NODE)) - -/* Template information for a template template parameter. */ -#define TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO(NODE) (TYPE_BINFO (NODE)) - -/* Template information for an ENUMERAL_, RECORD_, or UNION_TYPE. */ -#define TYPE_TEMPLATE_INFO(NODE) \ - (TREE_CODE (NODE) == ENUMERAL_TYPE \ - ? ENUM_TEMPLATE_INFO (NODE) : \ - (TREE_CODE (NODE) == TEMPLATE_TEMPLATE_PARM \ - ? TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (NODE) \ - : CLASSTYPE_TEMPLATE_INFO (NODE))) - -/* Set the template information for an ENUMERAL_, RECORD_, or - UNION_TYPE to VAL. */ -#define SET_TYPE_TEMPLATE_INFO(NODE, VAL) \ - (TREE_CODE (NODE) == ENUMERAL_TYPE \ - ? (ENUM_TEMPLATE_INFO (NODE) = VAL) \ - : (CLASSTYPE_TEMPLATE_INFO (NODE) = VAL)) - -#define TI_TEMPLATE(NODE) (TREE_PURPOSE (NODE)) -#define TI_ARGS(NODE) (TREE_VALUE (NODE)) -#define TI_SPEC_INFO(NODE) (TREE_CHAIN (NODE)) -#define TI_PENDING_TEMPLATE_FLAG(NODE) TREE_LANG_FLAG_1 (NODE) - -/* The TEMPLATE_DECL instantiated or specialized by NODE. This - TEMPLATE_DECL will be the immediate parent, not the most general - template. For example, in: - - template struct S { template void f(U); } - - the FUNCTION_DECL for S::f will have, as its - DECL_TI_TEMPLATE, `template S::f'. - - As a special case, for a member friend template of a template - class, this value will not be a TEMPLATE_DECL, but rather a - LOOKUP_EXPR or IDENTIFIER_NODE indicating the name of the template - and any explicit template arguments provided. For example, in: - - template struct S { friend void f(int, double); } - - the DECL_TI_TEMPLATE will be a LOOKUP_EXPR for `f' and the - DECL_TI_ARGS will be {int}. */ -#define DECL_TI_TEMPLATE(NODE) TI_TEMPLATE (DECL_TEMPLATE_INFO (NODE)) - -/* The template arguments used to obtain this decl from the most - general form of DECL_TI_TEMPLATE. For the example given for - DECL_TI_TEMPLATE, the DECL_TI_ARGS will be {int, double}. These - are always the full set of arguments required to instantiate this - declaration from the most general template specialized here. */ -#define DECL_TI_ARGS(NODE) TI_ARGS (DECL_TEMPLATE_INFO (NODE)) -#define CLASSTYPE_TI_TEMPLATE(NODE) TI_TEMPLATE (CLASSTYPE_TEMPLATE_INFO (NODE)) -#define CLASSTYPE_TI_ARGS(NODE) TI_ARGS (CLASSTYPE_TEMPLATE_INFO (NODE)) -#define CLASSTYPE_TI_SPEC_INFO(NODE) TI_SPEC_INFO (CLASSTYPE_TEMPLATE_INFO (NODE)) -#define ENUM_TI_TEMPLATE(NODE) \ - TI_TEMPLATE (ENUM_TEMPLATE_INFO (NODE)) -#define ENUM_TI_ARGS(NODE) \ - TI_ARGS (ENUM_TEMPLATE_INFO (NODE)) - -/* Like DECL_TI_TEMPLATE, but for an ENUMERAL_, RECORD_, or UNION_TYPE. */ -#define TYPE_TI_TEMPLATE(NODE) \ - (TI_TEMPLATE (TYPE_TEMPLATE_INFO (NODE))) - -/* Like DECL_TI_ARGS, , but for an ENUMERAL_, RECORD_, or UNION_TYPE. */ -#define TYPE_TI_ARGS(NODE) \ - (TI_ARGS (TYPE_TEMPLATE_INFO (NODE))) - -#define INNERMOST_TEMPLATE_PARMS(NODE) TREE_VALUE(NODE) - -/* Nonzero if the NODE corresponds to the template parameters for a - member template, whose inline definition is being processed after - the class definition is complete. */ -#define TEMPLATE_PARMS_FOR_INLINE(NODE) TREE_LANG_FLAG_1 (NODE) - -#define DECL_SAVED_TREE(NODE) DECL_MEMFUNC_POINTER_TO (NODE) -#define COMPOUND_STMT_NO_SCOPE(NODE) TREE_LANG_FLAG_0 (NODE) -#define NEW_EXPR_USE_GLOBAL(NODE) TREE_LANG_FLAG_0 (NODE) -#define DELETE_EXPR_USE_GLOBAL(NODE) TREE_LANG_FLAG_0 (NODE) -#define DELETE_EXPR_USE_VEC(NODE) TREE_LANG_FLAG_1 (NODE) -#define LOOKUP_EXPR_GLOBAL(NODE) TREE_LANG_FLAG_0 (NODE) - -/* The TYPE_MAIN_DECL for a class template type is a TYPE_DECL, not a - TEMPLATE_DECL. This macro determines whether or not a given class - type is really a template type, as opposed to an instantiation or - specialization of one. */ -#define CLASSTYPE_IS_TEMPLATE(NODE) \ - (CLASSTYPE_TEMPLATE_INFO (NODE) \ - && !CLASSTYPE_USE_TEMPLATE (NODE) \ - && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (NODE))) - -/* The name used by the user to name the typename type. Typically, - this is an IDENTIFIER_NODE, and the same as the DECL_NAME on the - corresponding TYPE_DECL. However, this may also be a - TEMPLATE_ID_EXPR if we had something like `typename X::Y'. */ -#define TYPENAME_TYPE_FULLNAME(NODE) TYPE_BINFO (NODE) - -/* Nonzero if NODE is an implicit typename. */ -#define IMPLICIT_TYPENAME_P(NODE) \ - (TREE_CODE (NODE) == TYPENAME_TYPE && TREE_TYPE (NODE)) - -/* Nonzero in INTEGER_CST means that this int is negative by dint of - using a twos-complement negated operand. */ -#define TREE_NEGATED_INT(NODE) (TREE_LANG_FLAG_0 (NODE)) - -#if 0 /* UNUSED */ -/* Nonzero in any kind of _EXPR or _REF node means that it is a call - to a storage allocation routine. If, later, alternate storage - is found to hold the object, this call can be ignored. */ -#define TREE_CALLS_NEW(NODE) (TREE_LANG_FLAG_1 (NODE)) -#endif - -/* Nonzero in any kind of _TYPE that uses multiple inheritance - or virtual baseclasses. */ -#define TYPE_USES_COMPLEX_INHERITANCE(NODE) (TREE_LANG_FLAG_1 (NODE)) - -#if 0 /* UNUSED */ -/* Nonzero in IDENTIFIER_NODE means that this name is not the name the user - gave; it's a DECL_NESTED_TYPENAME. Someone may want to set this on - mangled function names, too, but it isn't currently. */ -#define TREE_MANGLED(NODE) (FOO) -#endif - -#if 0 /* UNUSED */ -/* Nonzero in IDENTIFIER_NODE means that this name is overloaded, and - should be looked up in a non-standard way. */ -#define DECL_OVERLOADED(NODE) (FOO) -#endif - -/* Nonzero if this (non-TYPE)_DECL has its virtual attribute set. - For a FUNCTION_DECL, this is when the function is a virtual function. - For a VAR_DECL, this is when the variable is a virtual function table. - For a FIELD_DECL, when the field is the field for the virtual function table. - For an IDENTIFIER_NODE, nonzero if any function with this name - has been declared virtual. - - For a _TYPE if it uses virtual functions (or is derived from - one that does). */ -#define TYPE_VIRTUAL_P(NODE) (TREE_LANG_FLAG_2 (NODE)) - -extern int flag_new_for_scope; - -/* This flag is true of a local VAR_DECL if it was declared in a for - statement, but we are no longer in the scope of the for. */ -#define DECL_DEAD_FOR_LOCAL(NODE) DECL_LANG_FLAG_7 (NODE) - -/* This flag is set on a VAR_DECL that is a DECL_DEAD_FOR_LOCAL - if we already emitted a warning about using it. */ -#define DECL_ERROR_REPORTED(NODE) DECL_LANG_FLAG_0 (NODE) - -/* This _DECL represents a compiler-generated entity. */ -#define SET_DECL_ARTIFICIAL(NODE) (DECL_ARTIFICIAL (NODE) = 1) - -/* Record whether a typedef for type `int' was actually `signed int'. */ -#define C_TYPEDEF_EXPLICITLY_SIGNED(exp) DECL_LANG_FLAG_1 ((exp)) - -/* In a FIELD_DECL, nonzero if the decl was originally a bitfield. */ -#define DECL_C_BIT_FIELD(NODE) \ - (DECL_LANG_SPECIFIC (NODE) && DECL_LANG_SPECIFIC (NODE)->decl_flags.bitfield) -#define SET_DECL_C_BIT_FIELD(NODE) \ - (DECL_LANG_SPECIFIC (NODE)->decl_flags.bitfield = 1) - -/* Nonzero if the type T promotes to itself. - ANSI C states explicitly the list of types that promote; - in particular, short promotes to int even if they have the same width. */ -#define C_PROMOTING_INTEGER_TYPE_P(t) \ - (TREE_CODE ((t)) == INTEGER_TYPE \ - && (TYPE_MAIN_VARIANT (t) == char_type_node \ - || TYPE_MAIN_VARIANT (t) == signed_char_type_node \ - || TYPE_MAIN_VARIANT (t) == unsigned_char_type_node \ - || TYPE_MAIN_VARIANT (t) == short_integer_type_node \ - || TYPE_MAIN_VARIANT (t) == short_unsigned_type_node)) - -#define INTEGRAL_CODE_P(CODE) \ - (CODE == INTEGER_TYPE || CODE == ENUMERAL_TYPE || CODE == BOOLEAN_TYPE) -#define ARITHMETIC_TYPE_P(TYPE) (INTEGRAL_TYPE_P (TYPE) || FLOAT_TYPE_P (TYPE)) - -/* Mark which labels are explicitly declared. - These may be shadowed, and may be referenced from nested functions. */ -#define C_DECLARED_LABEL_FLAG(label) TREE_LANG_FLAG_1 (label) - -/* Nonzero for _TYPE means that the _TYPE defines - at least one constructor. */ -#define TYPE_HAS_CONSTRUCTOR(NODE) (TYPE_LANG_FLAG_1(NODE)) - -/* When appearing in an INDIRECT_REF, it means that the tree structure - underneath is actually a call to a constructor. This is needed - when the constructor must initialize local storage (which can - be automatically destroyed), rather than allowing it to allocate - space from the heap. - - When appearing in a SAVE_EXPR, it means that underneath - is a call to a constructor. - - When appearing in a CONSTRUCTOR, it means that it was - a GNU C constructor expression. - - When appearing in a FIELD_DECL, it means that this field - has been duly initialized in its constructor. */ -#define TREE_HAS_CONSTRUCTOR(NODE) (TREE_LANG_FLAG_4(NODE)) - -#define EMPTY_CONSTRUCTOR_P(NODE) (TREE_CODE (NODE) == CONSTRUCTOR \ - && CONSTRUCTOR_ELTS (NODE) == NULL_TREE \ - && ! TREE_HAS_CONSTRUCTOR (NODE)) - -#if 0 -/* Indicates that a NON_LVALUE_EXPR came from a C++ reference. - Used to generate more helpful error message in case somebody - tries to take its address. */ -#define TREE_REFERENCE_EXPR(NODE) (TREE_LANG_FLAG_3(NODE)) -#endif - -/* Nonzero for _TYPE means that the _TYPE defines a destructor. */ -#define TYPE_HAS_DESTRUCTOR(NODE) (TYPE_LANG_FLAG_2(NODE)) - -#if 0 -/* Nonzero for _TYPE node means that creating an object of this type - will involve a call to a constructor. This can apply to objects - of ARRAY_TYPE if the type of the elements needs a constructor. */ -#define TYPE_NEEDS_CONSTRUCTING(NODE) ... defined in ../tree.h ... -#endif - -/* Nonzero means that an object of this type can not be initialized using - an initializer list. */ -#define CLASSTYPE_NON_AGGREGATE(NODE) \ - (TYPE_LANG_SPECIFIC (NODE)->type_flags.non_aggregate) -#define TYPE_NON_AGGREGATE_CLASS(NODE) \ - (IS_AGGR_TYPE (NODE) && CLASSTYPE_NON_AGGREGATE (NODE)) - -/* Nonzero if there is a user-defined X::op=(x&) for this class. */ -#define TYPE_HAS_REAL_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_real_assign_ref) -#define TYPE_HAS_COMPLEX_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_complex_assign_ref) -#define TYPE_HAS_ABSTRACT_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_abstract_assign_ref) -#define TYPE_HAS_COMPLEX_INIT_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_complex_init_ref) - -/* Nonzero for _TYPE node means that destroying an object of this type - will involve a call to a destructor. This can apply to objects - of ARRAY_TYPE is the type of the elements needs a destructor. */ -#define TYPE_NEEDS_DESTRUCTOR(NODE) (TYPE_LANG_FLAG_4(NODE)) - -/* Nonzero for class type means that initialization of this type can use - a bitwise copy. */ -#define TYPE_HAS_TRIVIAL_INIT_REF(NODE) \ - (TYPE_HAS_INIT_REF (NODE) && ! TYPE_HAS_COMPLEX_INIT_REF (NODE)) - -/* Nonzero for class type means that assignment of this type can use - a bitwise copy. */ -#define TYPE_HAS_TRIVIAL_ASSIGN_REF(NODE) \ - (TYPE_HAS_ASSIGN_REF (NODE) && ! TYPE_HAS_COMPLEX_ASSIGN_REF (NODE)) - -#define TYPE_PTRMEM_P(NODE) \ - (TREE_CODE (NODE) == POINTER_TYPE \ - && TREE_CODE (TREE_TYPE (NODE)) == OFFSET_TYPE) -#define TYPE_PTR_P(NODE) \ - (TREE_CODE (NODE) == POINTER_TYPE \ - && TREE_CODE (TREE_TYPE (NODE)) != OFFSET_TYPE) -#define TYPE_PTROB_P(NODE) \ - (TYPE_PTR_P (NODE) && TREE_CODE (TREE_TYPE (NODE)) != FUNCTION_TYPE \ - && TREE_CODE (TREE_TYPE (NODE)) != VOID_TYPE) -#define TYPE_PTROBV_P(NODE) \ - (TYPE_PTR_P (NODE) && TREE_CODE (TREE_TYPE (NODE)) != FUNCTION_TYPE) -#define TYPE_PTRFN_P(NODE) \ - (TREE_CODE (NODE) == POINTER_TYPE \ - && TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE) - -/* Nonzero for _TYPE node means that this type is a pointer to member - function type. */ -#define TYPE_PTRMEMFUNC_P(NODE) (TREE_CODE(NODE) == RECORD_TYPE && TYPE_LANG_SPECIFIC(NODE)->type_flags.ptrmemfunc_flag) -#define TYPE_PTRMEMFUNC_FLAG(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.ptrmemfunc_flag) -/* Get the POINTER_TYPE to the METHOD_TYPE associated with this - pointer to member function. TYPE_PTRMEMFUNC_P _must_ be true, - before using this macro. */ -#define TYPE_PTRMEMFUNC_FN_TYPE(NODE) (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (TREE_CHAIN (TREE_CHAIN (TYPE_FIELDS (NODE))))))) - -/* Returns `A' for a type like `int (A::*)(double)' */ -#define TYPE_PTRMEMFUNC_OBJECT_TYPE(NODE) \ - TYPE_METHOD_BASETYPE (TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (NODE))) - -/* These are use to manipulate the canonical RECORD_TYPE from the - hashed POINTER_TYPE, and can only be used on the POINTER_TYPE. */ -#define TYPE_GET_PTRMEMFUNC_TYPE(NODE) ((tree)TYPE_LANG_SPECIFIC(NODE)) -#define TYPE_SET_PTRMEMFUNC_TYPE(NODE, VALUE) (TYPE_LANG_SPECIFIC(NODE) = ((struct lang_type *)(void*)(VALUE))) -/* These are to get the delta2 and pfn fields from a TYPE_PTRMEMFUNC_P. */ -#define DELTA2_FROM_PTRMEMFUNC(NODE) (build_component_ref (build_component_ref ((NODE), pfn_or_delta2_identifier, NULL_TREE, 0), delta2_identifier, NULL_TREE, 0)) -#define PFN_FROM_PTRMEMFUNC(NODE) (build_component_ref (build_component_ref ((NODE), pfn_or_delta2_identifier, NULL_TREE, 0), pfn_identifier, NULL_TREE, 0)) - -/* For a pointer-to-member constant `X::Y' this is the RECORD_TYPE for - `X'. */ -#define PTRMEM_CST_CLASS(NODE) \ - (TYPE_PTRMEM_P (TREE_TYPE (NODE)) \ - ? TYPE_OFFSET_BASETYPE (TREE_TYPE (TREE_TYPE (NODE))) \ - : TYPE_PTRMEMFUNC_OBJECT_TYPE (TREE_TYPE (NODE))) - -/* For a pointer-to-member constant `X::Y' this is the _DECL for - `Y'. */ -#define PTRMEM_CST_MEMBER(NODE) (((ptrmem_cst_t) NODE)->member) - -/* Nonzero for VAR_DECL and FUNCTION_DECL node means that `extern' was - specified in its declaration. */ -#define DECL_THIS_EXTERN(NODE) (DECL_LANG_FLAG_2(NODE)) - -/* Nonzero for VAR_DECL and FUNCTION_DECL node means that `static' was - specified in its declaration. */ -#define DECL_THIS_STATIC(NODE) (DECL_LANG_FLAG_6(NODE)) - -/* Nonzero in FUNCTION_DECL means it is really an operator. - Just used to communicate formatting information to dbxout.c. */ -#define DECL_OPERATOR(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.operator_attr) - -#define ANON_UNION_P(NODE) (DECL_NAME (NODE) == 0) - -/* Nonzero if TYPE is an anonymous union type. */ -#define ANON_UNION_TYPE_P(TYPE) \ - (TREE_CODE (TYPE) == UNION_TYPE \ - && ANON_AGGRNAME_P (TYPE_IDENTIFIER (TYPE))) - -#define UNKNOWN_TYPE LANG_TYPE - -/* Define fields and accessors for nodes representing declared names. */ - -#if 0 -/* C++: A derived class may be able to directly use the virtual - function table of a base class. When it does so, it may - still have a decl node used to access the virtual function - table (so that variables of this type can initialize their - virtual function table pointers by name). When such thievery - is committed, know exactly which base class's virtual function - table is the one being stolen. This effectively computes the - transitive closure. */ -#define DECL_VPARENT(NODE) ((NODE)->decl.arguments) -#endif - -#define TYPE_WAS_ANONYMOUS(NODE) (TYPE_LANG_SPECIFIC (NODE)->type_flags.was_anonymous) - -/* C++: all of these are overloaded! These apply only to TYPE_DECLs. */ - -/* The format of each node in the DECL_FRIENDLIST is as follows: - - The TREE_PURPOSE will be the name of a function, i.e., an - IDENTIFIER_NODE. The TREE_VALUE will be itself a TREE_LIST, the - list of functions with that name which are friends. The - TREE_PURPOSE of each node in this sublist will be error_mark_node, - if the function was declared a friend individually, in which case - the TREE_VALUE will be the function_decl. If, however, all - functions with a given name in a class were declared to be friends, - the TREE_PUROSE will be the class type, and the TREE_VALUE will be - NULL_TREE. */ -#define DECL_FRIENDLIST(NODE) (DECL_INITIAL (NODE)) - -/* The DECL_ACCESS, if non-NULL, is a TREE_LIST. The TREE_PURPOSE of - each node is a type; the TREE_VALUE is the access granted for this - DECL in that type. The DECL_ACCESS is set by access declarations. - For example, if a member that would normally be public in a - derived class is made protected, then the derived class and the - protected_access_node will appear in the DECL_ACCESS for the node. */ -#define DECL_ACCESS(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.access) - -/* C++: all of these are overloaded! - These apply to PARM_DECLs and VAR_DECLs. */ -#define DECL_REFERENCE_SLOT(NODE) ((tree)(NODE)->decl.arguments) -#define SET_DECL_REFERENCE_SLOT(NODE,VAL) ((NODE)->decl.arguments=VAL) - -/* Accessor macros for C++ template decl nodes. */ - -/* The DECL_TEMPLATE_PARMS are a list. The TREE_PURPOSE of each node - is a INT_CST whose TREE_INT_CST_HIGH indicates the level of the - template parameters, with 1 being the outermost set of template - parameters. The TREE_VALUE is a vector, whose elements are the - template parameters at each level. Each element in the vector is a - TREE_LIST, whose TREE_VALUE is a PARM_DECL (if the parameter is a - non-type parameter), or a TYPE_DECL (if the parameter is a type - parameter). The TREE_PURPOSE is the default value, if any. The - TEMPLATE_PARM_INDEX for the parameter is avilable as the - DECL_INITIAL (for a PARM_DECL) or as the TREE_TYPE (for a - TYPE_DECL). */ -#define DECL_TEMPLATE_PARMS(NODE) DECL_ARGUMENTS(NODE) -#define DECL_INNERMOST_TEMPLATE_PARMS(NODE) \ - INNERMOST_TEMPLATE_PARMS (DECL_TEMPLATE_PARMS (NODE)) -#define DECL_NTPARMS(NODE) \ - TREE_VEC_LENGTH (DECL_INNERMOST_TEMPLATE_PARMS (NODE)) -/* For function, method, class-data templates. */ -#define DECL_TEMPLATE_RESULT(NODE) DECL_RESULT(NODE) -/* For a static member variable template, the - DECL_TEMPLATE_INSTANTIATIONS list contains the explicitly and - implicitly generated instantiations of the variable. There are no - partial instantiations of static member variables, so all of these - will be full instantiations. - - For a class template the DECL_TEMPLATE_INSTANTIATIONS lists holds - all instantiations and specializations of the class type, including - partial instantiations and partial specializations. - - In both cases, the TREE_PURPOSE of each node contains the arguments - used; the TREE_VALUE contains the generated variable. The template - arguments are always complete. For example, given: - - template struct S1 { - template struct S2 {}; - template struct S2 {}; - }; - - the record for the partial specialization will contain, as its - argument list, { {T}, {U*} }, and will be on the - DECL_TEMPLATE_INSTANTIATIONS list for `template template - struct S1::S2'. - - This list is not used for function templates. */ -#define DECL_TEMPLATE_INSTANTIATIONS(NODE) DECL_VINDEX(NODE) -/* For a function template, the DECL_TEMPLATE_SPECIALIZATIONS lists - contains all instantiations and specializations of the function, - including partial instantiations. For a partial instantiation - which is a specialization, this list holds only full - specializations of the template that are instantiations of the - partial instantiation. For example, given: - - template struct S { - template void f(U); - template <> void f(T); - }; - - the `S::f(int)' function will appear on the - DECL_TEMPLATE_SPECIALIZATIONS list for both `template - template void S::f(U)' and `template void - S::f(T)'. In the latter case, however, it will have only the - innermost set of arguments (T, in this case). The DECL_TI_TEMPLATE - for the function declaration will point at the specialization, not - the fully general template. - - For a class template, this list contains the partial - specializations of this template. (Full specializations are not - recorded on this list.) The TREE_PURPOSE holds the innermost - arguments used in the partial specialization (e.g., for `template - struct S' this will be `T*'.) The TREE_VALUE - holds the innermost template parameters for the specialization - (e.g., `T' in the example above.) The TREE_TYPE is the _TYPE node - for the partial specialization. - - This list is not used for static variable templates. */ -#define DECL_TEMPLATE_SPECIALIZATIONS(NODE) DECL_SIZE(NODE) -#define DECL_TEMPLATE_INJECT(NODE) DECL_INITIAL(NODE) - -/* Nonzero for a DECL which is actually a template parameter. */ -#define DECL_TEMPLATE_PARM_P(NODE) \ - DECL_LANG_FLAG_0 (NODE) - -#define DECL_TEMPLATE_TEMPLATE_PARM_P(NODE) \ - (TREE_CODE (NODE) == TEMPLATE_DECL && DECL_TEMPLATE_PARM_P (NODE)) - -#define DECL_FUNCTION_TEMPLATE_P(NODE) \ - (TREE_CODE (NODE) == TEMPLATE_DECL \ - && TREE_CODE (DECL_TEMPLATE_RESULT (NODE)) == FUNCTION_DECL) - -/* Nonzero for a DECL that represents a template class. */ -#define DECL_CLASS_TEMPLATE_P(NODE) \ - (TREE_CODE (NODE) == TEMPLATE_DECL \ - && TREE_CODE (DECL_TEMPLATE_RESULT (NODE)) == TYPE_DECL \ - && !DECL_TEMPLATE_TEMPLATE_PARM_P (NODE)) - -/* Nonzero if NODE which declares a type. */ -#define DECL_DECLARES_TYPE_P(NODE) \ - (TREE_CODE (NODE) == TYPE_DECL || DECL_CLASS_TEMPLATE_P (NODE)) - -/* A `primary' template is one that has its own template header. A - member function of a class template is a template, but not primary. - A member template is primary. Friend templates are primary, too. */ - -/* Returns the primary template corresponding to these parameters. */ -#define DECL_PRIMARY_TEMPLATE(NODE) \ - (TREE_TYPE (DECL_INNERMOST_TEMPLATE_PARMS (NODE))) - -/* Returns non-zero if NODE is a primary template. */ -#define PRIMARY_TEMPLATE_P(NODE) (DECL_PRIMARY_TEMPLATE (NODE) == NODE) - -#define CLASSTYPE_TEMPLATE_LEVEL(NODE) \ - (TREE_INT_CST_HIGH (TREE_PURPOSE (CLASSTYPE_TI_TEMPLATE (NODE)))) - -/* Indicates whether or not (and how) a template was expanded for this - FUNCTION_DECL or VAR_DECL. - 0=normal declaration, e.g. int min (int, int); - 1=implicit template instantiation - 2=explicit template specialization, e.g. int min (int, int); - 3=explicit template instantiation, e.g. template int min (int, int); */ -#define DECL_USE_TEMPLATE(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.use_template) - -#define DECL_TEMPLATE_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) & 1) -#define CLASSTYPE_TEMPLATE_INSTANTIATION(NODE) \ - (CLASSTYPE_USE_TEMPLATE (NODE) & 1) - -#define DECL_TEMPLATE_SPECIALIZATION(NODE) (DECL_USE_TEMPLATE (NODE) == 2) -#define SET_DECL_TEMPLATE_SPECIALIZATION(NODE) (DECL_USE_TEMPLATE (NODE) = 2) -#define CLASSTYPE_TEMPLATE_SPECIALIZATION(NODE) \ - (CLASSTYPE_USE_TEMPLATE (NODE) == 2) -#define SET_CLASSTYPE_TEMPLATE_SPECIALIZATION(NODE) \ - (CLASSTYPE_USE_TEMPLATE (NODE) = 2) - -#define DECL_IMPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) == 1) -#define SET_DECL_IMPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) = 1) -#define CLASSTYPE_IMPLICIT_INSTANTIATION(NODE) \ - (CLASSTYPE_USE_TEMPLATE(NODE) == 1) -#define SET_CLASSTYPE_IMPLICIT_INSTANTIATION(NODE) \ - (CLASSTYPE_USE_TEMPLATE(NODE) = 1) - -#define DECL_EXPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) == 3) -#define SET_DECL_EXPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) = 3) -#define CLASSTYPE_EXPLICIT_INSTANTIATION(NODE) \ - (CLASSTYPE_USE_TEMPLATE(NODE) == 3) -#define SET_CLASSTYPE_EXPLICIT_INSTANTIATION(NODE) \ - (CLASSTYPE_USE_TEMPLATE(NODE) = 3) - -/* Non-zero if DECL is a friend function which is an instantiation - from the point of view of the compiler, but not from the point of - view of the language. For example given: - template struct S { friend void f(T) {}; }; - the declaration of `void f(int)' generated when S is - instantiated will not be a DECL_TEMPLATE_INSTANTIATION, but will be - a DECL_FRIEND_PSUEDO_TEMPLATE_INSTANTIATION. */ -#define DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION(DECL) \ - (DECL_TEMPLATE_INFO (DECL) && !DECL_USE_TEMPLATE (DECL)) - -/* Non-zero if TYPE is a partial instantiation of a template class, - i.e., an instantiation whose instantiation arguments involve - template types. */ -#define PARTIAL_INSTANTIATION_P(TYPE) \ - (TYPE_LANG_SPECIFIC (TYPE)->type_flags.is_partial_instantiation) - -/* Non-zero iff we are currently processing a declaration for an - entity with its own template parameter list, and which is not a - full specialization. */ -#define PROCESSING_REAL_TEMPLATE_DECL_P() \ - (processing_template_decl > template_class_depth (current_class_type)) - -/* This function may be a guiding decl for a template. */ -#define DECL_MAYBE_TEMPLATE(NODE) DECL_LANG_FLAG_4 (NODE) - -/* Nonzero if this VAR_DECL or FUNCTION_DECL has already been - instantiated, i.e. its definition has been generated from the - pattern given in the the template. */ -#define DECL_TEMPLATE_INSTANTIATED(NODE) DECL_LANG_FLAG_1(NODE) - -/* We know what we're doing with this decl now. */ -#define DECL_INTERFACE_KNOWN(NODE) DECL_LANG_FLAG_5 (NODE) - -/* This function was declared inline. This flag controls the linkage - semantics of 'inline'; whether or not the function is inlined is - controlled by DECL_INLINE. */ -#define DECL_THIS_INLINE(NODE) \ - (DECL_LANG_SPECIFIC (NODE)->decl_flags.declared_inline) - -/* DECL_EXTERNAL must be set on a decl until the decl is actually emitted, - so that assemble_external will work properly. So we have this flag to - tell us whether the decl is really not external. */ -#define DECL_NOT_REALLY_EXTERN(NODE) \ - (DECL_LANG_SPECIFIC (NODE)->decl_flags.not_really_extern) - -#define DECL_REALLY_EXTERN(NODE) \ - (DECL_EXTERNAL (NODE) && ! DECL_NOT_REALLY_EXTERN (NODE)) - -/* Used to tell cp_finish_decl that it should approximate comdat linkage - as best it can for this decl. */ -#define DECL_COMDAT(NODE) (DECL_LANG_SPECIFIC (NODE)->decl_flags.comdat) - -#define THUNK_DELTA(DECL) ((DECL)->decl.frame_size.i) - -/* ...and for unexpanded-parameterized-type nodes. */ -#define UPT_TEMPLATE(NODE) TREE_PURPOSE(TYPE_VALUES(NODE)) -#define UPT_PARMS(NODE) TREE_VALUE(TYPE_VALUES(NODE)) - -/* An un-parsed default argument looks like an identifier. */ -#define DEFARG_NODE_CHECK(t) TREE_CHECK(t, DEFAULT_ARG) -#define DEFARG_LENGTH(NODE) (DEFARG_NODE_CHECK(NODE)->identifier.length) -#define DEFARG_POINTER(NODE) (DEFARG_NODE_CHECK(NODE)->identifier.pointer) - -#define builtin_function(NAME, TYPE, CODE, LIBNAME) \ - define_function (NAME, TYPE, CODE, (void (*) PROTO((tree)))pushdecl, LIBNAME) - -/* These macros provide convenient access to the various _STMT nodes - created when parsing template declarations. */ -#define IF_COND(NODE) TREE_OPERAND (NODE, 0) -#define THEN_CLAUSE(NODE) TREE_OPERAND (NODE, 1) -#define ELSE_CLAUSE(NODE) TREE_OPERAND (NODE, 2) -#define WHILE_COND(NODE) TREE_OPERAND (NODE, 0) -#define WHILE_BODY(NODE) TREE_OPERAND (NODE, 1) -#define DO_COND(NODE) TREE_OPERAND (NODE, 0) -#define DO_BODY(NODE) TREE_OPERAND (NODE, 1) -#define RETURN_EXPR(NODE) TREE_OPERAND (NODE, 0) -#define EXPR_STMT_EXPR(NODE) TREE_OPERAND (NODE, 0) -#define FOR_INIT_STMT(NODE) TREE_OPERAND (NODE, 0) -#define FOR_COND(NODE) TREE_OPERAND (NODE, 1) -#define FOR_EXPR(NODE) TREE_OPERAND (NODE, 2) -#define FOR_BODY(NODE) TREE_OPERAND (NODE, 3) -#define SWITCH_COND(NODE) TREE_OPERAND (NODE, 0) -#define SWITCH_BODY(NODE) TREE_OPERAND (NODE, 1) -#define CASE_LOW(NODE) TREE_OPERAND (NODE, 0) -#define CASE_HIGH(NODE) TREE_OPERAND (NODE, 1) -#define GOTO_DESTINATION(NODE) TREE_OPERAND (NODE, 0) -#define TRY_STMTS(NODE) TREE_OPERAND (NODE, 0) -#define TRY_HANDLERS(NODE) TREE_OPERAND (NODE, 1) -#define HANDLER_PARMS(NODE) TREE_OPERAND (NODE, 0) -#define HANDLER_BODY(NODE) TREE_OPERAND (NODE, 1) -#define COMPOUND_BODY(NODE) TREE_OPERAND (NODE, 0) -#define ASM_CV_QUAL(NODE) TREE_OPERAND (NODE, 0) -#define ASM_STRING(NODE) TREE_OPERAND (NODE, 1) -#define ASM_OUTPUTS(NODE) TREE_OPERAND (NODE, 2) -#define ASM_INPUTS(NODE) TREE_OPERAND (NODE, 3) -#define ASM_CLOBBERS(NODE) TREE_OPERAND (NODE, 4) - -/* An enumeration of the kind of tags that C++ accepts. */ -enum tag_types { record_type, class_type, union_type, enum_type, - signature_type }; - -/* Zero means prototype weakly, as in ANSI C (no args means nothing). - Each language context defines how this variable should be set. */ -extern int strict_prototype; -extern int strict_prototypes_lang_c, strict_prototypes_lang_cplusplus; - -/* Non-zero means that if a label exists, and no other identifier - applies, use the value of the label. */ -extern int flag_labels_ok; - -/* Non-zero means to collect statistics which might be expensive - and to print them when we are done. */ -extern int flag_detailed_statistics; - -/* Non-zero means warn in function declared in derived class has the - same name as a virtual in the base class, but fails to match the - type signature of any virtual function in the base class. */ -extern int warn_overloaded_virtual; - -/* Nonzero means warn about use of multicharacter literals. */ -extern int warn_multichar; - -/* Non-zero means warn if a non-templatized friend function is - declared in a templatized class. This behavior is warned about with - flag_guiding_decls in do_friend. */ -extern int warn_nontemplate_friend; - -/* in c-common.c */ -extern void declare_function_name PROTO((void)); -extern void decl_attributes PROTO((tree, tree, tree)); -extern void init_function_format_info PROTO((void)); -extern void record_function_format PROTO((tree, tree, int, int, int)); -extern void check_function_format PROTO((tree, tree, tree)); -/* Print an error message for invalid operands to arith operation CODE. - NOP_EXPR is used as a special case (see truthvalue_conversion). */ -extern void binary_op_error PROTO((enum tree_code)); -extern tree cp_build_qualified_type PROTO((tree, int)); -extern tree canonical_type_variant PROTO((tree)); -extern void c_expand_expr_stmt PROTO((tree)); -/* Validate the expression after `case' and apply default promotions. */ -extern tree check_case_value PROTO((tree)); -/* Concatenate a list of STRING_CST nodes into one STRING_CST. */ -extern tree combine_strings PROTO((tree)); -extern void constant_expression_warning PROTO((tree)); -extern tree convert_and_check PROTO((tree, tree)); -extern void overflow_warning PROTO((tree)); -extern void unsigned_conversion_warning PROTO((tree, tree)); -extern void c_apply_type_quals_to_decl PROTO((int, tree)); - -/* Read the rest of the current #-directive line. */ -#if USE_CPPLIB -extern char *get_directive_line PROTO((void)); -#define GET_DIRECTIVE_LINE() get_directive_line () -#else -extern char *get_directive_line PROTO((FILE *)); -#define GET_DIRECTIVE_LINE() get_directive_line (finput) -#endif -/* 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. */ -extern tree shorten_compare PROTO((tree *, tree *, tree *, enum tree_code *)); -/* Prepare expr to be an argument of a TRUTH_NOT_EXPR, - or validate its data type for an `if' or `while' statement or ?..: exp. */ -extern tree truthvalue_conversion PROTO((tree)); -extern tree type_for_mode PROTO((enum machine_mode, int)); -extern tree type_for_size PROTO((unsigned, int)); -extern int c_get_alias_set PROTO((tree)); - -/* in decl{2}.c */ -extern tree void_list_node; -extern tree void_zero_node; -extern tree default_function_type; -extern tree vtable_entry_type; -extern tree sigtable_entry_type; -extern tree __t_desc_type_node; -#if 0 -extern tree __tp_desc_type_node; -#endif -extern tree __access_mode_type_node; -extern tree __bltn_desc_type_node, __user_desc_type_node; -extern tree __class_desc_type_node, __attr_desc_type_node; -extern tree __ptr_desc_type_node, __func_desc_type_node; -extern tree __ptmf_desc_type_node, __ptmd_desc_type_node; -extern tree type_info_type_node; -extern tree class_star_type_node; -extern tree this_identifier; -extern tree ctor_identifier, dtor_identifier; -extern tree pfn_identifier; -extern tree index_identifier; -extern tree delta_identifier; -extern tree delta2_identifier; -extern tree pfn_or_delta2_identifier; -extern tree tag_identifier; -extern tree vt_off_identifier; - -/* A node that is a list (length 1) of error_mark_nodes. */ -extern tree error_mark_list; - -extern tree ptr_type_node; -extern tree class_type_node, record_type_node, union_type_node, enum_type_node; -extern tree unknown_type_node; -extern tree opaque_type_node, signature_type_node; - -/* Node for "pointer to (virtual) function". - This may be distinct from ptr_type_node so gdb can distinguish them. */ -#define vfunc_ptr_type_node \ - (flag_vtable_thunks ? vtable_entry_type : ptr_type_node) - -/* The type of a vtbl, i.e., an array of vtable entries. */ -extern tree vtbl_type_node; -/* The type of a class vtbl pointer, i.e., a pointer to a vtable entry. */ -extern tree vtbl_ptr_type_node; -extern tree delta_type_node; -extern tree std_node; - -extern tree long_long_integer_type_node, long_long_unsigned_type_node; -/* For building calls to `delete'. */ -extern tree integer_two_node, integer_three_node; -extern tree boolean_type_node, boolean_true_node, boolean_false_node; - -extern tree null_node; - -extern tree anonymous_namespace_name; - -/* The FUNCTION_DECL for the default `::operator delete'. */ - -extern tree global_delete_fndecl; - -/* in pt.c */ - -/* These values are used for the `STRICT' parameter to type_unfication and - fn_type_unification. Their meanings are described with the - documentation for fn_type_unification. */ - -typedef enum unification_kind_t { - DEDUCE_CALL, - DEDUCE_CONV, - DEDUCE_EXACT -} unification_kind_t; - -extern tree current_template_parms; -extern HOST_WIDE_INT processing_template_decl; -extern tree last_tree; - -/* The template currently being instantiated, and where the instantiation - was triggered. */ -struct tinst_level -{ - tree decl; - int line; - char *file; - struct tinst_level *next; -}; - -extern int minimal_parse_mode; - -extern void maybe_print_template_context PROTO ((void)); - -/* in class.c */ - -/* When parsing a class definition, the access specifier most recently - given by the user, or, if no access specifier was given, the - default value appropriate for the kind of class (i.e., struct, - class, or union). */ -extern tree current_access_specifier; - -extern tree current_class_name; -extern tree current_class_type; -extern tree current_class_ptr; -extern tree previous_class_type; -extern tree current_class_ref; -extern int current_class_depth; - -extern tree current_lang_name; -extern tree lang_name_cplusplus, lang_name_c, lang_name_java; - -/* Points to the name of that function. May not be the DECL_NAME - of CURRENT_FUNCTION_DECL due to overloading */ -extern tree original_function_name; - -/* in init.c */ -extern tree global_base_init_list; -extern tree current_base_init_list, current_member_init_list; - -extern int current_function_just_assigned_this; -extern int current_function_parms_stored; - -/* Here's where we control how name mangling takes place. */ - -#define OPERATOR_ASSIGN_FORMAT "__a%s" -#define OPERATOR_FORMAT "__%s" -#define OPERATOR_TYPENAME_FORMAT "__op" - -/* Cannot use '$' up front, because this confuses gdb - (names beginning with '$' are gdb-local identifiers). - - Note that all forms in which the '$' is significant are long enough - for direct indexing (meaning that if we know there is a '$' - at a particular location, we can index into the string at - any other location that provides distinguishing characters). */ - -/* Define NO_DOLLAR_IN_LABEL in your favorite tm file if your assembler - doesn't allow '$' in symbol names. */ -#ifndef NO_DOLLAR_IN_LABEL - -#define JOINER '$' - -#define VPTR_NAME "$v" -#define THROW_NAME "$eh_throw" -#define DESTRUCTOR_DECL_PREFIX "_$_" -#define AUTO_VTABLE_NAME "__vtbl$me__" -#define AUTO_TEMP_NAME "_$tmp_" -#define AUTO_TEMP_FORMAT "_$tmp_%d" -#define VTABLE_BASE "$vb" -#define VTABLE_NAME_FORMAT (flag_vtable_thunks ? "__vt_%s" : "_vt$%s") -#define VFIELD_BASE "$vf" -#define VFIELD_NAME "_vptr$" -#define VFIELD_NAME_FORMAT "_vptr$%s" -#define VBASE_NAME "_vb$" -#define VBASE_NAME_FORMAT "_vb$%s" -#define STATIC_NAME_FORMAT "_%s$%s" -#define ANON_AGGRNAME_FORMAT "$_%d" - -#else /* NO_DOLLAR_IN_LABEL */ - -#ifndef NO_DOT_IN_LABEL - -#define JOINER '.' - -#define VPTR_NAME ".v" -#define THROW_NAME ".eh_throw" -#define DESTRUCTOR_DECL_PREFIX "_._" -#define AUTO_VTABLE_NAME "__vtbl.me__" -#define AUTO_TEMP_NAME "_.tmp_" -#define AUTO_TEMP_FORMAT "_.tmp_%d" -#define VTABLE_BASE ".vb" -#define VTABLE_NAME_FORMAT (flag_vtable_thunks ? "__vt_%s" : "_vt.%s") -#define VFIELD_BASE ".vf" -#define VFIELD_NAME "_vptr." -#define VFIELD_NAME_FORMAT "_vptr.%s" -#define VBASE_NAME "_vb." -#define VBASE_NAME_FORMAT "_vb.%s" -#define STATIC_NAME_FORMAT "_%s.%s" - -#define ANON_AGGRNAME_FORMAT "._%d" - -#else /* NO_DOT_IN_LABEL */ - -#define VPTR_NAME "__vptr" -#define VPTR_NAME_P(ID_NODE) \ - (!strncmp (IDENTIFIER_POINTER (ID_NODE), VPTR_NAME, sizeof (VPTR_NAME) - 1)) -#define THROW_NAME "__eh_throw" -#define DESTRUCTOR_DECL_PREFIX "__destr_" -#define DESTRUCTOR_NAME_P(ID_NODE) \ - (!strncmp (IDENTIFIER_POINTER (ID_NODE), DESTRUCTOR_DECL_PREFIX, \ - sizeof (DESTRUCTOR_DECL_PREFIX) - 1)) -#define IN_CHARGE_NAME "__in_chrg" -#define AUTO_VTABLE_NAME "__vtbl_me__" -#define AUTO_TEMP_NAME "__tmp_" -#define TEMP_NAME_P(ID_NODE) \ - (!strncmp (IDENTIFIER_POINTER (ID_NODE), AUTO_TEMP_NAME, \ - sizeof (AUTO_TEMP_NAME) - 1)) -#define AUTO_TEMP_FORMAT "__tmp_%d" -#define VTABLE_BASE "__vtb" -#define VTABLE_NAME "__vt_" -#define VTABLE_NAME_FORMAT (flag_vtable_thunks ? "__vt_%s" : "_vt_%s") -#define VTABLE_NAME_P(ID_NODE) \ - (!strncmp (IDENTIFIER_POINTER (ID_NODE), VTABLE_NAME, \ - sizeof (VTABLE_NAME) - 1)) -#define VFIELD_BASE "__vfb" -#define VFIELD_NAME "__vptr_" -#define VFIELD_NAME_P(ID_NODE) \ - (!strncmp (IDENTIFIER_POINTER (ID_NODE), VFIELD_NAME, \ - sizeof (VFIELD_NAME) - 1)) -#define VFIELD_NAME_FORMAT "_vptr_%s" -#define VBASE_NAME "__vb_" -#define VBASE_NAME_P(ID_NODE) \ - (!strncmp (IDENTIFIER_POINTER (ID_NODE), VBASE_NAME, \ - sizeof (VBASE_NAME) - 1)) -#define VBASE_NAME_FORMAT "__vb_%s" -#define STATIC_NAME_FORMAT "__static_%s_%s" - -#define ANON_AGGRNAME_PREFIX "__anon_" -#define ANON_AGGRNAME_P(ID_NODE) \ - (!strncmp (IDENTIFIER_POINTER (ID_NODE), ANON_AGGRNAME_PREFIX, \ - sizeof (ANON_AGGRNAME_PREFIX) - 1)) -#define ANON_AGGRNAME_FORMAT "__anon_%d" -#define ANON_PARMNAME_FORMAT "__%d" -#define ANON_PARMNAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[0] == '_' \ - && IDENTIFIER_POINTER (ID_NODE)[1] == '_' \ - && IDENTIFIER_POINTER (ID_NODE)[2] <= '9') - -#endif /* NO_DOT_IN_LABEL */ -#endif /* NO_DOLLAR_IN_LABEL */ - -#define THIS_NAME "this" -#define DESTRUCTOR_NAME_FORMAT "~%s" -#define FILE_FUNCTION_PREFIX_LEN 9 -#define CTOR_NAME "__ct" -#define DTOR_NAME "__dt" - -#define IN_CHARGE_NAME "__in_chrg" - -#define VTBL_PTR_TYPE "__vtbl_ptr_type" -#define VTABLE_DELTA_NAME "__delta" -#define VTABLE_INDEX_NAME "__index" -#define VTABLE_PFN_NAME "__pfn" -#define VTABLE_DELTA2_NAME "__delta2" - -#define SIGNATURE_FIELD_NAME "__s_" -#define SIGNATURE_FIELD_NAME_FORMAT "__s_%s" -#define SIGNATURE_OPTR_NAME "__optr" -#define SIGNATURE_SPTR_NAME "__sptr" -#define SIGNATURE_POINTER_NAME "__sp_" -#define SIGNATURE_POINTER_NAME_FORMAT "__%s%s%ssp_%s" -#define SIGNATURE_REFERENCE_NAME "__sr_" -#define SIGNATURE_REFERENCE_NAME_FORMAT "__%s%s%ssr_%s" - -#define SIGTABLE_PTR_TYPE "__sigtbl_ptr_type" -#define SIGTABLE_NAME_FORMAT "__st_%s_%s" -#define SIGTABLE_NAME_FORMAT_LONG "__st_%s_%s_%d" -#define SIGTABLE_TAG_NAME "__tag" -#define SIGTABLE_VB_OFF_NAME "__vb_off" -#define SIGTABLE_VT_OFF_NAME "__vt_off" -#define EXCEPTION_CLEANUP_NAME "exception cleanup" - -#define THIS_NAME_P(ID_NODE) (strcmp(IDENTIFIER_POINTER (ID_NODE), "this") == 0) - -#if !defined(NO_DOLLAR_IN_LABEL) || !defined(NO_DOT_IN_LABEL) - -#define VPTR_NAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[0] == JOINER \ - && IDENTIFIER_POINTER (ID_NODE)[1] == 'v') -#define DESTRUCTOR_NAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[1] == JOINER \ - && IDENTIFIER_POINTER (ID_NODE)[2] == '_') - -#define VTABLE_NAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[1] == 'v' \ - && IDENTIFIER_POINTER (ID_NODE)[2] == 't' \ - && IDENTIFIER_POINTER (ID_NODE)[3] == JOINER) - -#define VBASE_NAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[1] == 'v' \ - && IDENTIFIER_POINTER (ID_NODE)[2] == 'b' \ - && IDENTIFIER_POINTER (ID_NODE)[3] == JOINER) - -#define TEMP_NAME_P(ID_NODE) (!strncmp (IDENTIFIER_POINTER (ID_NODE), AUTO_TEMP_NAME, sizeof (AUTO_TEMP_NAME)-1)) -#define VFIELD_NAME_P(ID_NODE) (!strncmp (IDENTIFIER_POINTER (ID_NODE), VFIELD_NAME, sizeof(VFIELD_NAME)-1)) - -/* For anonymous aggregate types, we need some sort of name to - hold on to. In practice, this should not appear, but it should - not be harmful if it does. */ -#define ANON_AGGRNAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[0] == JOINER \ - && IDENTIFIER_POINTER (ID_NODE)[1] == '_') -#define ANON_PARMNAME_FORMAT "_%d" -#define ANON_PARMNAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[0] == '_' \ - && IDENTIFIER_POINTER (ID_NODE)[1] <= '9') -#endif /* !defined(NO_DOLLAR_IN_LABEL) || !defined(NO_DOT_IN_LABEL) */ - -/* Store the vbase pointer field name for type TYPE into pointer BUF. */ -#define FORMAT_VBASE_NAME(BUF,TYPE) do { \ - BUF = (char *) alloca (TYPE_ASSEMBLER_NAME_LENGTH (TYPE) \ - + sizeof (VBASE_NAME) + 1); \ - sprintf (BUF, VBASE_NAME_FORMAT, TYPE_ASSEMBLER_NAME_STRING (TYPE)); \ -} while (0) - -/* Returns non-zero iff ID_NODE is an IDENTIFIER_NODE whose name is - `main'. */ -#define MAIN_NAME_P(ID_NODE) \ - (strcmp (IDENTIFIER_POINTER (ID_NODE), "main") == 0) - -/* Returns non-zero iff NODE is a declaration for the global function - `main'. */ -#define DECL_MAIN_P(NODE) \ - (TREE_CODE (NODE) == FUNCTION_DECL \ - && DECL_LANGUAGE (NODE) == lang_c \ - && DECL_NAME (NODE) != NULL_TREE \ - && MAIN_NAME_P (DECL_NAME (NODE))) - - -/* Define the sets of attributes that member functions and baseclasses - can have. These are sensible combinations of {public,private,protected} - cross {virtual,non-virtual}. */ - -/* in class.c. */ -extern tree access_default_node; /* 0 */ -extern tree access_public_node; /* 1 */ -extern tree access_protected_node; /* 2 */ -extern tree access_private_node; /* 3 */ -extern tree access_default_virtual_node; /* 4 */ -extern tree access_public_virtual_node; /* 5 */ -extern tree access_protected_virtual_node; /* 6 */ -extern tree access_private_virtual_node; /* 7 */ - -/* Things for handling inline functions. */ - -struct pending_inline -{ - struct pending_inline *next; /* pointer to next in chain */ - int lineno; /* line number we got the text from */ - char *filename; /* name of file we were processing */ - tree fndecl; /* FUNCTION_DECL that brought us here */ - int token; /* token we were scanning */ - int token_value; /* value of token we were scanning (YYSTYPE) */ - - char *buf; /* pointer to character stream */ - int len; /* length of stream */ - unsigned int can_free : 1; /* free this after we're done with it? */ - unsigned int deja_vu : 1; /* set iff we don't want to see it again. */ - unsigned int interface : 2; /* 0=interface 1=unknown 2=implementation */ -}; - -/* in method.c */ -extern struct pending_inline *pending_inlines; - -/* Positive values means that we cannot make optimizing assumptions about - `this'. Negative values means we know `this' to be of static type. */ - -extern int flag_this_is_variable; - -/* Nonzero means generate 'rtti' that give run-time type information. */ - -extern int flag_rtti; - -/* Nonzero means do emit exported implementations of functions even if - they can be inlined. */ - -extern int flag_implement_inlines; - -/* Nonzero means templates obey #pragma interface and implementation. */ - -extern int flag_external_templates; - -/* Nonzero means templates are emitted where they are instantiated. */ - -extern int flag_alt_external_templates; - -/* Nonzero means implicit template instantiations are emitted. */ - -extern int flag_implicit_templates; - -/* Nonzero if we want to emit defined symbols with common-like linkage as - weak symbols where possible, in order to conform to C++ semantics. - Otherwise, emit them as local symbols. */ - -extern int flag_weak; - -/* CYGNUS LOCAL Embedded C++ */ -/* Nonzero if we want to adhere to the language rules of the Embedded C++ - specification. */ - -extern int flag_embedded_cxx; -/* END CYGNUS LOCAL Embedded C++ */ - -/* Nonzero to enable experimental ABI changes. */ - -extern int flag_new_abi; - -/* Nonzero to not ignore namespace std. */ - -extern int flag_honor_std; - -/* Nonzero if we're done parsing and into end-of-file activities. */ - -extern int at_eof; - -enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, OP_FLAG, TYPENAME_FLAG }; - -/* The following two can be derived from the previous one */ -extern tree current_class_name; /* IDENTIFIER_NODE: name of current class */ - -/* Some macros for char-based bitfields. */ -#define B_SET(a,x) (a[x>>3] |= (1 << (x&7))) -#define B_CLR(a,x) (a[x>>3] &= ~(1 << (x&7))) -#define B_TST(a,x) (a[x>>3] & (1 << (x&7))) - -/* These are uses as bits in flags passed to build_method_call - to control its error reporting behavior. - - LOOKUP_PROTECT means flag access violations. - LOOKUP_COMPLAIN mean complain if no suitable member function - matching the arguments is found. - LOOKUP_NORMAL is just a combination of these two. - LOOKUP_NONVIRTUAL means make a direct call to the member function found - LOOKUP_GLOBAL means search through the space of overloaded functions, - as well as the space of member functions. - LOOKUP_HAS_IN_CHARGE means that the "in charge" variable is already - in the parameter list. - LOOKUP_ONLYCONVERTING means that non-conversion constructors are not tried. - DIRECT_BIND means that if a temporary is created, it should be created so - that it lives as long as the current variable bindings; otherwise it - only lives until the end of the complete-expression. - LOOKUP_SPECULATIVELY means return NULL_TREE if we cannot find what we are - after. Note, LOOKUP_COMPLAIN is checked and error messages printed - before LOOKUP_SPECULATIVELY is checked. - LOOKUP_NO_CONVERSION means that user-defined conversions are not - permitted. Built-in conversions are permitted. - LOOKUP_DESTRUCTOR means explicit call to destructor. - LOOKUP_NO_TEMP_BIND means temporaries will not be bound to references. - - These are used in global lookup to support elaborated types and - qualifiers. - - LOOKUP_PREFER_TYPES means not to accept objects, and possibly namespaces. - LOOKUP_PREFER_NAMESPACES means not to accept objects, and possibly types. - LOOKUP_PREFER_BOTH means class-or-namespace-name. - LOOKUP_TEMPLATES_EXPECTED means that class templates also count - as types. */ - -#define LOOKUP_PROTECT (1) -#define LOOKUP_COMPLAIN (2) -#define LOOKUP_NORMAL (3) -/* #define LOOKUP_UNUSED (4) */ -#define LOOKUP_NONVIRTUAL (8) -#define LOOKUP_GLOBAL (16) -#define LOOKUP_HAS_IN_CHARGE (32) -#define LOOKUP_SPECULATIVELY (64) -#define LOOKUP_ONLYCONVERTING (128) -#define DIRECT_BIND (256) -#define LOOKUP_NO_CONVERSION (512) -#define LOOKUP_DESTRUCTOR (512) -#define LOOKUP_NO_TEMP_BIND (1024) -#define LOOKUP_PREFER_TYPES (2048) -#define LOOKUP_PREFER_NAMESPACES (4096) -#define LOOKUP_PREFER_BOTH (6144) -#define LOOKUP_TEMPLATES_EXPECTED (8192) - -#define LOOKUP_NAMESPACES_ONLY(f) \ - (((f) & LOOKUP_PREFER_NAMESPACES) && !((f) & LOOKUP_PREFER_TYPES)) -#define LOOKUP_TYPES_ONLY(f) \ - (!((f) & LOOKUP_PREFER_NAMESPACES) && ((f) & LOOKUP_PREFER_TYPES)) -#define LOOKUP_QUALIFIERS_ONLY(f) ((f) & LOOKUP_PREFER_BOTH) - - -/* These flags are used by the conversion code. - CONV_IMPLICIT : Perform implicit conversions (standard and user-defined). - CONV_STATIC : Perform the explicit conversions for static_cast. - CONV_CONST : Perform the explicit conversions for const_cast. - CONV_REINTERPRET: Perform the explicit conversions for reinterpret_cast. - CONV_PRIVATE : Perform upcasts to private bases. - CONV_FORCE_TEMP : Require a new temporary when converting to the same - aggregate type. */ - -#define CONV_IMPLICIT 1 -#define CONV_STATIC 2 -#define CONV_CONST 4 -#define CONV_REINTERPRET 8 -#define CONV_PRIVATE 16 -/* #define CONV_NONCONVERTING 32 */ -#define CONV_FORCE_TEMP 64 -#define CONV_STATIC_CAST (CONV_IMPLICIT | CONV_STATIC | CONV_FORCE_TEMP) -#define CONV_OLD_CONVERT (CONV_IMPLICIT | CONV_STATIC | CONV_CONST \ - | CONV_REINTERPRET) -#define CONV_C_CAST (CONV_IMPLICIT | CONV_STATIC | CONV_CONST \ - | CONV_REINTERPRET | CONV_PRIVATE | CONV_FORCE_TEMP) - -/* Used by build_expr_type_conversion to indicate which types are - acceptable as arguments to the expression under consideration. */ - -#define WANT_INT 1 /* integer types, including bool */ -#define WANT_FLOAT 2 /* floating point types */ -#define WANT_ENUM 4 /* enumerated types */ -#define WANT_POINTER 8 /* pointer types */ -#define WANT_NULL 16 /* null pointer constant */ -#define WANT_ARITH (WANT_INT | WANT_FLOAT) - -/* Used with comptypes, and related functions, to guide type - comparison. */ - -#define COMPARE_STRICT 0 /* Just check if the types are the - same. */ -#define COMPARE_BASE 1 /* Check to see if the second type is - derived from the first, or if both - are pointers (or references) and - the types pointed to by the second - type is derived from the pointed to - by the first. */ -#define COMPARE_RELAXED 2 /* Like COMPARE_DERIVED, but in - reverse. Also treat enmeration - types as the same as integer types - of the same width. */ -#define COMPARE_REDECLARATION 4 /* The comparsion is being done when - another declaration of an existing - entity is seen. */ - -/* Used with push_overloaded_decl. */ -#define PUSH_GLOBAL 0 /* Push the DECL into namespace scope, - regardless of the current scope. */ -#define PUSH_LOCAL 1 /* Push the DECL into the current - scope. */ -#define PUSH_USING 2 /* We are pushing this DECL as the - result of a using declaration. */ - -/* Returns nonzero iff TYPE1 and TYPE2 are the same type, in the usual - sense of `same'. */ -#define same_type_p(type1, type2) \ - comptypes ((type1), (type2), COMPARE_STRICT) - -/* Returns nonzero iff TYPE1 and TYPE2 are the same type, or if TYPE2 - is derived from TYPE1, or if TYPE2 is a pointer (reference) to a - class derived from the type pointed to (referred to) by TYPE1. */ -#define same_or_base_type_p(type1, type2) \ - comptypes ((type1), (type2), COMPARE_BASE) - -#define FRIEND_NAME(LIST) (TREE_PURPOSE (LIST)) -#define FRIEND_DECLS(LIST) (TREE_VALUE (LIST)) - -/* These macros are used to access a TEMPLATE_PARM_INDEX. */ -#define TEMPLATE_PARM_IDX(NODE) (((template_parm_index*) NODE)->index) -#define TEMPLATE_PARM_LEVEL(NODE) (((template_parm_index*) NODE)->level) -#define TEMPLATE_PARM_DESCENDANTS(NODE) (TREE_CHAIN (NODE)) -#define TEMPLATE_PARM_ORIG_LEVEL(NODE) (((template_parm_index*) NODE)->orig_level) -#define TEMPLATE_PARM_DECL(NODE) (((template_parm_index*) NODE)->decl) - -/* These macros are for accessing the fields of TEMPLATE_TYPE_PARM - and TEMPLATE_TEMPLATE_PARM nodes. */ -#define TEMPLATE_TYPE_PARM_INDEX(NODE) (TYPE_FIELDS (NODE)) -#define TEMPLATE_TYPE_IDX(NODE) \ - (TEMPLATE_PARM_IDX (TEMPLATE_TYPE_PARM_INDEX (NODE))) -#define TEMPLATE_TYPE_LEVEL(NODE) \ - (TEMPLATE_PARM_LEVEL (TEMPLATE_TYPE_PARM_INDEX (NODE))) -#define TEMPLATE_TYPE_ORIG_LEVEL(NODE) \ - (TEMPLATE_PARM_ORIG_LEVEL (TEMPLATE_TYPE_PARM_INDEX (NODE))) -#define TEMPLATE_TYPE_DECL(NODE) \ - (TEMPLATE_PARM_DECL (TEMPLATE_TYPE_PARM_INDEX (NODE))) - -/* in lex.c */ -/* Indexed by TREE_CODE, these tables give C-looking names to - operators represented by TREE_CODES. For example, - opname_tab[(int) MINUS_EXPR] == "-". */ -extern char **opname_tab, **assignop_tab; - -/* in call.c */ -extern int check_dtor_name PROTO((tree, tree)); -extern int get_arglist_len_in_bytes PROTO((tree)); - -extern tree build_vfield_ref PROTO((tree, tree)); -extern tree resolve_scope_to_name PROTO((tree, tree)); -extern tree build_scoped_method_call PROTO((tree, tree, tree, tree)); -extern tree build_addr_func PROTO((tree)); -extern tree build_call PROTO((tree, tree, tree)); -extern tree build_method_call PROTO((tree, tree, tree, tree, int)); -extern int null_ptr_cst_p PROTO((tree)); -extern tree type_decays_to PROTO((tree)); -extern tree build_user_type_conversion PROTO((tree, tree, int)); -extern tree build_new_function_call PROTO((tree, tree)); -extern tree build_new_op PROTO((enum tree_code, int, tree, tree, tree)); -extern tree build_op_new_call PROTO((enum tree_code, tree, tree, int)); -extern tree build_op_delete_call PROTO((enum tree_code, tree, tree, int, tree)); -extern int can_convert PROTO((tree, tree)); -extern int can_convert_arg PROTO((tree, tree, tree)); -extern void enforce_access PROTO((tree, tree)); -extern tree convert_default_arg PROTO((tree, tree, tree)); -extern tree convert_arg_to_ellipsis PROTO((tree)); - -/* in class.c */ -extern tree build_vbase_path PROTO((enum tree_code, tree, tree, tree, int)); -extern tree build_vtbl_ref PROTO((tree, tree)); -extern tree build_vfn_ref PROTO((tree *, tree, tree)); -extern void add_method PROTO((tree, tree *, tree)); -extern int currently_open_class PROTO((tree)); -extern tree get_vfield_offset PROTO((tree)); -extern void duplicate_tag_error PROTO((tree)); -extern tree finish_struct PROTO((tree, tree, int)); -extern tree finish_struct_1 PROTO((tree, int)); -extern int resolves_to_fixed_type_p PROTO((tree, int *)); -extern void init_class_processing PROTO((void)); -extern int is_empty_class PROTO((tree)); -extern void pushclass PROTO((tree, int)); -extern void popclass PROTO((int)); -extern void push_nested_class PROTO((tree, int)); -extern void pop_nested_class PROTO((int)); -extern void push_lang_context PROTO((tree)); -extern void pop_lang_context PROTO((void)); -extern tree instantiate_type PROTO((tree, tree, int)); -extern void print_class_statistics PROTO((void)); -extern void maybe_push_cache_obstack PROTO((void)); -extern unsigned HOST_WIDE_INT skip_rtti_stuff PROTO((tree *)); -extern tree build_self_reference PROTO((void)); -extern void warn_hidden PROTO((tree)); -extern tree get_enclosing_class PROTO((tree)); -int is_base_of_enclosing_class PROTO((tree, tree)); -extern void unreverse_member_declarations PROTO((tree)); - -/* in cvt.c */ -extern tree convert_to_reference PROTO((tree, tree, int, int, tree)); -extern tree convert_from_reference PROTO((tree)); -extern tree convert_pointer_to_real PROTO((tree, tree)); -extern tree convert_pointer_to PROTO((tree, tree)); -extern tree ocp_convert PROTO((tree, tree, int, int)); -extern tree cp_convert PROTO((tree, tree)); -extern tree convert PROTO((tree, tree)); -extern tree convert_force PROTO((tree, tree, int)); -extern tree build_type_conversion PROTO((enum tree_code, tree, tree, int)); -extern tree build_expr_type_conversion PROTO((int, tree, int)); -extern tree type_promotes_to PROTO((tree)); -extern tree perform_qualification_conversions PROTO((tree, tree)); - -/* decl.c */ -/* resume_binding_level */ -extern void set_identifier_local_value PROTO((tree, tree)); -extern int global_bindings_p PROTO((void)); -extern int toplevel_bindings_p PROTO((void)); -extern int namespace_bindings_p PROTO((void)); -extern void keep_next_level PROTO((void)); -extern int kept_level_p PROTO((void)); -extern void declare_parm_level PROTO((void)); -extern void declare_pseudo_global_level PROTO((void)); -extern int pseudo_global_level_p PROTO((void)); -extern void set_class_shadows PROTO((tree)); -extern void pushlevel PROTO((int)); -extern void note_level_for_for PROTO((void)); -extern void pushlevel_temporary PROTO((int)); -extern tree poplevel PROTO((int, int, int)); -extern void resume_level PROTO((struct binding_level *)); -extern void delete_block PROTO((tree)); -extern void insert_block PROTO((tree)); -extern void add_block_current_level PROTO((tree)); -extern void set_block PROTO((tree)); -extern void pushlevel_class PROTO((void)); -extern tree poplevel_class PROTO((int)); -extern void print_binding_stack PROTO((void)); -extern void print_binding_level PROTO((struct binding_level *)); -extern void push_namespace PROTO((tree)); -extern void pop_namespace PROTO((void)); -extern void maybe_push_to_top_level PROTO((int)); -extern void push_to_top_level PROTO((void)); -extern void pop_from_top_level PROTO((void)); -extern tree identifier_type_value PROTO((tree)); -extern void set_identifier_type_value PROTO((tree, tree)); -extern void pop_everything PROTO((void)); -extern void pushtag PROTO((tree, tree, int)); -extern tree make_anon_name PROTO((void)); -extern void clear_anon_tags PROTO((void)); -extern int decls_match PROTO((tree, tree)); -extern int duplicate_decls PROTO((tree, tree)); -extern tree pushdecl PROTO((tree)); -extern tree pushdecl_top_level PROTO((tree)); -extern void pushdecl_class_level PROTO((tree)); -#if 0 -extern void pushdecl_nonclass_level PROTO((tree)); -#endif -extern tree pushdecl_namespace_level PROTO((tree)); -extern tree push_using_decl PROTO((tree, tree)); -extern tree push_using_directive PROTO((tree)); -extern void push_class_level_binding PROTO((tree, tree)); -extern tree push_using_decl PROTO((tree, tree)); -extern tree implicitly_declare PROTO((tree)); -extern tree lookup_label PROTO((tree)); -extern tree shadow_label PROTO((tree)); -extern tree define_label PROTO((char *, int, tree)); -extern void push_switch PROTO((void)); -extern void pop_switch PROTO((void)); -extern void define_case_label PROTO((void)); -extern tree getdecls PROTO((void)); -extern tree gettags PROTO((void)); -#if 0 -extern void set_current_level_tags_transparency PROTO((int)); -#endif -extern tree binding_for_name PROTO((tree, tree)); -extern tree namespace_binding PROTO((tree, tree)); -extern void set_namespace_binding PROTO((tree, tree, tree)); -extern tree lookup_namespace_name PROTO((tree, tree)); -extern tree build_typename_type PROTO((tree, tree, tree, tree)); -extern tree make_typename_type PROTO((tree, tree)); -extern tree lookup_name_nonclass PROTO((tree)); -extern tree lookup_function_nonclass PROTO((tree, tree)); -extern tree lookup_name PROTO((tree, int)); -extern tree lookup_name_current_level PROTO((tree)); -extern tree lookup_type_current_level PROTO((tree)); -extern tree lookup_name_namespace_only PROTO((tree)); -extern void begin_only_namespace_names PROTO((void)); -extern void end_only_namespace_names PROTO((void)); -extern tree namespace_ancestor PROTO((tree, tree)); -extern int lookup_using_namespace PROTO((tree,tree,tree,tree,int)); -extern int qualified_lookup_using_namespace PROTO((tree,tree,tree,int)); -extern tree auto_function PROTO((tree, tree, enum built_in_function)); -extern void init_decl_processing PROTO((void)); -extern int init_type_desc PROTO((void)); -extern tree define_function - PROTO((char *, tree, enum built_in_function, - void (*) (tree), char *)); -extern tree check_tag_decl PROTO((tree)); -extern void shadow_tag PROTO((tree)); -extern tree groktypename PROTO((tree)); -extern tree start_decl PROTO((tree, tree, int, tree, tree)); -extern void start_decl_1 PROTO((tree)); -extern void cp_finish_decl PROTO((tree, tree, tree, int, int)); -extern void finish_decl PROTO((tree, tree, tree)); -extern void expand_static_init PROTO((tree, tree)); -extern int complete_array_type PROTO((tree, tree, int)); -extern tree build_ptrmemfunc_type PROTO((tree)); -/* the grokdeclarator prototype is in decl.h */ -extern int parmlist_is_exprlist PROTO((tree)); -extern int copy_args_p PROTO((tree)); -extern int grok_ctor_properties PROTO((tree, tree)); -extern void grok_op_properties PROTO((tree, int, int)); -extern tree xref_tag PROTO((tree, tree, int)); -extern tree xref_tag_from_type PROTO((tree, tree, int)); -extern void xref_basetypes PROTO((tree, tree, tree, tree)); -extern tree start_enum PROTO((tree)); -extern tree finish_enum PROTO((tree)); -extern tree build_enumerator PROTO((tree, tree, tree)); -extern int start_function PROTO((tree, tree, tree, int)); -extern void expand_start_early_try_stmts PROTO((void)); -extern void store_parm_decls PROTO((void)); -extern void store_return_init PROTO((tree, tree)); -extern void finish_function PROTO((int, int, int)); -extern tree start_method PROTO((tree, tree, tree)); -extern tree finish_method PROTO((tree)); -extern void hack_incomplete_structures PROTO((tree)); -extern tree maybe_build_cleanup_and_delete PROTO((tree)); -extern tree maybe_build_cleanup PROTO((tree)); -extern void cplus_expand_expr_stmt PROTO((tree)); -extern void finish_stmt PROTO((void)); -extern int id_in_current_class PROTO((tree)); -extern void push_cp_function_context PROTO((tree)); -extern void pop_cp_function_context PROTO((tree)); -extern int in_function_p PROTO((void)); -extern void replace_defarg PROTO((tree, tree)); -extern void print_other_binding_stack PROTO((struct binding_level *)); -extern void revert_static_member_fn PROTO((tree*, tree*, tree*)); -extern void cat_namespace_levels PROTO((void)); -extern void fixup_anonymous_union PROTO((tree)); -extern int check_static_variable_definition PROTO((tree, tree)); -extern void push_local_binding PROTO((tree, tree, int)); -extern void push_class_binding PROTO((tree, tree)); -extern tree check_default_argument PROTO((tree, tree)); -extern tree push_overloaded_decl PROTO((tree, int)); - -/* in decl2.c */ -extern int check_java_method PROTO((tree)); -extern int lang_decode_option PROTO((int, char **)); -extern tree grok_method_quals PROTO((tree, tree, tree)); -extern void warn_if_unknown_interface PROTO((tree)); -extern void grok_x_components PROTO((tree)); -extern void maybe_retrofit_in_chrg PROTO((tree)); -extern void maybe_make_one_only PROTO((tree)); -extern void grokclassfn PROTO((tree, tree, enum overload_flags, tree)); -extern tree grok_alignof PROTO((tree)); -extern tree grok_array_decl PROTO((tree, tree)); -extern tree delete_sanity PROTO((tree, tree, int, int)); -extern tree check_classfn PROTO((tree, tree)); -extern void check_member_template PROTO((tree)); -extern tree grokfield PROTO((tree, tree, tree, tree, tree)); -extern tree grokbitfield PROTO((tree, tree, tree)); -extern tree groktypefield PROTO((tree, tree)); -extern tree grokoptypename PROTO((tree, tree)); -extern int copy_assignment_arg_p PROTO((tree, int)); -extern void cplus_decl_attributes PROTO((tree, tree, tree)); -extern tree constructor_name_full PROTO((tree)); -extern tree constructor_name PROTO((tree)); -extern void setup_vtbl_ptr PROTO((void)); -extern void mark_inline_for_output PROTO((tree)); -extern void clear_temp_name PROTO((void)); -extern tree get_temp_name PROTO((tree, int)); -extern tree get_temp_regvar PROTO((tree, tree)); -extern void finish_anon_union PROTO((tree)); -extern tree finish_table PROTO((tree, tree, tree, int)); -extern void finish_builtin_type PROTO((tree, char *, tree *, int, tree)); -extern tree coerce_new_type PROTO((tree)); -extern tree coerce_delete_type PROTO((tree)); -extern void comdat_linkage PROTO((tree)); -extern void import_export_class PROTO((tree)); -extern void import_export_vtable PROTO((tree, tree, int)); -extern int walk_vtables PROTO((void (*)(tree, tree), - int (*)(tree, tree))); -extern void walk_sigtables PROTO((void (*)(tree, tree), - void (*)(tree, tree))); -extern void import_export_decl PROTO((tree)); -extern tree build_cleanup PROTO((tree)); -extern void finish_file PROTO((void)); -extern tree reparse_absdcl_as_expr PROTO((tree, tree)); -extern tree reparse_absdcl_as_casts PROTO((tree, tree)); -extern tree build_expr_from_tree PROTO((tree)); -extern tree reparse_decl_as_expr PROTO((tree, tree)); -extern tree finish_decl_parsing PROTO((tree)); -extern tree check_cp_case_value PROTO((tree)); -extern void set_decl_namespace PROTO((tree, tree)); -extern tree current_decl_namespace PROTO((void)); -extern void push_decl_namespace PROTO((tree)); -extern void pop_decl_namespace PROTO((void)); -extern void push_scope PROTO((tree)); -extern void pop_scope PROTO((tree)); -extern void do_namespace_alias PROTO((tree, tree)); -extern void do_toplevel_using_decl PROTO((tree)); -extern void do_local_using_decl PROTO((tree)); -extern tree do_class_using_decl PROTO((tree)); -extern void do_using_directive PROTO((tree)); -extern void check_default_args PROTO((tree)); -extern void mark_used PROTO((tree)); -extern tree handle_class_head PROTO((tree, tree, tree)); -extern tree lookup_arg_dependent PROTO((tree, tree, tree)); - -/* in errfn.c */ -extern void cp_error (); -extern void cp_error_at (); -extern void cp_warning (); -extern void cp_warning_at (); -extern void cp_pedwarn (); -extern void cp_pedwarn_at (); -extern void cp_compiler_error (); -extern void cp_sprintf (); - -/* in error.c */ -extern void init_error PROTO((void)); -extern char *fndecl_as_string PROTO((tree, int)); -extern char *type_as_string PROTO((tree, int)); -extern char *type_as_string_real PROTO((tree, int, int)); -extern char *args_as_string PROTO((tree, int)); -extern char *decl_as_string PROTO((tree, int)); -extern char *expr_as_string PROTO((tree, int)); -extern char *code_as_string PROTO((enum tree_code, int)); -extern char *language_as_string PROTO((enum languages, int)); -extern char *parm_as_string PROTO((int, int)); -extern char *op_as_string PROTO((enum tree_code, int)); -extern char *assop_as_string PROTO((enum tree_code, int)); -extern char *cv_as_string PROTO((tree, int)); -extern char *lang_decl_name PROTO((tree, int)); -extern char *cp_file_of PROTO((tree)); -extern int cp_line_of PROTO((tree)); - -/* in except.c */ -extern void init_exception_processing PROTO((void)); -extern void expand_start_catch_block PROTO((tree, tree)); -extern void expand_end_catch_block PROTO((void)); -extern void expand_builtin_throw PROTO((void)); -extern void expand_start_eh_spec PROTO((void)); -extern void expand_exception_blocks PROTO((void)); -extern tree start_anon_func PROTO((void)); -extern void end_anon_func PROTO((void)); -extern void expand_throw PROTO((tree)); -extern tree build_throw PROTO((tree)); -extern void mark_all_runtime_matches PROTO((void)); - -/* in expr.c */ -extern void init_cplus_expand PROTO((void)); -extern void fixup_result_decl PROTO((tree, struct rtx_def *)); -extern int extract_init PROTO((tree, tree)); -extern void do_case PROTO((tree, tree)); - -/* friend.c */ -extern int is_friend PROTO((tree, tree)); -extern void make_friend_class PROTO((tree, tree)); -extern tree do_friend PROTO((tree, tree, tree, tree, enum overload_flags, tree, int)); - -/* in init.c */ -extern void init_init_processing PROTO((void)); -extern void expand_direct_vtbls_init PROTO((tree, tree, int, int, tree)); -extern void emit_base_init PROTO((tree, int)); -extern void check_base_init PROTO((tree)); -extern void expand_member_init PROTO((tree, tree, tree)); -extern void expand_aggr_init PROTO((tree, tree, int)); -extern int is_aggr_typedef PROTO((tree, int)); -extern int is_aggr_type PROTO((tree, int)); -extern tree get_aggr_from_typedef PROTO((tree, int)); -extern tree get_type_value PROTO((tree)); -extern tree build_member_call PROTO((tree, tree, tree)); -extern tree build_offset_ref PROTO((tree, tree)); -extern tree resolve_offset_ref PROTO((tree)); -extern tree decl_constant_value PROTO((tree)); -extern tree build_new PROTO((tree, tree, tree, int)); -extern tree build_new_1 PROTO((tree)); -extern tree expand_vec_init PROTO((tree, tree, tree, tree, int)); -extern tree build_x_delete PROTO((tree, int, tree)); -extern tree build_delete PROTO((tree, tree, tree, int, int)); -extern tree build_vbase_delete PROTO((tree, tree)); -extern tree build_vec_delete PROTO((tree, tree, tree, tree, int)); - -/* in input.c */ - -/* in lex.c */ -extern char *file_name_nondirectory PROTO((char *)); -extern tree make_pointer_declarator PROTO((tree, tree)); -extern tree make_reference_declarator PROTO((tree, tree)); -extern tree make_call_declarator PROTO((tree, tree, tree, tree)); -extern void set_quals_and_spec PROTO((tree, tree, tree)); -extern char *operator_name_string PROTO((tree)); -extern void lang_init PROTO((void)); -extern void lang_finish PROTO((void)); -extern void init_filename_times PROTO((void)); -#if 0 -extern void reinit_lang_specific PROTO((void)); -#endif -extern void reinit_parse_for_function PROTO((void)); -extern void print_parse_statistics PROTO((void)); -extern void extract_interface_info PROTO((void)); -extern void do_pending_inlines PROTO((void)); -extern void process_next_inline PROTO((tree)); -extern struct pending_input *save_pending_input PROTO((void)); -extern void restore_pending_input PROTO((struct pending_input *)); -extern void yyungetc PROTO((int, int)); -extern void reinit_parse_for_method PROTO((int, tree)); -extern void reinit_parse_for_block PROTO((int, struct obstack *)); -extern tree cons_up_default_function PROTO((tree, tree, int)); -extern void check_for_missing_semicolon PROTO((tree)); -extern void note_got_semicolon PROTO((tree)); -extern void note_list_got_semicolon PROTO((tree)); -extern void do_pending_lang_change PROTO((void)); -extern int identifier_type PROTO((tree)); -extern void see_typename PROTO((void)); -extern tree do_identifier PROTO((tree, int, tree)); -extern tree do_scoped_id PROTO((tree, int)); -extern tree identifier_typedecl_value PROTO((tree)); -extern int real_yylex PROTO((void)); -extern int is_rid PROTO((tree)); -extern tree build_lang_decl PROTO((enum tree_code, tree, tree)); -extern void retrofit_lang_decl PROTO((tree)); -extern tree build_lang_field_decl PROTO((enum tree_code, tree, tree)); -extern void copy_lang_decl PROTO((tree)); -extern tree make_lang_type PROTO((enum tree_code)); -extern void dump_time_statistics PROTO((void)); -/* extern void compiler_error PROTO((char *, HOST_WIDE_INT, HOST_WIDE_INT)); */ -extern void yyerror PROTO((char *)); -extern void clear_inline_text_obstack PROTO((void)); -extern void maybe_snarf_defarg PROTO((void)); -extern tree snarf_defarg PROTO((void)); -extern void add_defarg_fn PROTO((tree)); -extern void do_pending_defargs PROTO((void)); -extern int identifier_type PROTO((tree)); -extern void yyhook PROTO((int)); -extern int cp_type_qual_from_rid PROTO((tree)); - -/* in method.c */ -extern void init_method PROTO((void)); -extern void do_inline_function_hair PROTO((tree, tree)); -extern char *build_overload_name PROTO((tree, int, int)); -extern tree build_static_name PROTO((tree, tree)); -extern tree build_decl_overload PROTO((tree, tree, int)); -extern tree build_decl_overload_real PROTO((tree, tree, tree, tree, - tree, int)); -extern void set_mangled_name_for_decl PROTO((tree)); -extern tree build_typename_overload PROTO((tree)); -extern tree build_overload_with_type PROTO((tree, tree)); -extern tree build_destructor_name PROTO((tree)); -extern tree build_opfncall PROTO((enum tree_code, int, tree, tree, tree)); -extern tree hack_identifier PROTO((tree, tree)); -extern tree make_thunk PROTO((tree, int)); -extern void emit_thunk PROTO((tree)); -extern void synthesize_method PROTO((tree)); -extern tree get_id_2 PROTO((char *, tree)); - -/* in pt.c */ -extern void check_template_shadow PROTO ((tree)); -extern tree innermost_args PROTO ((tree)); -extern tree tsubst PROTO ((tree, tree, tree)); -extern tree tsubst_expr PROTO ((tree, tree, tree)); -extern tree tsubst_copy PROTO ((tree, tree, tree)); -extern void maybe_begin_member_template_processing PROTO((tree)); -extern void maybe_end_member_template_processing PROTO((void)); -extern tree finish_member_template_decl PROTO((tree)); -extern void begin_template_parm_list PROTO((void)); -extern void begin_specialization PROTO((void)); -extern void reset_specialization PROTO((void)); -extern void end_specialization PROTO((void)); -extern void begin_explicit_instantiation PROTO((void)); -extern void end_explicit_instantiation PROTO((void)); -extern tree determine_specialization PROTO((tree, tree, tree *, int, int)); -extern tree check_explicit_specialization PROTO((tree, tree, int, int)); -extern tree process_template_parm PROTO((tree, tree)); -extern tree end_template_parm_list PROTO((tree)); -extern void end_template_decl PROTO((void)); -extern tree current_template_args PROTO((void)); -extern tree push_template_decl PROTO((tree)); -extern tree push_template_decl_real PROTO((tree, int)); -extern void redeclare_class_template PROTO((tree, tree)); -extern tree lookup_template_class PROTO((tree, tree, tree, tree, int)); -extern tree lookup_template_function PROTO((tree, tree)); -extern int uses_template_parms PROTO((tree)); -extern tree instantiate_class_template PROTO((tree)); -extern tree instantiate_template PROTO((tree, tree)); -extern void overload_template_name PROTO((tree)); -extern int fn_type_unification PROTO((tree, tree, tree, tree, tree, unification_kind_t, tree)); -extern int type_unification PROTO((tree, tree, tree, tree, tree, unification_kind_t, int)); -struct tinst_level *tinst_for_decl PROTO((void)); -extern void mark_decl_instantiated PROTO((tree, int)); -extern int more_specialized PROTO((tree, tree, tree)); -extern void mark_class_instantiated PROTO((tree, int)); -extern void do_decl_instantiation PROTO((tree, tree, tree)); -extern void do_type_instantiation PROTO((tree, tree)); -extern tree instantiate_decl PROTO((tree)); -extern tree do_poplevel PROTO((void)); -extern tree get_bindings PROTO((tree, tree, tree)); -/* CONT ... */ -extern void add_tree PROTO((tree)); -extern void begin_tree PROTO((void)); -extern void end_tree PROTO((void)); -extern void add_maybe_template PROTO((tree, tree)); -extern void pop_tinst_level PROTO((void)); -extern int more_specialized_class PROTO((tree, tree)); -extern void do_pushlevel PROTO((void)); -extern int is_member_template PROTO((tree)); -extern int template_parms_equal PROTO((tree, tree)); -extern int comp_template_parms PROTO((tree, tree)); -extern int template_class_depth PROTO((tree)); -extern int is_specialization_of PROTO((tree, tree)); -extern int comp_template_args PROTO((tree, tree)); -extern void maybe_process_partial_specialization PROTO((tree)); -extern void maybe_check_template_type PROTO((tree)); -extern tree most_specialized_instantiation PROTO((tree, tree)); -extern void print_candidates PROTO((tree)); - -extern int processing_specialization; -extern int processing_explicit_instantiation; -extern int processing_template_parmlist; - -/* in repo.c */ -extern void repo_template_used PROTO((tree)); -extern void repo_template_instantiated PROTO((tree, int)); -extern void init_repo PROTO((char*)); -extern void finish_repo PROTO((void)); - -/* in rtti.c */ -extern void init_rtti_processing PROTO((void)); -extern tree get_tinfo_fn_dynamic PROTO((tree)); -extern tree build_typeid PROTO((tree)); -extern tree build_x_typeid PROTO((tree)); -extern tree get_tinfo_fn PROTO((tree)); -extern tree get_typeid PROTO((tree)); -extern tree get_typeid_1 PROTO((tree)); -extern tree build_dynamic_cast PROTO((tree, tree)); -extern void synthesize_tinfo_fn PROTO((tree)); - -/* in search.c */ -extern int types_overlap_p PROTO((tree, tree)); -extern tree get_vbase PROTO((tree, tree)); -extern tree get_binfo PROTO((tree, tree, int)); -extern int get_base_distance PROTO((tree, tree, int, tree *)); -extern tree compute_access PROTO((tree, tree)); -extern tree lookup_field PROTO((tree, tree, int, int)); -extern tree lookup_nested_field PROTO((tree, int)); -extern tree lookup_fnfields PROTO((tree, tree, int)); -extern tree lookup_member PROTO((tree, tree, int, int)); -extern tree lookup_nested_tag PROTO((tree, tree)); -extern tree get_matching_virtual PROTO((tree, tree, int)); -extern tree get_abstract_virtuals PROTO((tree)); -extern tree get_baselinks PROTO((tree, tree, tree)); -extern tree next_baselink PROTO((tree)); -extern tree init_vbase_pointers PROTO((tree, tree)); -extern void expand_indirect_vtbls_init PROTO((tree, tree, tree)); -extern void clear_search_slots PROTO((tree)); -extern tree get_vbase_types PROTO((tree)); -extern void note_debug_info_needed PROTO((tree)); -extern void push_class_decls PROTO((tree)); -extern void pop_class_decls PROTO((void)); -extern void unuse_fields PROTO((tree)); -extern void print_search_statistics PROTO((void)); -extern void init_search_processing PROTO((void)); -extern void reinit_search_statistics PROTO((void)); -extern tree current_scope PROTO((void)); -extern tree lookup_conversions PROTO((tree)); -extern tree get_template_base PROTO((tree, tree)); -extern tree binfo_for_vtable PROTO((tree)); - -/* in semantics.c */ -extern void finish_expr_stmt PROTO((tree)); -extern tree begin_if_stmt PROTO((void)); -extern void finish_if_stmt_cond PROTO((tree, tree)); -extern tree finish_then_clause PROTO((tree)); -extern void begin_else_clause PROTO((void)); -extern void finish_else_clause PROTO((tree)); -extern void finish_if_stmt PROTO((void)); -extern tree begin_while_stmt PROTO((void)); -extern void finish_while_stmt_cond PROTO((tree, tree)); -extern void finish_while_stmt PROTO((tree)); -extern tree begin_do_stmt PROTO((void)); -extern void finish_do_body PROTO((tree)); -extern void finish_do_stmt PROTO((tree, tree)); -extern void finish_return_stmt PROTO((tree)); -extern tree begin_for_stmt PROTO((void)); -extern void finish_for_init_stmt PROTO((tree)); -extern void finish_for_cond PROTO((tree, tree)); -extern void finish_for_expr PROTO((tree, tree)); -extern void finish_for_stmt PROTO((tree, tree)); -extern void finish_break_stmt PROTO((void)); -extern void finish_continue_stmt PROTO((void)); -extern void begin_switch_stmt PROTO((void)); -extern tree finish_switch_cond PROTO((tree)); -extern void finish_switch_stmt PROTO((tree, tree)); -extern void finish_case_label PROTO((tree, tree)); -extern void finish_goto_stmt PROTO((tree)); -extern tree begin_try_block PROTO((void)); -extern void finish_try_block PROTO((tree)); -extern void finish_handler_sequence PROTO((tree)); -extern tree begin_handler PROTO((void)); -extern void finish_handler_parms PROTO((tree)); -extern void finish_handler PROTO((tree)); -extern tree begin_compound_stmt PROTO((int)); -extern tree finish_compound_stmt PROTO((int, tree)); -extern void finish_asm_stmt PROTO((tree, tree, tree, tree, tree)); -extern tree finish_parenthesized_expr PROTO((tree)); -extern tree begin_stmt_expr PROTO((void)); -extern tree finish_stmt_expr PROTO((tree, tree)); -extern tree finish_call_expr PROTO((tree, tree, int)); -extern tree finish_increment_expr PROTO((tree, enum tree_code)); -extern tree finish_this_expr PROTO((void)); -extern tree finish_object_call_expr PROTO((tree, tree, tree)); -extern tree finish_qualified_object_call_expr PROTO((tree, tree, tree)); -extern tree finish_pseudo_destructor_call_expr PROTO((tree, tree, tree)); -extern tree finish_qualified_call_expr PROTO ((tree, tree)); -extern tree finish_label_address_expr PROTO((tree)); -extern tree finish_unary_op_expr PROTO((enum tree_code, tree)); -extern tree finish_id_expr PROTO((tree)); -extern int begin_new_placement PROTO((void)); -extern tree finish_new_placement PROTO((tree, int)); -extern int begin_function_definition PROTO((tree, tree)); -extern tree begin_constructor_declarator PROTO((tree, tree)); -extern tree finish_declarator PROTO((tree, tree, tree, tree, int)); -extern void finish_translation_unit PROTO((void)); -extern tree finish_template_type_parm PROTO((tree, tree)); -extern tree finish_template_template_parm PROTO((tree, tree)); -extern tree finish_parmlist PROTO((tree, int)); -extern tree begin_class_definition PROTO((tree)); -extern tree finish_class_definition PROTO((tree, tree, int)); -extern void finish_default_args PROTO((void)); -extern void begin_inline_definitions PROTO((void)); -extern tree finish_member_class_template PROTO((tree)); -extern void finish_template_decl PROTO((tree)); -extern tree finish_template_type PROTO((tree, tree, int)); -extern void enter_scope_of PROTO((tree)); -extern tree finish_base_specifier PROTO((tree, tree, int)); -extern void finish_member_declaration PROTO((tree)); -extern void check_multiple_declarators PROTO((void)); -extern tree finish_typeof PROTO((tree)); - -/* in sig.c */ -extern tree build_signature_pointer_type PROTO((tree)); -extern tree build_signature_reference_type PROTO((tree)); -extern tree build_signature_pointer_constructor PROTO((tree, tree)); -extern tree build_signature_method_call PROTO((tree, tree)); -extern tree build_optr_ref PROTO((tree)); -extern void append_signature_fields PROTO((tree)); - -/* in spew.c */ -extern void init_spew PROTO((void)); -extern int peekyylex PROTO((void)); -extern int yylex PROTO((void)); -extern tree arbitrate_lookup PROTO((tree, tree, tree)); - -/* in tree.c */ -extern int pod_type_p PROTO((tree)); -extern void unshare_base_binfos PROTO((tree)); -extern int member_p PROTO((tree)); -extern int real_lvalue_p PROTO((tree)); -extern tree build_min PVPROTO((enum tree_code, tree, ...)); -extern tree build_min_nt PVPROTO((enum tree_code, ...)); -extern tree min_tree_cons PROTO((tree, tree, tree)); -extern int lvalue_p PROTO((tree)); -extern int lvalue_or_else PROTO((tree, char *)); -extern tree build_cplus_new PROTO((tree, tree)); -extern tree get_target_expr PROTO((tree)); -extern tree break_out_cleanups PROTO((tree)); -extern tree break_out_calls PROTO((tree)); -extern tree build_cplus_method_type PROTO((tree, tree, tree)); -extern tree build_cplus_staticfn_type PROTO((tree, tree, tree)); -extern tree build_cplus_array_type PROTO((tree, tree)); -extern int layout_basetypes PROTO((tree, int)); -extern tree build_vbase_pointer_fields PROTO((tree)); -extern tree build_base_fields PROTO((tree)); -extern tree hash_tree_cons PROTO((int, int, int, tree, tree, tree)); -extern tree hash_tree_chain PROTO((tree, tree)); -extern tree hash_chainon PROTO((tree, tree)); -extern tree get_decl_list PROTO((tree)); -extern tree make_binfo PROTO((tree, tree, tree, tree)); -extern tree binfo_value PROTO((tree, tree)); -extern tree reverse_path PROTO((tree)); -extern int count_functions PROTO((tree)); -extern int is_overloaded_fn PROTO((tree)); -extern tree get_first_fn PROTO((tree)); -extern tree binding_init PROTO((struct tree_binding*)); -extern int bound_pmf_p PROTO((tree)); -extern tree ovl_cons PROTO((tree, tree)); -extern tree scratch_ovl_cons PROTO((tree, tree)); -extern int ovl_member PROTO((tree, tree)); -extern tree build_overload PROTO((tree, tree)); -extern tree fnaddr_from_vtable_entry PROTO((tree)); -extern tree function_arg_chain PROTO((tree)); -extern int promotes_to_aggr_type PROTO((tree, enum tree_code)); -extern int is_aggr_type_2 PROTO((tree, tree)); -extern char *lang_printable_name PROTO((tree, int)); -extern tree build_exception_variant PROTO((tree, tree)); -extern tree copy_template_template_parm PROTO((tree)); -extern tree copy_to_permanent PROTO((tree)); -extern void print_lang_statistics PROTO((void)); -extern void __eprintf - PROTO((const char *, const char *, unsigned, const char *)); -extern tree array_type_nelts_total PROTO((tree)); -extern tree array_type_nelts_top PROTO((tree)); -extern tree break_out_target_exprs PROTO((tree)); -extern tree get_type_decl PROTO((tree)); -extern tree vec_binfo_member PROTO((tree, tree)); -extern tree hack_decl_function_context PROTO((tree)); -extern tree lvalue_type PROTO((tree)); -extern tree error_type PROTO((tree)); -extern tree make_temp_vec PROTO((int)); -extern tree build_ptr_wrapper PROTO((void *)); -extern tree build_expr_ptr_wrapper PROTO((void *)); -extern tree build_int_wrapper PROTO((int)); -extern tree build_srcloc PROTO((char *, int)); -extern tree build_srcloc_here PROTO((void)); -extern int varargs_function_p PROTO((tree)); -extern int really_overloaded_fn PROTO((tree)); -extern int cp_tree_equal PROTO((tree, tree)); -extern int can_free PROTO((struct obstack *, tree)); -extern tree mapcar PROTO((tree, tree (*) (tree))); -extern tree no_linkage_check PROTO((tree)); -extern void debug_binfo PROTO((tree)); -extern void push_expression_obstack PROTO((void)); -extern tree build_dummy_object PROTO((tree)); -extern tree maybe_dummy_object PROTO((tree, tree *)); -extern int is_dummy_object PROTO((tree)); -extern tree search_tree PROTO((tree, tree (*)(tree))); -#define scratchalloc expralloc -#define scratch_tree_cons expr_tree_cons -#define build_scratch_list build_expr_list -#define make_scratch_vec make_temp_vec -#define push_scratch_obstack push_expression_obstack -#define hash_tree_cons_simple(PURPOSE, VALUE, CHAIN) \ - hash_tree_cons (0, 0, 0, (PURPOSE), (VALUE), (CHAIN)) - -/* in typeck.c */ -extern int string_conv_p PROTO((tree, tree, int)); -extern tree condition_conversion PROTO((tree)); -extern tree target_type PROTO((tree)); -extern tree require_complete_type PROTO((tree)); -extern tree complete_type PROTO((tree)); -extern tree complete_type_or_else PROTO((tree)); -extern int type_unknown_p PROTO((tree)); -extern int fntype_p PROTO((tree)); -extern tree commonparms PROTO((tree, tree)); -extern tree original_type PROTO((tree)); -extern tree common_type PROTO((tree, tree)); -extern int compexcepttypes PROTO((tree, tree)); -extern int comptypes PROTO((tree, tree, int)); -extern int comp_target_types PROTO((tree, tree, int)); -extern int compparms PROTO((tree, tree)); -extern int comp_target_types PROTO((tree, tree, int)); -extern int comp_cv_qualification PROTO((tree, tree)); -extern int comp_cv_qual_signature PROTO((tree, tree)); -extern int self_promoting_args_p PROTO((tree)); -extern tree unsigned_type PROTO((tree)); -extern tree signed_type PROTO((tree)); -extern tree signed_or_unsigned_type PROTO((int, tree)); -extern tree expr_sizeof PROTO((tree)); -extern tree c_sizeof PROTO((tree)); -extern tree c_sizeof_nowarn PROTO((tree)); -extern tree c_alignof PROTO((tree)); -extern tree inline_conversion PROTO((tree)); -extern tree decay_conversion PROTO((tree)); -extern tree default_conversion PROTO((tree)); -extern tree build_object_ref PROTO((tree, tree, tree)); -extern tree build_component_ref_1 PROTO((tree, tree, int)); -extern tree build_component_ref PROTO((tree, tree, tree, int)); -extern tree build_x_component_ref PROTO((tree, tree, tree, int)); -extern tree build_x_indirect_ref PROTO((tree, char *)); -extern tree build_indirect_ref PROTO((tree, char *)); -extern tree build_array_ref PROTO((tree, tree)); -extern tree build_x_function_call PROTO((tree, tree, tree)); -extern tree get_member_function_from_ptrfunc PROTO((tree *, tree)); -extern tree build_function_call_real PROTO((tree, tree, int, int)); -extern tree build_function_call PROTO((tree, tree)); -extern tree build_function_call_maybe PROTO((tree, tree)); -extern tree convert_arguments PROTO((tree, tree, tree, int)); -extern tree build_x_binary_op PROTO((enum tree_code, tree, tree)); -extern tree build_binary_op PROTO((enum tree_code, tree, tree, int)); -extern tree build_binary_op_nodefault PROTO((enum tree_code, tree, tree, enum tree_code)); -extern tree build_component_addr PROTO((tree, tree, char *)); -extern tree build_x_unary_op PROTO((enum tree_code, tree)); -extern tree build_unary_op PROTO((enum tree_code, tree, int)); -extern tree unary_complex_lvalue PROTO((enum tree_code, tree)); -extern int mark_addressable PROTO((tree)); -extern tree build_x_conditional_expr PROTO((tree, tree, tree)); -extern tree build_conditional_expr PROTO((tree, tree, tree)); -extern tree build_x_compound_expr PROTO((tree)); -extern tree build_compound_expr PROTO((tree)); -extern tree build_static_cast PROTO((tree, tree)); -extern tree build_reinterpret_cast PROTO((tree, tree)); -extern tree build_const_cast PROTO((tree, tree)); -extern tree build_c_cast PROTO((tree, tree)); -extern tree build_x_modify_expr PROTO((tree, enum tree_code, tree)); -extern tree build_modify_expr PROTO((tree, enum tree_code, tree)); -extern void warn_for_assignment PROTO((char *, char *, char *, tree, int, int)); -extern tree convert_for_initialization PROTO((tree, tree, tree, int, char *, tree, int)); -extern void c_expand_asm_operands PROTO((tree, tree, tree, tree, int, char *, int)); -extern void c_expand_return PROTO((tree)); -extern tree c_expand_start_case PROTO((tree)); -extern int comp_ptr_ttypes PROTO((tree, tree)); -extern int ptr_reasonably_similar PROTO((tree, tree)); -extern tree build_ptrmemfunc PROTO((tree, tree, int)); -extern int cp_type_quals PROTO((tree)); -extern int cp_has_mutable_p PROTO((tree)); -extern int at_least_as_qualified_p PROTO((tree, tree)); -extern int more_qualified_p PROTO((tree, tree)); - -/* in typeck2.c */ -extern tree error_not_base_type PROTO((tree, tree)); -extern tree binfo_or_else PROTO((tree, tree)); -extern void readonly_error PROTO((tree, char *, int)); -extern void abstract_virtuals_error PROTO((tree, tree)); -extern void signature_error PROTO((tree, tree)); -extern void incomplete_type_error PROTO((tree, tree)); -extern void my_friendly_abort PROTO((int)) - ATTRIBUTE_NORETURN; -extern void my_friendly_assert PROTO((int, int)); -extern tree store_init_value PROTO((tree, tree)); -extern tree digest_init PROTO((tree, tree, tree *)); -extern tree build_scoped_ref PROTO((tree, tree)); -extern tree build_x_arrow PROTO((tree)); -extern tree build_m_component_ref PROTO((tree, tree)); -extern tree build_functional_cast PROTO((tree, tree)); -extern char *enum_name_string PROTO((tree, tree)); -extern void report_case_error PROTO((int, tree, tree, tree)); -extern void check_for_new_type PROTO((char *,flagged_type_tree)); -extern tree initializer_constant_valid_p PROTO((tree, tree)); - -/* in xref.c */ -extern void GNU_xref_begin PROTO((char *)); -extern void GNU_xref_end PROTO((int)); -extern void GNU_xref_file PROTO((char *)); -extern void GNU_xref_start_scope PROTO((HOST_WIDE_INT)); -extern void GNU_xref_end_scope PROTO((HOST_WIDE_INT, HOST_WIDE_INT, int, int)); -extern void GNU_xref_ref PROTO((tree, char *)); -extern void GNU_xref_decl PROTO((tree, tree)); -extern void GNU_xref_call PROTO((tree, char *)); -extern void GNU_xref_function PROTO((tree, tree)); -extern void GNU_xref_assign PROTO((tree)); -extern void GNU_xref_hier PROTO((tree, tree, int, int, int)); -extern void GNU_xref_member PROTO((tree, tree)); - -/* -- end of C++ */ - -#endif /* not _CP_TREE_H */ diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c deleted file mode 100755 index b73020f..0000000 --- a/gcc/cp/cvt.c +++ /dev/null @@ -1,1143 +0,0 @@ -/* Language-level data type conversion for GNU C++. - Copyright (C) 1987, 88, 92-97, 1998 Free Software Foundation, Inc. - Hacked by Michael Tiemann (tiemann@cygnus.com) - -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 -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - - -/* This file contains the functions for converting C expressions - to different data types. The only entry point is `convert'. - Every language front end must have a `convert' function - but what kind of conversions it does will depend on the language. */ - -#include "config.h" -#include "system.h" -#include "tree.h" -#include "flags.h" -#include "cp-tree.h" -#include "convert.h" -#include "toplev.h" -#include "decl.h" - -static tree cp_convert_to_pointer PROTO((tree, tree)); -static tree convert_to_pointer_force PROTO((tree, tree)); -static tree build_up_reference PROTO((tree, tree, int)); - -/* Change of width--truncation and extension of integers or reals-- - is represented with NOP_EXPR. Proper functioning of many things - assumes that no other conversions can be NOP_EXPRs. - - Conversion between integer and pointer is represented with CONVERT_EXPR. - Converting integer to real uses FLOAT_EXPR - and real to integer uses FIX_TRUNC_EXPR. - - Here is a list of all the functions that assume that widening and - narrowing is always done with a NOP_EXPR: - In convert.c, convert_to_integer. - In c-typeck.c, build_binary_op_nodefault (boolean ops), - and truthvalue_conversion. - In expr.c: expand_expr, for operands of a MULT_EXPR. - In fold-const.c: fold. - In tree.c: get_narrower and get_unwidened. - - C++: in multiple-inheritance, converting between pointers may involve - adjusting them by a delta stored within the class definition. */ - -/* Subroutines of `convert'. */ - -/* if converting pointer to pointer - if dealing with classes, check for derived->base or vice versa - else if dealing with method pointers, delegate - else convert blindly - else if converting class, pass off to build_type_conversion - else try C-style pointer conversion */ - -static tree -cp_convert_to_pointer (type, expr) - tree type, expr; -{ - register tree intype = TREE_TYPE (expr); - register enum tree_code form; - tree rval; - - if (IS_AGGR_TYPE (intype)) - { - intype = complete_type (intype); - if (TYPE_SIZE (intype) == NULL_TREE) - { - cp_error ("can't convert from incomplete type `%T' to `%T'", - intype, type); - return error_mark_node; - } - - rval = build_type_conversion (CONVERT_EXPR, type, expr, 1); - if (rval) - { - if (rval == error_mark_node) - cp_error ("conversion of `%E' from `%T' to `%T' is ambiguous", - expr, intype, type); - return rval; - } - } - - /* Handle anachronistic conversions from (::*)() to cv void* or (*)(). */ - if (TREE_CODE (type) == POINTER_TYPE - && (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE - || TYPE_MAIN_VARIANT (TREE_TYPE (type)) == void_type_node)) - { - /* Allow an implicit this pointer for pointer to member - functions. */ - if (TYPE_PTRMEMFUNC_P (intype)) - { - tree fntype = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (intype)); - tree decl = maybe_dummy_object (TYPE_METHOD_BASETYPE (fntype), 0); - expr = build (OFFSET_REF, fntype, decl, expr); - } - - if (TREE_CODE (expr) == OFFSET_REF - && TREE_CODE (TREE_TYPE (expr)) == METHOD_TYPE) - expr = resolve_offset_ref (expr); - if (TREE_CODE (TREE_TYPE (expr)) == METHOD_TYPE) - expr = build_addr_func (expr); - if (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE) - { - if (TREE_CODE (TREE_TYPE (TREE_TYPE (expr))) == METHOD_TYPE) - if (pedantic || warn_pmf2ptr) - cp_pedwarn ("converting from `%T' to `%T'", TREE_TYPE (expr), - type); - return build1 (NOP_EXPR, type, expr); - } - intype = TREE_TYPE (expr); - } - - form = TREE_CODE (intype); - - if (POINTER_TYPE_P (intype)) - { - intype = TYPE_MAIN_VARIANT (intype); - - if (TYPE_MAIN_VARIANT (type) != intype - && TREE_CODE (type) == POINTER_TYPE - && TREE_CODE (TREE_TYPE (type)) == RECORD_TYPE - && IS_AGGR_TYPE (TREE_TYPE (type)) - && IS_AGGR_TYPE (TREE_TYPE (intype)) - && TREE_CODE (TREE_TYPE (intype)) == RECORD_TYPE - /* If EXPR is NULL, then we don't need to do any arithmetic - to convert it: - - [conv.ptr] - - The null pointer value is converted to the null pointer - value of the destination type. */ - && !integer_zerop (expr)) - { - enum tree_code code = PLUS_EXPR; - tree binfo = get_binfo (TREE_TYPE (type), TREE_TYPE (intype), 1); - if (binfo == error_mark_node) - return error_mark_node; - if (binfo == NULL_TREE) - { - binfo = get_binfo (TREE_TYPE (intype), TREE_TYPE (type), 1); - if (binfo == error_mark_node) - return error_mark_node; - code = MINUS_EXPR; - } - if (binfo) - { - if (TYPE_USES_VIRTUAL_BASECLASSES (TREE_TYPE (type)) - || TYPE_USES_VIRTUAL_BASECLASSES (TREE_TYPE (intype)) - || ! BINFO_OFFSET_ZEROP (binfo)) - { - /* Need to get the path we took. */ - tree path; - - if (code == PLUS_EXPR) - get_base_distance (TREE_TYPE (type), TREE_TYPE (intype), - 0, &path); - else - get_base_distance (TREE_TYPE (intype), TREE_TYPE (type), - 0, &path); - return build_vbase_path (code, type, expr, path, 0); - } - } - } - - if (TREE_CODE (type) == POINTER_TYPE - && TREE_CODE (TREE_TYPE (type)) == OFFSET_TYPE - && TREE_CODE (TREE_TYPE (intype)) == OFFSET_TYPE) - { - tree b1 = TYPE_OFFSET_BASETYPE (TREE_TYPE (type)); - tree b2 = TYPE_OFFSET_BASETYPE (TREE_TYPE (intype)); - tree binfo = get_binfo (b2, b1, 1); - enum tree_code code = PLUS_EXPR; - - if (binfo == NULL_TREE) - { - binfo = get_binfo (b1, b2, 1); - code = MINUS_EXPR; - } - - if (binfo == error_mark_node) - return error_mark_node; - if (binfo && ! TREE_VIA_VIRTUAL (binfo)) - expr = size_binop (code, expr, BINFO_OFFSET (binfo)); - } - else if (TYPE_PTRMEMFUNC_P (type)) - { - cp_error ("cannot convert `%E' from type `%T' to type `%T'", - expr, intype, type); - return error_mark_node; - } - - rval = build1 (NOP_EXPR, type, expr); - TREE_CONSTANT (rval) = TREE_CONSTANT (expr); - return rval; - } - else if (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype)) - return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr, 1); - else if (TYPE_PTRMEMFUNC_P (intype)) - { - cp_error ("cannot convert `%E' from type `%T' to type `%T'", - expr, intype, type); - return error_mark_node; - } - - my_friendly_assert (form != OFFSET_TYPE, 186); - - if (TYPE_LANG_SPECIFIC (intype) - && (IS_SIGNATURE_POINTER (intype) || IS_SIGNATURE_REFERENCE (intype))) - return convert_to_pointer (type, build_optr_ref (expr)); - - if (integer_zerop (expr)) - { - if (TYPE_PTRMEMFUNC_P (type)) - return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr, 0); - expr = build_int_2 (0, 0); - TREE_TYPE (expr) = type; - return expr; - } - - if (INTEGRAL_CODE_P (form)) - { - if (TYPE_PRECISION (intype) == POINTER_SIZE) - return build1 (CONVERT_EXPR, type, expr); - expr = cp_convert (type_for_size (POINTER_SIZE, 0), expr); - /* Modes may be different but sizes should be the same. */ - if (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (expr))) - != GET_MODE_SIZE (TYPE_MODE (type))) - /* There is supposed to be some integral type - that is the same width as a pointer. */ - abort (); - return convert_to_pointer (type, expr); - } - - if (type_unknown_p (expr)) - return instantiate_type (type, expr, 1); - - cp_error ("cannot convert `%E' from type `%T' to type `%T'", - expr, intype, type); - return error_mark_node; -} - -/* Like convert, except permit conversions to take place which - are not normally allowed due to access restrictions - (such as conversion from sub-type to private super-type). */ - -static tree -convert_to_pointer_force (type, expr) - tree type, expr; -{ - register tree intype = TREE_TYPE (expr); - register enum tree_code form = TREE_CODE (intype); - - if (integer_zerop (expr)) - { - expr = build_int_2 (0, 0); - TREE_TYPE (expr) = type; - return expr; - } - - /* Convert signature pointer/reference to `void *' first. */ - if (form == RECORD_TYPE - && (IS_SIGNATURE_POINTER (intype) || IS_SIGNATURE_REFERENCE (intype))) - { - expr = build_optr_ref (expr); - intype = TREE_TYPE (expr); - form = TREE_CODE (intype); - } - - if (form == POINTER_TYPE) - { - intype = TYPE_MAIN_VARIANT (intype); - - if (TYPE_MAIN_VARIANT (type) != intype - && TREE_CODE (TREE_TYPE (type)) == RECORD_TYPE - && IS_AGGR_TYPE (TREE_TYPE (type)) - && IS_AGGR_TYPE (TREE_TYPE (intype)) - && TREE_CODE (TREE_TYPE (intype)) == RECORD_TYPE) - { - enum tree_code code = PLUS_EXPR; - tree path; - int distance = get_base_distance (TREE_TYPE (type), - TREE_TYPE (intype), 0, &path); - if (distance == -2) - { - ambig: - cp_error ("type `%T' is ambiguous baseclass of `%s'", - TREE_TYPE (type), - TYPE_NAME_STRING (TREE_TYPE (intype))); - return error_mark_node; - } - if (distance == -1) - { - distance = get_base_distance (TREE_TYPE (intype), - TREE_TYPE (type), 0, &path); - if (distance == -2) - goto ambig; - if (distance < 0) - /* Doesn't need any special help from us. */ - return build1 (NOP_EXPR, type, expr); - - code = MINUS_EXPR; - } - return build_vbase_path (code, type, expr, path, 0); - } - } - - return cp_convert_to_pointer (type, expr); -} - -/* We are passing something to a function which requires a reference. - The type we are interested in is in TYPE. The initial - value we have to begin with is in ARG. - - FLAGS controls how we manage access checking. - DIRECT_BIND in FLAGS controls how any temporaries are generated. */ - -static tree -build_up_reference (type, arg, flags) - tree type, arg; - int flags; -{ - tree rval; - tree argtype = TREE_TYPE (arg); - tree target_type = TREE_TYPE (type); - - my_friendly_assert (TREE_CODE (type) == REFERENCE_TYPE, 187); - - if ((flags & DIRECT_BIND) && ! real_lvalue_p (arg)) - { - tree targ = arg; - if (toplevel_bindings_p ()) - arg = get_temp_name (argtype, 1); - else - { - arg = pushdecl (build_decl (VAR_DECL, NULL_TREE, argtype)); - DECL_ARTIFICIAL (arg) = 1; - } - DECL_INITIAL (arg) = targ; - cp_finish_decl (arg, targ, NULL_TREE, 0, - LOOKUP_ONLYCONVERTING|DIRECT_BIND); - } - else if (!(flags & DIRECT_BIND) && ! lvalue_p (arg)) - { - tree slot = build_decl (VAR_DECL, NULL_TREE, argtype); - DECL_ARTIFICIAL (slot) = 1; - arg = build (TARGET_EXPR, argtype, slot, arg, NULL_TREE, NULL_TREE); - TREE_SIDE_EFFECTS (arg) = 1; - } - - /* If we had a way to wrap this up, and say, if we ever needed it's - address, transform all occurrences of the register, into a memory - reference we could win better. */ - rval = build_unary_op (ADDR_EXPR, arg, 1); - if (rval == error_mark_node) - return error_mark_node; - - if ((flags & LOOKUP_PROTECT) - && TYPE_MAIN_VARIANT (argtype) != TYPE_MAIN_VARIANT (target_type) - && IS_AGGR_TYPE (argtype) - && IS_AGGR_TYPE (target_type)) - { - /* We go through get_binfo for the access control. */ - tree binfo = get_binfo (target_type, argtype, 1); - if (binfo == error_mark_node) - return error_mark_node; - if (binfo == NULL_TREE) - return error_not_base_type (target_type, argtype); - rval = convert_pointer_to_real (binfo, rval); - } - else - rval - = convert_to_pointer_force (build_pointer_type (target_type), rval); - rval = build1 (NOP_EXPR, type, rval); - TREE_CONSTANT (rval) = TREE_CONSTANT (TREE_OPERAND (rval, 0)); - return rval; -} - -/* For C++: Only need to do one-level references, but cannot - get tripped up on signed/unsigned differences. - - DECL is either NULL_TREE or the _DECL node for a reference that is being - initialized. It can be error_mark_node if we don't know the _DECL but - we know it's an initialization. */ - -tree -convert_to_reference (reftype, expr, convtype, flags, decl) - tree reftype, expr; - int convtype, flags; - tree decl; -{ - register tree type = TYPE_MAIN_VARIANT (TREE_TYPE (reftype)); - register tree intype = TREE_TYPE (expr); - tree rval = NULL_TREE; - tree rval_as_conversion = NULL_TREE; - int i; - - if (TREE_CODE (type) == FUNCTION_TYPE && intype == unknown_type_node) - { - expr = instantiate_type (type, expr, - (flags & LOOKUP_COMPLAIN) != 0); - if (expr == error_mark_node) - return error_mark_node; - - intype = TREE_TYPE (expr); - } - - if (TREE_CODE (intype) == REFERENCE_TYPE) - my_friendly_abort (364); - - intype = TYPE_MAIN_VARIANT (intype); - - i = comp_target_types (type, intype, 0); - - if (i <= 0 && (convtype & CONV_IMPLICIT) && IS_AGGR_TYPE (intype) - && ! (flags & LOOKUP_NO_CONVERSION)) - { - /* Look for a user-defined conversion to lvalue that we can use. */ - - rval_as_conversion - = build_type_conversion (CONVERT_EXPR, reftype, expr, 1); - - if (rval_as_conversion && rval_as_conversion != error_mark_node - && real_lvalue_p (rval_as_conversion)) - { - expr = rval_as_conversion; - rval_as_conversion = NULL_TREE; - intype = type; - i = 1; - } - } - - if (((convtype & CONV_STATIC) && i == -1) - || ((convtype & CONV_IMPLICIT) && i == 1)) - { - if (flags & LOOKUP_COMPLAIN) - { - tree ttl = TREE_TYPE (reftype); - tree ttr = lvalue_type (expr); - - /* [dcl.init.ref] says that if an rvalue is used to - initialize a reference, then the reference must be to a - non-volatile const type. */ - if (! real_lvalue_p (expr) - && !CP_TYPE_CONST_NON_VOLATILE_P (ttl)) - { - char* msg; - - if (CP_TYPE_VOLATILE_P (ttl) && decl) - msg = "initialization of volatile reference type `%#T'"; - else if (CP_TYPE_VOLATILE_P (ttl)) - msg = "conversion to volatile reference type `%#T'"; - else if (decl) - msg = "initialization of non-const reference type `%#T'"; - else - msg = "conversion to non-const reference type `%#T'"; - - cp_pedwarn (msg, reftype); - cp_pedwarn ("from rvalue of type `%T'", intype); - } - else if (! (convtype & CONV_CONST) - && !at_least_as_qualified_p (ttl, ttr)) - cp_pedwarn ("conversion from `%T' to `%T' discards qualifiers", - ttr, reftype); - } - - return build_up_reference (reftype, expr, flags); - } - else if ((convtype & CONV_REINTERPRET) && lvalue_p (expr)) - { - /* When casting an lvalue to a reference type, just convert into - a pointer to the new type and deference it. This is allowed - by San Diego WP section 5.2.9 paragraph 12, though perhaps it - should be done directly (jason). (int &)ri ---> *(int*)&ri */ - - /* B* bp; A& ar = (A&)bp; is valid, but it's probably not what they - meant. */ - if (TREE_CODE (intype) == POINTER_TYPE - && (comptypes (TREE_TYPE (intype), type, - COMPARE_BASE | COMPARE_RELAXED ))) - cp_warning ("casting `%T' to `%T' does not dereference pointer", - intype, reftype); - - rval = build_unary_op (ADDR_EXPR, expr, 0); - if (rval != error_mark_node) - rval = convert_force (build_pointer_type (TREE_TYPE (reftype)), - rval, 0); - if (rval != error_mark_node) - rval = build1 (NOP_EXPR, reftype, rval); - } - else - { - rval = convert_for_initialization (NULL_TREE, type, expr, flags, - "converting", 0, 0); - if (rval == NULL_TREE || rval == error_mark_node) - return rval; - rval = build_up_reference (reftype, rval, flags); - - if (rval && ! CP_TYPE_CONST_P (TREE_TYPE (reftype))) - cp_pedwarn ("initializing non-const `%T' with `%T' will use a temporary", - reftype, intype); - } - - if (rval) - { - /* If we found a way to convert earlier, then use it. */ - return rval; - } - - my_friendly_assert (TREE_CODE (intype) != OFFSET_TYPE, 189); - - if (flags & LOOKUP_COMPLAIN) - cp_error ("cannot convert type `%T' to type `%T'", intype, reftype); - - if (flags & LOOKUP_SPECULATIVELY) - return NULL_TREE; - - return error_mark_node; -} - -/* We are using a reference VAL for its value. Bash that reference all the - way down to its lowest form. */ - -tree -convert_from_reference (val) - tree val; -{ - tree type = TREE_TYPE (val); - - if (TREE_CODE (type) == OFFSET_TYPE) - type = TREE_TYPE (type); - if (TREE_CODE (type) == REFERENCE_TYPE) - return build_indirect_ref (val, NULL_PTR); - return val; -} - -/* Call this when we know (for any reason) that expr is not, in fact, - zero. This routine is like convert_pointer_to, but it pays - attention to which specific instance of what type we want to - convert to. This routine should eventually become - convert_to_pointer after all references to convert_to_pointer - are removed. */ - -tree -convert_pointer_to_real (binfo, expr) - tree binfo, expr; -{ - register tree intype = TREE_TYPE (expr); - tree ptr_type; - tree type, rval; - - if (intype == error_mark_node) - return error_mark_node; - - if (TREE_CODE (binfo) == TREE_VEC) - type = BINFO_TYPE (binfo); - else if (IS_AGGR_TYPE (binfo)) - { - type = binfo; - } - else - { - type = binfo; - binfo = NULL_TREE; - } - - ptr_type = cp_build_qualified_type (type, - CP_TYPE_QUALS (TREE_TYPE (intype))); - ptr_type = build_pointer_type (ptr_type); - if (ptr_type == TYPE_MAIN_VARIANT (intype)) - return expr; - - my_friendly_assert (!integer_zerop (expr), 191); - - intype = TYPE_MAIN_VARIANT (TREE_TYPE (intype)); - if (TREE_CODE (type) == RECORD_TYPE - && TREE_CODE (intype) == RECORD_TYPE - && type != intype) - { - tree path; - int distance - = get_base_distance (binfo, intype, 0, &path); - - /* This function shouldn't be called with unqualified arguments - but if it is, give them an error message that they can read. */ - if (distance < 0) - { - cp_error ("cannot convert a pointer of type `%T' to a pointer of type `%T'", - intype, type); - - if (distance == -2) - cp_error ("because `%T' is an ambiguous base class", type); - return error_mark_node; - } - - return build_vbase_path (PLUS_EXPR, ptr_type, expr, path, 1); - } - rval = build1 (NOP_EXPR, ptr_type, - TREE_CODE (expr) == NOP_EXPR ? TREE_OPERAND (expr, 0) : expr); - TREE_CONSTANT (rval) = TREE_CONSTANT (expr); - return rval; -} - -/* Call this when we know (for any reason) that expr is - not, in fact, zero. This routine gets a type out of the first - argument and uses it to search for the type to convert to. If there - is more than one instance of that type in the expr, the conversion is - ambiguous. This routine should eventually go away, and all - callers should use convert_to_pointer_real. */ - -tree -convert_pointer_to (binfo, expr) - tree binfo, expr; -{ - tree type; - - if (TREE_CODE (binfo) == TREE_VEC) - type = BINFO_TYPE (binfo); - else if (IS_AGGR_TYPE (binfo)) - type = binfo; - else - type = binfo; - return convert_pointer_to_real (type, expr); -} - -/* C++ conversions, preference to static cast conversions. */ - -tree -cp_convert (type, expr) - tree type, expr; -{ - return ocp_convert (type, expr, CONV_OLD_CONVERT, LOOKUP_NORMAL); -} - -/* Conversion... - - FLAGS indicates how we should behave. */ - -tree -ocp_convert (type, expr, convtype, flags) - tree type, expr; - int convtype, flags; -{ - register tree e = expr; - register enum tree_code code = TREE_CODE (type); - - if (e == error_mark_node - || TREE_TYPE (e) == error_mark_node) - return error_mark_node; - - if (TREE_READONLY_DECL_P (e)) - e = decl_constant_value (e); - - if (IS_AGGR_TYPE (type) && (convtype & CONV_FORCE_TEMP) - /* Some internal structures (vtable_entry_type, sigtbl_ptr_type) - don't go through finish_struct, so they don't have the synthesized - constructors. So don't force a temporary. */ - && TYPE_HAS_CONSTRUCTOR (type)) - /* We need a new temporary; don't take this shortcut. */; - else if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (TREE_TYPE (e))) - { - if (same_type_p (type, TREE_TYPE (e))) - /* The call to fold will not always remove the NOP_EXPR as - might be expected, since if one of the types is a typedef; - the comparsion in fold is just equality of pointers, not a - call to comptypes. We don't call fold in this case because - that can result in infinite recursion; fold will call - convert, which will call ocp_convert, etc. */ - return e; - else - return fold (build1 (NOP_EXPR, type, e)); - } - - if (code == VOID_TYPE && (convtype & CONV_STATIC)) - { - if (type_unknown_p (e)) - error ("address of overloaded function with no contextual type information"); - - return build1 (CONVERT_EXPR, type, e); - } - -#if 0 - /* This is incorrect. A truncation can't be stripped this way. - Extensions will be stripped by the use of get_unwidened. */ - if (TREE_CODE (e) == NOP_EXPR) - return cp_convert (type, TREE_OPERAND (e, 0)); -#endif - - /* Just convert to the type of the member. */ - if (code == OFFSET_TYPE) - { - type = TREE_TYPE (type); - code = TREE_CODE (type); - } - -#if 0 - if (code == REFERENCE_TYPE) - return fold (convert_to_reference (type, e, convtype, flags, NULL_TREE)); - else if (TREE_CODE (TREE_TYPE (e)) == REFERENCE_TYPE) - e = convert_from_reference (e); -#endif - - if (TREE_CODE (e) == OFFSET_REF) - e = resolve_offset_ref (e); - - if (INTEGRAL_CODE_P (code)) - { - tree intype = TREE_TYPE (e); - /* enum = enum, enum = int, enum = float, (enum)pointer are all - errors. */ - if (TREE_CODE (type) == ENUMERAL_TYPE - && ((ARITHMETIC_TYPE_P (intype) && ! (convtype & CONV_STATIC)) - || (TREE_CODE (intype) == POINTER_TYPE))) - { - cp_pedwarn ("conversion from `%#T' to `%#T'", intype, type); - - if (flag_pedantic_errors) - return error_mark_node; - } - if (IS_AGGR_TYPE (intype)) - { - tree rval; - rval = build_type_conversion (CONVERT_EXPR, type, e, 1); - if (rval) - return rval; - if (flags & LOOKUP_COMPLAIN) - cp_error ("`%#T' used where a `%T' was expected", intype, type); - if (flags & LOOKUP_SPECULATIVELY) - return NULL_TREE; - return error_mark_node; - } - if (code == BOOLEAN_TYPE) - { - /* Common Ada/Pascal programmer's mistake. We always warn - about this since it is so bad. */ - if (TREE_CODE (expr) == FUNCTION_DECL) - cp_warning ("the address of `%D', will always be `true'", expr); - return truthvalue_conversion (e); - } - return fold (convert_to_integer (type, e)); - } - if (code == POINTER_TYPE || code == REFERENCE_TYPE - || TYPE_PTRMEMFUNC_P (type)) - return fold (cp_convert_to_pointer (type, e)); - if (code == REAL_TYPE || code == COMPLEX_TYPE) - { - if (IS_AGGR_TYPE (TREE_TYPE (e))) - { - tree rval; - rval = build_type_conversion (CONVERT_EXPR, type, e, 1); - if (rval) - return rval; - else - if (flags & LOOKUP_COMPLAIN) - cp_error ("`%#T' used where a floating point value was expected", - TREE_TYPE (e)); - } - if (code == REAL_TYPE) - return fold (convert_to_real (type, e)); - else if (code == COMPLEX_TYPE) - return fold (convert_to_complex (type, e)); - } - - /* New C++ semantics: since assignment is now based on - memberwise copying, if the rhs type is derived from the - lhs type, then we may still do a conversion. */ - if (IS_AGGR_TYPE_CODE (code)) - { - tree dtype = TREE_TYPE (e); - tree ctor = NULL_TREE; - - dtype = TYPE_MAIN_VARIANT (dtype); - - /* Conversion of object pointers or signature pointers/references - to signature pointers/references. */ - - if (TYPE_LANG_SPECIFIC (type) - && (IS_SIGNATURE_POINTER (type) || IS_SIGNATURE_REFERENCE (type))) - { - tree constructor = build_signature_pointer_constructor (type, expr); - tree sig_ty = SIGNATURE_TYPE (type); - tree sig_ptr; - - if (constructor == error_mark_node) - return error_mark_node; - - sig_ptr = get_temp_name (type, 1); - DECL_INITIAL (sig_ptr) = constructor; - CLEAR_SIGNATURE (sig_ty); - cp_finish_decl (sig_ptr, constructor, NULL_TREE, 0, 0); - SET_SIGNATURE (sig_ty); - TREE_READONLY (sig_ptr) = 1; - - return sig_ptr; - } - - /* Conversion between aggregate types. New C++ semantics allow - objects of derived type to be cast to objects of base type. - Old semantics only allowed this between pointers. - - There may be some ambiguity between using a constructor - vs. using a type conversion operator when both apply. */ - - ctor = e; - - if (IS_AGGR_TYPE (type) && CLASSTYPE_ABSTRACT_VIRTUALS (type)) - { - abstract_virtuals_error (NULL_TREE, type); - return error_mark_node; - } - - if ((flags & LOOKUP_ONLYCONVERTING) - && ! (IS_AGGR_TYPE (dtype) && DERIVED_FROM_P (type, dtype))) - /* For copy-initialization, first we create a temp of the proper type - with a user-defined conversion sequence, then we direct-initialize - the target with the temp (see [dcl.init]). */ - ctor = build_user_type_conversion (type, ctor, flags); - if (ctor) - ctor = build_method_call (NULL_TREE, ctor_identifier, - build_expr_list (NULL_TREE, ctor), - TYPE_BINFO (type), flags); - if (ctor) - return build_cplus_new (type, ctor); - } - - /* If TYPE or TREE_TYPE (E) is not on the permanent_obstack, - then it won't be hashed and hence compare as not equal, - even when it is. */ - if (code == ARRAY_TYPE - && TREE_TYPE (TREE_TYPE (e)) == TREE_TYPE (type) - && index_type_equal (TYPE_DOMAIN (TREE_TYPE (e)), TYPE_DOMAIN (type))) - return e; - - if (flags & LOOKUP_COMPLAIN) - cp_error ("conversion from `%T' to non-scalar type `%T' requested", - TREE_TYPE (expr), type); - if (flags & LOOKUP_SPECULATIVELY) - return NULL_TREE; - return error_mark_node; -} - -/* Create an expression whose value is that of EXPR, - converted to type TYPE. The TREE_TYPE of the value - is always TYPE. This function implements all reasonable - conversions; callers should filter out those that are - not permitted by the language being compiled. - - Most of this routine is from build_reinterpret_cast. - - The backend cannot call cp_convert (what was convert) because - conversions to/from basetypes may involve memory references - (vbases) and adding or subtracting small values (multiple - inheritance), but it calls convert from the constant folding code - on subtrees of already build trees after it has ripped them apart. - - Also, if we ever support range variables, we'll probably also have to - do a little bit more work. */ - -tree -convert (type, expr) - tree type, expr; -{ - tree intype; - - if (type == error_mark_node || expr == error_mark_node) - return error_mark_node; - - intype = TREE_TYPE (expr); - - if (POINTER_TYPE_P (type) && POINTER_TYPE_P (intype)) - { - if (TREE_READONLY_DECL_P (expr)) - expr = decl_constant_value (expr); - return fold (build1 (NOP_EXPR, type, expr)); - } - - return ocp_convert (type, expr, CONV_OLD_CONVERT, - LOOKUP_NORMAL|LOOKUP_NO_CONVERSION); -} - -/* Like cp_convert, except permit conversions to take place which - are not normally allowed due to access restrictions - (such as conversion from sub-type to private super-type). */ - -tree -convert_force (type, expr, convtype) - tree type; - tree expr; - int convtype; -{ - register tree e = expr; - register enum tree_code code = TREE_CODE (type); - - if (code == REFERENCE_TYPE) - return fold (convert_to_reference (type, e, CONV_C_CAST, LOOKUP_COMPLAIN, - NULL_TREE)); - else if (TREE_CODE (TREE_TYPE (e)) == REFERENCE_TYPE) - e = convert_from_reference (e); - - if (code == POINTER_TYPE) - return fold (convert_to_pointer_force (type, e)); - - /* From typeck.c convert_for_assignment */ - if (((TREE_CODE (TREE_TYPE (e)) == POINTER_TYPE && TREE_CODE (e) == ADDR_EXPR - && TREE_CODE (TREE_TYPE (e)) == POINTER_TYPE - && TREE_CODE (TREE_TYPE (TREE_TYPE (e))) == METHOD_TYPE) - || integer_zerop (e) - || TYPE_PTRMEMFUNC_P (TREE_TYPE (e))) - && TYPE_PTRMEMFUNC_P (type)) - { - /* compatible pointer to member functions. */ - return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), e, 1); - } - - return ocp_convert (type, e, CONV_C_CAST|convtype, LOOKUP_NORMAL); -} - -/* Convert an aggregate EXPR to type XTYPE. If a conversion - exists, return the attempted conversion. This may - return ERROR_MARK_NODE if the conversion is not - allowed (references private members, etc). - If no conversion exists, NULL_TREE is returned. - - If (FOR_SURE & 1) is non-zero, then we allow this type conversion - to take place immediately. Otherwise, we build a SAVE_EXPR - which can be evaluated if the results are ever needed. - - Changes to this functions should be mirrored in user_harshness. - - FIXME: Ambiguity checking is wrong. Should choose one by the implicit - object parameter, or by the second standard conversion sequence if - that doesn't do it. This will probably wait for an overloading rewrite. - (jason 8/9/95) */ - -tree -build_type_conversion (code, xtype, expr, for_sure) - enum tree_code code ATTRIBUTE_UNUSED; - tree xtype, expr; - int for_sure; -{ - /* C++: check to see if we can convert this aggregate type - into the required type. */ - return build_user_type_conversion - (xtype, expr, for_sure ? LOOKUP_NORMAL : 0); -} - -/* Convert the given EXPR to one of a group of types suitable for use in an - expression. DESIRES is a combination of various WANT_* flags (q.v.) - which indicates which types are suitable. If COMPLAIN is 1, complain - about ambiguity; otherwise, the caller will deal with it. */ - -tree -build_expr_type_conversion (desires, expr, complain) - int desires; - tree expr; - int complain; -{ - tree basetype = TREE_TYPE (expr); - tree conv = NULL_TREE; - tree winner = NULL_TREE; - - if (expr == null_node - && (desires & WANT_INT) - && !(desires & WANT_NULL)) - cp_warning ("converting NULL to non-pointer type"); - - if (TREE_CODE (basetype) == OFFSET_TYPE) - expr = resolve_offset_ref (expr); - expr = convert_from_reference (expr); - basetype = TREE_TYPE (expr); - - if (! IS_AGGR_TYPE (basetype)) - switch (TREE_CODE (basetype)) - { - case INTEGER_TYPE: - if ((desires & WANT_NULL) && null_ptr_cst_p (expr)) - return expr; - /* else fall through... */ - - case BOOLEAN_TYPE: - return (desires & WANT_INT) ? expr : NULL_TREE; - case ENUMERAL_TYPE: - return (desires & WANT_ENUM) ? expr : NULL_TREE; - case REAL_TYPE: - return (desires & WANT_FLOAT) ? expr : NULL_TREE; - case POINTER_TYPE: - return (desires & WANT_POINTER) ? expr : NULL_TREE; - - case FUNCTION_TYPE: - case ARRAY_TYPE: - return (desires & WANT_POINTER) ? default_conversion (expr) - : NULL_TREE; - default: - return NULL_TREE; - } - - /* The code for conversions from class type is currently only used for - delete expressions. Other expressions are handled by build_new_op. */ - - if (! TYPE_HAS_CONVERSION (basetype)) - return NULL_TREE; - - for (conv = lookup_conversions (basetype); conv; conv = TREE_CHAIN (conv)) - { - int win = 0; - tree candidate; - tree cand = TREE_VALUE (conv); - - if (winner && winner == cand) - continue; - - candidate = TREE_TYPE (TREE_TYPE (cand)); - if (TREE_CODE (candidate) == REFERENCE_TYPE) - candidate = TREE_TYPE (candidate); - - switch (TREE_CODE (candidate)) - { - case BOOLEAN_TYPE: - case INTEGER_TYPE: - win = (desires & WANT_INT); break; - case ENUMERAL_TYPE: - win = (desires & WANT_ENUM); break; - case REAL_TYPE: - win = (desires & WANT_FLOAT); break; - case POINTER_TYPE: - win = (desires & WANT_POINTER); break; - - default: - break; - } - - if (win) - { - if (winner) - { - if (complain) - { - cp_error ("ambiguous default type conversion from `%T'", - basetype); - cp_error (" candidate conversions include `%D' and `%D'", - winner, cand); - } - return error_mark_node; - } - else - winner = cand; - } - } - - if (winner) - { - tree type = TREE_TYPE (TREE_TYPE (winner)); - if (TREE_CODE (type) == REFERENCE_TYPE) - type = TREE_TYPE (type); - return build_user_type_conversion (type, expr, LOOKUP_NORMAL); - } - - return NULL_TREE; -} - -/* Implements integral promotion (4.1) and float->double promotion. */ - -tree -type_promotes_to (type) - tree type; -{ - int type_quals; - - if (type == error_mark_node) - return error_mark_node; - - type_quals = CP_TYPE_QUALS (type); - type = TYPE_MAIN_VARIANT (type); - - /* bool always promotes to int (not unsigned), even if it's the same - size. */ - if (type == boolean_type_node) - type = integer_type_node; - - /* Normally convert enums to int, but convert wide enums to something - wider. */ - else if (TREE_CODE (type) == ENUMERAL_TYPE - || type == wchar_type_node) - { - int precision = MAX (TYPE_PRECISION (type), - TYPE_PRECISION (integer_type_node)); - tree totype = type_for_size (precision, 0); - if (TREE_UNSIGNED (type) - && ! int_fits_type_p (TYPE_MAX_VALUE (type), totype)) - type = type_for_size (precision, 1); - else - type = totype; - } - else if (C_PROMOTING_INTEGER_TYPE_P (type)) - { - /* Retain unsignedness if really not getting bigger. */ - if (TREE_UNSIGNED (type) - && TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node)) - type = unsigned_type_node; - else - type = integer_type_node; - } - else if (type == float_type_node) - type = double_type_node; - - return cp_build_qualified_type (type, type_quals); -} - -/* The routines below this point are carefully written to conform to - the standard. They use the same terminology, and follow the rules - closely. Although they are used only in pt.c at the moment, they - should presumably be used everywhere in the future. */ - -/* Attempt to perform qualification conversions on EXPR to convert it - to TYPE. Return the resulting expression, or error_mark_node if - the conversion was impossible. */ - -tree -perform_qualification_conversions (type, expr) - tree type; - tree expr; -{ - if (TREE_CODE (type) == POINTER_TYPE - && TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE - && comp_ptr_ttypes (TREE_TYPE (type), TREE_TYPE (TREE_TYPE (expr)))) - return build1 (NOP_EXPR, type, expr); - else - return error_mark_node; -} diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c deleted file mode 100755 index b023a2f..0000000 --- a/gcc/cp/decl.c +++ /dev/null @@ -1,14623 +0,0 @@ -/* Process declarations and variables for C compiler. - Copyright (C) 1988, 92-98, 1999 Free Software Foundation, Inc. - Contributed by Michael Tiemann (tiemann@cygnus.com) - -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 -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - - -/* Process declarations and symbol lookup for C front end. - Also constructs types; the standard scalar types at initialization, - and structure, union, array and enum types when they are declared. */ - -/* ??? not all decl nodes are given the most useful possible - line numbers. For example, the CONST_DECLs for enum values. */ - -#include "config.h" -#include "system.h" -#include "tree.h" -#include "rtl.h" -#include "flags.h" -#include "cp-tree.h" -#include "decl.h" -#include "lex.h" -#include -#include "obstack.h" -#include "defaults.h" -#include "output.h" -#include "except.h" -#include "toplev.h" -#include "../hash.h" - -#define obstack_chunk_alloc xmalloc -#define obstack_chunk_free free - -extern tree builtin_return_address_fndecl; - -extern struct obstack permanent_obstack; -extern struct obstack* saveable_obstack; - -extern int current_class_depth; - -extern tree static_ctors, static_dtors; - -extern int static_labelno; - -extern tree current_namespace; -extern tree global_namespace; - -extern void (*print_error_function) PROTO((char *)); - -/* Stack of places to restore the search obstack back to. */ - -/* Obstack used for remembering local class declarations (like - enums and static (const) members. */ -#include "stack.h" -struct obstack decl_obstack; -static struct stack_level *decl_stack; - -#ifndef CHAR_TYPE_SIZE -#define CHAR_TYPE_SIZE BITS_PER_UNIT -#endif - -#ifndef SHORT_TYPE_SIZE -#define SHORT_TYPE_SIZE (BITS_PER_UNIT * MIN ((UNITS_PER_WORD + 1) / 2, 2)) -#endif - -#ifndef INT_TYPE_SIZE -#define INT_TYPE_SIZE BITS_PER_WORD -#endif - -#ifndef LONG_TYPE_SIZE -#define LONG_TYPE_SIZE BITS_PER_WORD -#endif - -#ifndef LONG_LONG_TYPE_SIZE -#define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2) -#endif - -#ifndef WCHAR_UNSIGNED -#define WCHAR_UNSIGNED 0 -#endif - -#ifndef FLOAT_TYPE_SIZE -#define FLOAT_TYPE_SIZE BITS_PER_WORD -#endif - -#ifndef DOUBLE_TYPE_SIZE -#define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2) -#endif - -#ifndef LONG_DOUBLE_TYPE_SIZE -#define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2) -#endif - -#ifndef BOOL_TYPE_SIZE -#ifdef SLOW_BYTE_ACCESS -#define BOOL_TYPE_SIZE ((SLOW_BYTE_ACCESS) ? (POINTER_SIZE) : (CHAR_TYPE_SIZE)) -#else -#define BOOL_TYPE_SIZE CHAR_TYPE_SIZE -#endif -#endif - -/* We let tm.h override the types used here, to handle trivial differences - such as the choice of unsigned int or long unsigned int for size_t. - When machines start needing nontrivial differences in the size type, - it would be best to do something here to figure out automatically - from other information what type to use. */ - -#ifndef SIZE_TYPE -#define SIZE_TYPE "long unsigned int" -#endif - -#ifndef PTRDIFF_TYPE -#define PTRDIFF_TYPE "long int" -#endif - -#ifndef WCHAR_TYPE -#define WCHAR_TYPE "int" -#endif - -static tree grokparms PROTO((tree, int)); -static tree lookup_nested_type PROTO((tree, tree)); -static char *redeclaration_error_message PROTO((tree, tree)); - -static struct stack_level *push_decl_level PROTO((struct stack_level *, - struct obstack *)); -static void push_binding_level PROTO((struct binding_level *, int, - int)); -static void pop_binding_level PROTO((void)); -static void suspend_binding_level PROTO((void)); -static void resume_binding_level PROTO((struct binding_level *)); -static struct binding_level *make_binding_level PROTO((void)); -static void declare_namespace_level PROTO((void)); -static void signal_catch PROTO((int)) ATTRIBUTE_NORETURN; -static void storedecls PROTO((tree)); -static void storetags PROTO((tree)); -static void require_complete_types_for_parms PROTO((tree)); -static void push_overloaded_decl_1 PROTO((tree)); -static int ambi_op_p PROTO((tree)); -static int unary_op_p PROTO((tree)); -static tree store_bindings PROTO((tree, tree)); -static tree lookup_tag_reverse PROTO((tree, tree)); -static tree obscure_complex_init PROTO((tree, tree)); -static tree maybe_build_cleanup_1 PROTO((tree, tree)); -static tree lookup_name_real PROTO((tree, int, int, int)); -static void warn_extern_redeclared_static PROTO((tree, tree)); -static void grok_reference_init PROTO((tree, tree, tree)); -static tree grokfndecl PROTO((tree, tree, tree, tree, int, - enum overload_flags, tree, - tree, tree, int, int, int, int, int, int, tree)); -static tree grokvardecl PROTO((tree, tree, RID_BIT_TYPE *, int, int, tree)); -static tree lookup_tag PROTO((enum tree_code, tree, - struct binding_level *, int)); -static void set_identifier_type_value_with_scope - PROTO((tree, tree, struct binding_level *)); -static void record_builtin_type PROTO((enum rid, char *, tree)); -static void record_unknown_type PROTO((tree, char *)); -static int member_function_or_else PROTO((tree, tree, char *)); -static void bad_specifiers PROTO((tree, char *, int, int, int, int, - int)); -static void lang_print_error_function PROTO((char *)); -static tree maybe_process_template_type_declaration PROTO((tree, int, struct binding_level*)); -static void check_for_uninitialized_const_var PROTO((tree)); -static unsigned long typename_hash PROTO((hash_table_key)); -static boolean typename_compare PROTO((hash_table_key, hash_table_key)); -static void push_binding PROTO((tree, tree, struct binding_level*)); -static void add_binding PROTO((tree, tree)); -static void pop_binding PROTO((tree, tree)); -static tree local_variable_p PROTO((tree)); - -#if defined (DEBUG_CP_BINDING_LEVELS) -static void indent PROTO((void)); -#endif - -/* A node which has tree code ERROR_MARK, and whose type is itself. - All erroneous expressions are replaced with this node. All functions - that accept nodes as arguments should avoid generating error messages - if this node is one of the arguments, since it is undesirable to get - multiple error messages from one error in the input. */ - -tree error_mark_node; - -/* Erroneous argument lists can use this *IFF* they do not modify it. */ -tree error_mark_list; - -/* INTEGER_TYPE and REAL_TYPE nodes for the standard data types */ - -tree short_integer_type_node; -tree integer_type_node; -tree long_integer_type_node; -tree long_long_integer_type_node; - -tree short_unsigned_type_node; -tree unsigned_type_node; -tree long_unsigned_type_node; -tree long_long_unsigned_type_node; - -tree ptrdiff_type_node; - -tree unsigned_char_type_node; -tree signed_char_type_node; -tree char_type_node; -tree wchar_type_node; -tree signed_wchar_type_node; -tree unsigned_wchar_type_node; - -tree wchar_decl_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; -#if HOST_BITS_PER_WIDE_INT >= 64 -tree intTI_type_node; -#endif - -tree unsigned_intQI_type_node; -tree unsigned_intHI_type_node; -tree unsigned_intSI_type_node; -tree unsigned_intDI_type_node; -#if HOST_BITS_PER_WIDE_INT >= 64 -tree unsigned_intTI_type_node; -#endif - -tree java_byte_type_node; -tree java_short_type_node; -tree java_int_type_node; -tree java_long_type_node; -tree java_float_type_node; -tree java_double_type_node; -tree java_char_type_node; -tree java_boolean_type_node; - -/* A VOID_TYPE node, and the same, packaged in a TREE_LIST. */ - -tree void_type_node, void_list_node; -tree void_zero_node; - -/* Nodes for types `void *' and `const void *'. */ - -tree ptr_type_node; -tree const_ptr_type_node; - -/* Nodes for types `char *' and `const char *'. */ - -tree string_type_node, const_string_type_node; - -/* Type `char[256]' or something like it. - Used when an array of char is needed and the size is irrelevant. */ - -tree char_array_type_node; - -/* Type `int[256]' or something like it. - Used when an array of int needed and the size is irrelevant. */ - -tree int_array_type_node; - -/* Type `wchar_t[256]' or something like it. - Used when a wide string literal is created. */ - -tree wchar_array_type_node; - -/* The bool data type, and constants */ -tree boolean_type_node, boolean_true_node, boolean_false_node; - -/* Type `int ()' -- used for implicit declaration of functions. */ - -tree default_function_type; - -/* Function types `double (double)' and `double (double, double)', etc. */ - -static tree double_ftype_double, double_ftype_double_double; -static tree int_ftype_int, long_ftype_long; -static tree float_ftype_float; -static tree ldouble_ftype_ldouble; - -/* Function type `int (const void *, const void *, size_t)' */ -static tree int_ftype_cptr_cptr_sizet; - -/* C++ extensions */ -tree vtable_entry_type; -tree delta_type_node; -#if 0 -/* Old rtti stuff. */ -tree __baselist_desc_type_node; -tree __i_desc_type_node, __m_desc_type_node; -tree __t_desc_array_type, __i_desc_array_type, __m_desc_array_type; -#endif -tree __t_desc_type_node; -#if 0 -tree __tp_desc_type_node; -#endif -tree __access_mode_type_node; -tree __bltn_desc_type_node, __user_desc_type_node, __class_desc_type_node; -tree __ptr_desc_type_node, __attr_desc_type_node, __func_desc_type_node; -tree __ptmf_desc_type_node, __ptmd_desc_type_node; -#if 0 -/* Not needed yet? May be needed one day? */ -tree __bltn_desc_array_type, __user_desc_array_type, __class_desc_array_type; -tree __ptr_desc_array_type, __attr_dec_array_type, __func_desc_array_type; -tree __ptmf_desc_array_type, __ptmd_desc_array_type; -#endif - -/* Indicates that there is a type value in some namespace, although - that is not necessarily in scope at the moment. */ - -static tree global_type_node; - -tree class_star_type_node; -tree class_type_node, record_type_node, union_type_node, enum_type_node; -tree unknown_type_node; -tree opaque_type_node, signature_type_node; -tree sigtable_entry_type; - -/* Array type `vtable_entry_type[]' */ -tree vtbl_type_node; -tree vtbl_ptr_type_node; - -/* namespace std */ -tree std_node; -int in_std = 0; - -/* Expect only namespace names now. */ -static int only_namespace_names; - -/* In a destructor, the point at which all derived class destroying - has been done, just before any base class destroying will be done. */ - -tree dtor_label; - -/* In a destructor, the last insn emitted after the start of the - function and the parms. */ - -static rtx last_dtor_insn; - -/* In a constructor, the last insn emitted after the start of the - function and the parms, the exception specification and any - function-try-block. The constructor initializers are emitted after - this insn. */ - -static rtx last_parm_cleanup_insn; - -/* In a constructor, the point at which we are ready to return - the pointer to the initialized object. */ - -tree ctor_label; - -/* A FUNCTION_DECL which can call `abort'. Not necessarily the - one that the user will declare, but sufficient to be called - by routines that want to abort the program. */ - -tree abort_fndecl; - -/* A FUNCTION_DECL for the default `::operator delete'. */ - -tree global_delete_fndecl; - -extern rtx cleanup_label, return_label; - -/* If original DECL_RESULT of current function was a register, - but due to being an addressable named return value, would up - on the stack, this variable holds the named return value's - original location. */ -static rtx original_result_rtx; - -/* Sequence of insns which represents base initialization. */ -tree base_init_expr; - -/* C++: Keep these around to reduce calls to `get_identifier'. - Identifiers for `this' in member functions and the auto-delete - parameter for destructors. */ -tree this_identifier, in_charge_identifier; -tree ctor_identifier, dtor_identifier; -/* Used in pointer to member functions, in vtables, and in sigtables. */ -tree pfn_identifier, index_identifier, delta_identifier, delta2_identifier; -tree pfn_or_delta2_identifier, tag_identifier; -tree vt_off_identifier; - -struct named_label_list -{ - struct binding_level *binding_level; - tree names_in_scope; - tree label_decl; - char *filename_o_goto; - int lineno_o_goto; - struct named_label_list *next; -}; - -/* A list (chain of TREE_LIST nodes) of named label uses. - The TREE_PURPOSE field is the list of variables defined - in the label's scope defined at the point of use. - The TREE_VALUE field is the LABEL_DECL used. - The TREE_TYPE field holds `current_binding_level' at the - point of the label's use. - - BWAHAHAAHAHahhahahahaah. No, no, no, said the little chicken. - - Look at the pretty struct named_label_list. See the pretty struct - with the pretty named fields that describe what they do. See the - pretty lack of gratuitous casts. Notice the code got a lot cleaner. - - Used only for jumps to as-yet undefined labels, since - jumps to defined labels can have their validity checked - by stmt.c. */ - -static struct named_label_list *named_label_uses = NULL; - -/* A list of objects which have constructors or destructors - which reside in the global scope. The decl is stored in - the TREE_VALUE slot and the initializer is stored - in the TREE_PURPOSE slot. */ -tree static_aggregates; - -/* -- end of C++ */ - -/* Two expressions that are constants with value zero. - The first is of type `int', the second of type `void *'. */ - -tree integer_zero_node; -tree null_pointer_node; - -/* The value for __null (NULL), namely, a zero of an integer type with - the same number of bits as a pointer. */ -tree null_node; - -/* A node for the integer constants 1, 2, and 3. */ - -tree integer_one_node, integer_two_node, integer_three_node; - -/* While defining an enum type, this is 1 plus the last enumerator - constant value. */ - -static tree enum_next_value; - -/* Nonzero means that there was overflow computing enum_next_value. */ - -static int enum_overflow; - -/* Parsing a function declarator leaves a list of parameter names - or a chain or parameter decls here. */ - -tree last_function_parms; - -/* Parsing a function declarator leaves here a chain of structure - and enum types declared in the parmlist. */ - -static tree last_function_parm_tags; - -/* After parsing the declarator that starts a function definition, - `start_function' puts here the list of parameter names or chain of decls. - `store_parm_decls' finds it here. */ - -static tree current_function_parms; - -/* Similar, for last_function_parm_tags. */ -static tree current_function_parm_tags; - -/* A list (chain of TREE_LIST nodes) of all LABEL_DECLs in the function - that have names. Here so we can clear out their names' definitions - at the end of the function. */ - -static tree named_labels; - -/* A list of LABEL_DECLs from outer contexts that are currently shadowed. */ - -static tree shadowed_labels; - -/* The FUNCTION_DECL for the function currently being compiled, - or 0 if between functions. */ -tree current_function_decl; - -/* Set to 0 at beginning of a function definition, set to 1 if - a return statement that specifies a return value is seen. */ - -int current_function_returns_value; - -/* Set to 0 at beginning of a function definition, set to 1 if - a return statement with no argument is seen. */ - -int current_function_returns_null; - -/* Set to 0 at beginning of a function definition, and whenever - a label (case or named) is defined. Set to value of expression - returned from function when that value can be transformed into - a named return value. */ - -tree current_function_return_value; - -/* Nonzero means give `double' the same size as `float'. */ - -extern int flag_short_double; - -/* Nonzero means don't recognize any builtin functions. */ - -extern int flag_no_builtin; - -/* Nonzero means don't recognize the non-ANSI builtin functions. - -ansi sets this. */ - -extern int flag_no_nonansi_builtin; - -/* Nonzero means enable obscure ANSI features and disable GNU extensions - that might cause ANSI-compliant code to be miscompiled. */ - -extern int flag_ansi; - -/* Nonzero if we want to support huge (> 2^(sizeof(short)*8-1) bytes) - objects. */ -extern int flag_huge_objects; - -/* Nonzero if we want to conserve space in the .o files. We do this - by putting uninitialized data and runtime initialized data into - .common instead of .data at the expense of not flagging multiple - definitions. */ -extern int flag_conserve_space; - -/* Pointers to the base and current top of the language name stack. */ - -extern tree *current_lang_base, *current_lang_stack; - -/* C and C++ flags are in decl2.c. */ - -/* Set to 0 at beginning of a constructor, set to 1 - if that function does an allocation before referencing its - instance variable. */ -static int current_function_assigns_this; -int current_function_just_assigned_this; - -/* Set to 0 at beginning of a function. Set non-zero when - store_parm_decls is called. Don't call store_parm_decls - if this flag is non-zero! */ -int current_function_parms_stored; - -/* Flag used when debugging spew.c */ - -extern int spew_debug; - -/* This is a copy of the class_shadowed list of the previous class binding - contour when at global scope. It's used to reset IDENTIFIER_CLASS_VALUEs - when entering another class scope (i.e. a cache miss). */ -extern tree previous_class_values; - -/* A expression of value 0 with the same precision as a sizetype - node, but signed. */ -tree signed_size_zero_node; - -/* The name of the anonymous namespace, throughout this translation - unit. */ -tree anonymous_namespace_name; - - -/* Allocate a level of searching. */ - -static -struct stack_level * -push_decl_level (stack, obstack) - struct stack_level *stack; - struct obstack *obstack; -{ - struct stack_level tem; - tem.prev = stack; - - return push_stack_level (obstack, (char *)&tem, sizeof (tem)); -} - -/* For each binding contour we allocate a binding_level structure - which records the names defined in that contour. - Contours include: - 0) the global one - 1) one for each function definition, - where internal declarations of the parameters appear. - 2) one for each compound statement, - to record its declarations. - - The current meaning of a name can be found by searching the levels - from the current one out to the global one. - - Off to the side, may be the class_binding_level. This exists only - to catch class-local declarations. It is otherwise nonexistent. - - Also there may be binding levels that catch cleanups that must be - run when exceptions occur. Thus, to see whether a name is bound in - the current scope, it is not enough to look in the - CURRENT_BINDING_LEVEL. You should use lookup_name_current_level - instead. */ - -/* Note that the information in the `names' component of the global contour - is duplicated in the IDENTIFIER_GLOBAL_VALUEs of all identifiers. */ - -struct binding_level - { - /* A chain of _DECL nodes for all variables, constants, functions, - and typedef types. These are in the reverse of the order - supplied. There may be OVERLOADs on this list, too, but they - are wrapped in TREE_LISTs; the TREE_VALUE is the OVERLOAD. */ - tree names; - - /* A list of structure, union and enum definitions, for looking up - tag names. - It is a chain of TREE_LIST nodes, each of whose TREE_PURPOSE is a name, - or NULL_TREE; and whose TREE_VALUE is a RECORD_TYPE, UNION_TYPE, - or ENUMERAL_TYPE node. - - C++: the TREE_VALUE nodes can be simple types for - component_bindings. */ - tree tags; - - /* A list of USING_DECL nodes. */ - tree usings; - - /* A list of used namespaces. PURPOSE is the namespace, - VALUE the common ancestor with this binding_level's namespace. */ - tree using_directives; - - /* If this binding level is the binding level for a class, then - class_shadowed is a TREE_LIST. The TREE_PURPOSE of each node - is the name of an entity bound in the class; the TREE_VALUE is - the IDENTIFIER_CLASS_VALUE before we entered the class. Thus, - when leaving class scope, we can restore the - IDENTIFIER_CLASS_VALUE by walking this list. The TREE_TYPE is - the DECL bound by this name in the class. */ - tree class_shadowed; - - /* Similar to class_shadowed, but for IDENTIFIER_TYPE_VALUE, and - is used for all binding levels. */ - tree type_shadowed; - - /* For each level (except not the global one), - a chain of BLOCK nodes for all the levels - that were entered and exited one level down. */ - tree blocks; - - /* The BLOCK node for this level, if one has been preallocated. - If 0, the BLOCK is allocated (if needed) when the level is popped. */ - tree this_block; - - /* The binding level which this one is contained in (inherits from). */ - struct binding_level *level_chain; - - /* List of decls in `names' that have incomplete - structure or union types. */ - tree incomplete; - - /* List of VAR_DECLS saved from a previous for statement. - These would be dead in ANSI-conforming code, but might - be referenced in ARM-era code. These are stored in a - TREE_LIST; the TREE_VALUE is the actual declaration. */ - tree dead_vars_from_for; - - /* 1 for the level that holds the parameters of a function. - 2 for the level that holds a class declaration. - 3 for levels that hold parameter declarations. */ - unsigned parm_flag : 4; - - /* 1 means make a BLOCK for this level regardless of all else. - 2 for temporary binding contours created by the compiler. */ - unsigned keep : 3; - - /* Nonzero if this level "doesn't exist" for tags. */ - unsigned tag_transparent : 1; - - /* Nonzero if this level can safely have additional - cleanup-needing variables added to it. */ - unsigned more_cleanups_ok : 1; - unsigned have_cleanups : 1; - - /* Nonzero if this level is for storing the decls for template - parameters and generic decls; these decls will be discarded and - replaced with a TEMPLATE_DECL. */ - unsigned pseudo_global : 1; - - /* This is set for a namespace binding level. */ - unsigned namespace_p : 1; - - /* True if this level is that of a for-statement where we need to - worry about ambiguous (ARM or ANSI) scope rules. */ - unsigned is_for_scope : 1; - - /* Two bits left for this word. */ - -#if defined(DEBUG_CP_BINDING_LEVELS) - /* Binding depth at which this level began. */ - unsigned binding_depth; -#endif /* defined(DEBUG_CP_BINDING_LEVELS) */ - }; - -#define NULL_BINDING_LEVEL ((struct binding_level *) NULL) - -/* The (non-class) binding level currently in effect. */ - -static struct binding_level *current_binding_level; - -/* The binding level of the current class, if any. */ - -static struct binding_level *class_binding_level; - -/* The current (class or non-class) binding level currently in effect. */ - -#define inner_binding_level \ - (class_binding_level ? class_binding_level : current_binding_level) - -/* A chain of binding_level structures awaiting reuse. */ - -static struct binding_level *free_binding_level; - -/* The outermost binding level, for names of file scope. - This is created when the compiler is started and exists - through the entire run. */ - -static struct binding_level *global_binding_level; - -/* Binding level structures are initialized by copying this one. */ - -static struct binding_level clear_binding_level; - -/* Nonzero means unconditionally make a BLOCK for the next level pushed. */ - -static int keep_next_level_flag; - -#if defined(DEBUG_CP_BINDING_LEVELS) -static int binding_depth = 0; -static int is_class_level = 0; - -static void -indent () -{ - register unsigned i; - - for (i = 0; i < binding_depth*2; i++) - putc (' ', stderr); -} -#endif /* defined(DEBUG_CP_BINDING_LEVELS) */ - -static tree pushdecl_with_scope PROTO((tree, struct binding_level *)); - -static void -push_binding_level (newlevel, tag_transparent, keep) - struct binding_level *newlevel; - int tag_transparent, keep; -{ - /* Add this level to the front of the chain (stack) of levels that - are active. */ - *newlevel = clear_binding_level; - if (class_binding_level) - { - newlevel->level_chain = class_binding_level; - class_binding_level = (struct binding_level *)0; - } - else - { - newlevel->level_chain = current_binding_level; - } - current_binding_level = newlevel; - newlevel->tag_transparent = tag_transparent; - newlevel->more_cleanups_ok = 1; - newlevel->keep = keep; -#if defined(DEBUG_CP_BINDING_LEVELS) - newlevel->binding_depth = binding_depth; - indent (); - fprintf (stderr, "push %s level 0x%08x line %d\n", - (is_class_level) ? "class" : "block", newlevel, lineno); - is_class_level = 0; - binding_depth++; -#endif /* defined(DEBUG_CP_BINDING_LEVELS) */ -} - -static void -pop_binding_level () -{ - if (class_binding_level) - current_binding_level = class_binding_level; - - if (global_binding_level) - { - /* Cannot pop a level, if there are none left to pop. */ - if (current_binding_level == global_binding_level) - my_friendly_abort (123); - } - /* Pop the current level, and free the structure for reuse. */ -#if defined(DEBUG_CP_BINDING_LEVELS) - binding_depth--; - indent (); - fprintf (stderr, "pop %s level 0x%08x line %d\n", - (is_class_level) ? "class" : "block", - current_binding_level, lineno); - if (is_class_level != (current_binding_level == class_binding_level)) - { - indent (); - fprintf (stderr, "XXX is_class_level != (current_binding_level == class_binding_level)\n"); - } - is_class_level = 0; -#endif /* defined(DEBUG_CP_BINDING_LEVELS) */ - { - register struct binding_level *level = current_binding_level; - current_binding_level = current_binding_level->level_chain; - level->level_chain = free_binding_level; -#if 0 /* defined(DEBUG_CP_BINDING_LEVELS) */ - if (level->binding_depth != binding_depth) - abort (); -#endif /* defined(DEBUG_CP_BINDING_LEVELS) */ - free_binding_level = level; - - class_binding_level = current_binding_level; - if (class_binding_level->parm_flag != 2) - class_binding_level = 0; - while (current_binding_level->parm_flag == 2) - current_binding_level = current_binding_level->level_chain; - } -} - -static void -suspend_binding_level () -{ - if (class_binding_level) - current_binding_level = class_binding_level; - - if (global_binding_level) - { - /* Cannot suspend a level, if there are none left to suspend. */ - if (current_binding_level == global_binding_level) - my_friendly_abort (123); - } - /* Suspend the current level. */ -#if defined(DEBUG_CP_BINDING_LEVELS) - binding_depth--; - indent (); - fprintf (stderr, "suspend %s level 0x%08x line %d\n", - (is_class_level) ? "class" : "block", - current_binding_level, lineno); - if (is_class_level != (current_binding_level == class_binding_level)) - { - indent (); - fprintf (stderr, "XXX is_class_level != (current_binding_level == class_binding_level)\n"); - } - is_class_level = 0; -#endif /* defined(DEBUG_CP_BINDING_LEVELS) */ - { - current_binding_level = current_binding_level->level_chain; - class_binding_level = current_binding_level; - if (class_binding_level->parm_flag != 2) - class_binding_level = 0; - while (current_binding_level->parm_flag == 2) - current_binding_level = current_binding_level->level_chain; - } -} - -static void -resume_binding_level (b) - struct binding_level *b; -{ - /* Resuming binding levels is meant only for namespaces, - and those cannot nest into classes. */ - my_friendly_assert(!class_binding_level, 386); - /* Also, resuming a non-directly nested namespace is a no-no. */ - my_friendly_assert(b->level_chain == current_binding_level, 386); - current_binding_level = b; -#if defined(DEBUG_CP_BINDING_LEVELS) - b->binding_depth = binding_depth; - indent (); - fprintf (stderr, "resume %s level 0x%08x line %d\n", - (is_class_level) ? "class" : "block", b, lineno); - is_class_level = 0; - binding_depth++; -#endif /* defined(DEBUG_CP_BINDING_LEVELS) */ -} - -/* Create a new `struct binding_level'. */ - -static -struct binding_level * -make_binding_level () -{ - /* NOSTRICT */ - return (struct binding_level *) xmalloc (sizeof (struct binding_level)); -} - -/* Nonzero if we are currently in the global binding level. */ - -int -global_bindings_p () -{ - return current_binding_level == global_binding_level; -} - -/* Nonzero if we are currently in a toplevel binding level. This - means either the global binding level or a namespace in a toplevel - binding level. - Since there are no non-toplevel namespace levels, this really - means any namespace or pseudo-global level. */ - -int -toplevel_bindings_p () -{ - return current_binding_level->namespace_p - || current_binding_level->pseudo_global; -} - -/* Nonzero if this is a namespace scope. */ - -int -namespace_bindings_p () -{ - return current_binding_level->namespace_p; -} - -void -keep_next_level () -{ - keep_next_level_flag = 1; -} - -/* Nonzero if the current level needs to have a BLOCK made. */ - -int -kept_level_p () -{ - return (current_binding_level->blocks != NULL_TREE - || current_binding_level->keep - || current_binding_level->names != NULL_TREE - || (current_binding_level->tags != NULL_TREE - && !current_binding_level->tag_transparent)); -} - -/* Identify this binding level as a level of parameters. */ - -void -declare_parm_level () -{ - current_binding_level->parm_flag = 1; -} - -void -declare_pseudo_global_level () -{ - current_binding_level->pseudo_global = 1; -} - -static void -declare_namespace_level () -{ - current_binding_level->namespace_p = 1; -} - -int -pseudo_global_level_p () -{ - return current_binding_level->pseudo_global; -} - -void -set_class_shadows (shadows) - tree shadows; -{ - class_binding_level->class_shadowed = shadows; -} - -/* Enter a new binding level. - If TAG_TRANSPARENT is nonzero, do so only for the name space of variables, - not for that of tags. */ - -void -pushlevel (tag_transparent) - int tag_transparent; -{ - register struct binding_level *newlevel = NULL_BINDING_LEVEL; - - /* If this is the top level of a function, - just make sure that NAMED_LABELS is 0. - They should have been set to 0 at the end of the previous function. */ - - if (current_binding_level == global_binding_level) - my_friendly_assert (named_labels == NULL_TREE, 134); - - /* Reuse or create a struct for this binding level. */ - -#if defined(DEBUG_CP_BINDING_LEVELS) - if (0) -#else /* !defined(DEBUG_CP_BINDING_LEVELS) */ - if (free_binding_level) -#endif /* !defined(DEBUG_CP_BINDING_LEVELS) */ - { - newlevel = free_binding_level; - free_binding_level = free_binding_level->level_chain; - } - else - { - newlevel = make_binding_level (); - } - - push_binding_level (newlevel, tag_transparent, keep_next_level_flag); - GNU_xref_start_scope ((HOST_WIDE_INT) newlevel); - keep_next_level_flag = 0; -} - -void -note_level_for_for () -{ - current_binding_level->is_for_scope = 1; -} - -void -pushlevel_temporary (tag_transparent) - int tag_transparent; -{ - pushlevel (tag_transparent); - current_binding_level->keep = 2; - clear_last_expr (); - - /* Note we don't call push_momentary() here. Otherwise, it would cause - cleanups to be allocated on the momentary obstack, and they will be - overwritten by the next statement. */ - - expand_start_bindings (0); -} - -/* For a binding between a name and an entity at a block scope, - this is the `struct binding_level' for the block. */ -#define BINDING_LEVEL(NODE) \ - (((struct tree_binding*)NODE)->scope.level) - -/* These are currently unused, but permanent, CPLUS_BINDING nodes. - They are kept here because they are allocated from the permanent - obstack and cannot be easily freed. */ -static tree free_binding_nodes; - -/* Make DECL the innermost binding for ID. The LEVEL is the binding - level at which this declaration is being bound. */ - -static void -push_binding (id, decl, level) - tree id; - tree decl; - struct binding_level* level; -{ - tree binding; - - if (!free_binding_nodes) - { - /* There are no free nodes, so we must build one here. */ - push_obstacks_nochange (); - end_temporary_allocation (); - binding = make_node (CPLUS_BINDING); - pop_obstacks (); - } - else - { - /* There are nodes on the free list. Grab the first one. */ - binding = free_binding_nodes; - - /* And update the free list. */ - free_binding_nodes = TREE_CHAIN (free_binding_nodes); - } - - /* Now, fill in the binding information. */ - BINDING_VALUE (binding) = decl; - BINDING_TYPE (binding) = NULL_TREE; - BINDING_LEVEL (binding) = level; - LOCAL_BINDING_P (binding) = (level != class_binding_level); - - /* And put it on the front of the ilst of bindings for ID. */ - TREE_CHAIN (binding) = IDENTIFIER_BINDING (id); - IDENTIFIER_BINDING (id) = binding; -} - -/* ID is already bound in the current scope. But, DECL is an - additional binding for ID in the same scope. This is the `struct - stat' hack whereby a non-typedef class-name or enum-name can be - bound at the same level as some other kind of entity. It's the - responsibility of the caller to check that inserting this name is - legal here. */ -static void -add_binding (id, decl) - tree id; - tree decl; -{ - tree binding = IDENTIFIER_BINDING (id); - - if (TREE_CODE (decl) == TYPE_DECL && DECL_ARTIFICIAL (decl)) - /* The new name is the type name. */ - BINDING_TYPE (binding) = decl; - else - { - /* The old name must be the type name. It was placed in - IDENTIFIER_VALUE because it was thought, at the point it - was declared, to be the only entity with such a name. */ - my_friendly_assert (TREE_CODE (BINDING_VALUE (binding)) == TYPE_DECL - && DECL_ARTIFICIAL (BINDING_VALUE (binding)), - 0); - - /* Move the type name into the type slot; it is now hidden by - the new binding. */ - BINDING_TYPE (binding) = BINDING_VALUE (binding); - BINDING_VALUE (binding) = decl; - } -} - -/* Bind DECL to ID in the current_binding_level. - If PUSH_USING is set in FLAGS, we know that DECL doesn't really belong - to this binding level, that it got here through a using-declaration. */ - -void -push_local_binding (id, decl, flags) - tree id; - tree decl; - int flags; -{ - tree d = decl; - - if (lookup_name_current_level (id)) - /* Supplement the existing binding. */ - add_binding (id, d); - else - /* Create a new binding. */ - push_binding (id, d, current_binding_level); - - if (TREE_CODE (decl) == OVERLOAD || (flags & PUSH_USING)) - /* We must put the OVERLOAD into a TREE_LIST since the - TREE_CHAIN of an OVERLOAD is already used. Similarly for - decls that got here through a using-declaration. */ - decl = build_tree_list (NULL_TREE, decl); - - /* And put DECL on the list of things declared by the current - binding level. */ - TREE_CHAIN (decl) = current_binding_level->names; - current_binding_level->names = decl; -} - -/* Bind DECL to ID in the class_binding_level. */ - -void -push_class_binding (id, decl) - tree id; - tree decl; -{ - if (IDENTIFIER_BINDING (id) - && BINDING_LEVEL (IDENTIFIER_BINDING (id)) == class_binding_level) - /* Supplement the existing binding. */ - add_binding (id, decl); - else - /* Create a new binding. */ - push_binding (id, decl, class_binding_level); - - /* Update the IDENTIFIER_CLASS_VALUE for this ID to be the - class-level declaration. Note that we do not use DECL here - because of the possibility of the `struct stat' hack; if DECL is - a class-name or enum-name we might prefer a field-name, or some - such. */ - IDENTIFIER_CLASS_VALUE (id) = BINDING_VALUE (IDENTIFIER_BINDING (id)); -} - -/* Remove the binding for DECL which should be the innermost binding - for ID. */ - -static void -pop_binding (id, decl) - tree id; - tree decl; -{ - tree binding; - - if (id == NULL_TREE) - /* It's easiest to write the loops that call this function without - checking whether or not the entities involved have names. We - get here for such an entity. */ - return; - - /* Get the innermost binding for ID. */ - binding = IDENTIFIER_BINDING (id); - - /* The name should be bound. */ - my_friendly_assert (binding != NULL_TREE, 0); - - /* The DECL will be either the ordinary binding or the type - binding for this identifier. Remove that binding. */ - if (BINDING_VALUE (binding) == decl) - BINDING_VALUE (binding) = NULL_TREE; - else if (BINDING_TYPE (binding) == decl) - BINDING_TYPE (binding) = NULL_TREE; - else - my_friendly_abort (0); - - if (!BINDING_VALUE (binding) && !BINDING_TYPE (binding)) - { - /* We're completely done with the innermost binding for this - identifier. Unhook it from the list of bindings. */ - IDENTIFIER_BINDING (id) = TREE_CHAIN (binding); - - /* And place it on the free list. */ - TREE_CHAIN (binding) = free_binding_nodes; - free_binding_nodes = binding; - } -} - -/* Exit a binding level. - Pop the level off, and restore the state of the identifier-decl mappings - that were in effect when this level was entered. - - If KEEP == 1, this level had explicit declarations, so - and create a "block" (a BLOCK node) for the level - to record its declarations and subblocks for symbol table output. - - If FUNCTIONBODY is nonzero, this level is the body of a function, - so create a block as if KEEP were set and also clear out all - label names. - - If REVERSE is nonzero, reverse the order of decls before putting - them into the BLOCK. */ - -tree -poplevel (keep, reverse, functionbody) - int keep; - int reverse; - int functionbody; -{ - register tree link; - /* The chain of decls was accumulated in reverse order. - Put it into forward order, just for cleanliness. */ - tree decls; - int tmp = functionbody; - int real_functionbody = current_binding_level->keep == 2 - ? ((functionbody = 0), tmp) : functionbody; - tree tags = functionbody >= 0 ? current_binding_level->tags : 0; - tree subblocks = functionbody >= 0 ? current_binding_level->blocks : 0; - tree block = NULL_TREE; - tree decl; - int block_previously_created; - int leaving_for_scope; - - if (current_binding_level->parm_flag == 2 - || current_binding_level->class_shadowed) - /* We should not be using poplevel to pop a class binding level. - Use poplevel_class instead. */ - my_friendly_abort (0); - - /* We used to use KEEP == 2 to indicate that the new block should go - at the beginning of the list of blocks at this binding level, - rather than the end. This hack is no longer used. */ - my_friendly_assert (keep == 0 || keep == 1, 0); - - GNU_xref_end_scope ((HOST_WIDE_INT) current_binding_level, - (HOST_WIDE_INT) current_binding_level->level_chain, - current_binding_level->parm_flag, - current_binding_level->keep); - - if (current_binding_level->keep == 1) - keep = 1; - - /* Get the decls in the order they were written. - Usually current_binding_level->names is in reverse order. - But parameter decls were previously put in forward order. */ - - if (reverse) - current_binding_level->names - = decls = nreverse (current_binding_level->names); - else - decls = current_binding_level->names; - - /* Output any nested inline functions within this block - if they weren't already output. */ - - for (decl = decls; decl; decl = TREE_CHAIN (decl)) - if (TREE_CODE (decl) == FUNCTION_DECL - && ! TREE_ASM_WRITTEN (decl) - && DECL_INITIAL (decl) != NULL_TREE - && TREE_ADDRESSABLE (decl) - && decl_function_context (decl) == current_function_decl) - { - /* If this decl was copied from a file-scope decl - on account of a block-scope extern decl, - propagate TREE_ADDRESSABLE to the file-scope decl. */ - if (DECL_ABSTRACT_ORIGIN (decl) != NULL_TREE) - TREE_ADDRESSABLE (DECL_ABSTRACT_ORIGIN (decl)) = 1; - else - { - push_function_context (); - output_inline_function (decl); - pop_function_context (); - } - } - - /* If there were any declarations or structure tags in that level, - or if this level is a function body, - create a BLOCK to record them for the life of this function. */ - - block = NULL_TREE; - block_previously_created = (current_binding_level->this_block != NULL_TREE); - if (block_previously_created) - block = current_binding_level->this_block; - else if (keep == 1 || functionbody) - block = make_node (BLOCK); - if (block != NULL_TREE) - { - if (block_previously_created) - { - if (decls || tags || subblocks) - { - if (BLOCK_VARS (block) || BLOCK_TYPE_TAGS (block)) - warning ("internal compiler error: debugging info corrupted"); - - BLOCK_VARS (block) = decls; - BLOCK_TYPE_TAGS (block) = tags; - - /* We can have previous subblocks and new subblocks when - doing fixup_gotos with complex cleanups. We chain the new - subblocks onto the end of any pre-existing subblocks. */ - BLOCK_SUBBLOCKS (block) = chainon (BLOCK_SUBBLOCKS (block), - subblocks); - } - /* If we created the block earlier on, and we are just - diddling it now, then it already should have a proper - BLOCK_END_NOTE value associated with it. */ - } - else - { - BLOCK_VARS (block) = decls; - BLOCK_TYPE_TAGS (block) = tags; - BLOCK_SUBBLOCKS (block) = subblocks; - /* Otherwise, for a new block, install a new BLOCK_END_NOTE - value. */ - remember_end_note (block); - } - } - - /* In each subblock, record that this is its superior. */ - - if (keep >= 0) - for (link = subblocks; link; link = TREE_CHAIN (link)) - BLOCK_SUPERCONTEXT (link) = block; - - /* We still support the old for-scope rules, whereby the variables - in a for-init statement were in scope after the for-statement - ended. We only use the new rules in flag_new_for_scope is - nonzero. */ - leaving_for_scope - = current_binding_level->is_for_scope && flag_new_for_scope == 1; - - /* Remove declarations for all the DECLs in this level. */ - for (link = decls; link; link = TREE_CHAIN (link)) - { - if (leaving_for_scope && TREE_CODE (link) == VAR_DECL) - { - tree outer_binding - = TREE_CHAIN (IDENTIFIER_BINDING (DECL_NAME (link))); - tree ns_binding; - - if (!outer_binding) - ns_binding = IDENTIFIER_NAMESPACE_VALUE (DECL_NAME (link)); - else - ns_binding = NULL_TREE; - - if (outer_binding - && (BINDING_LEVEL (outer_binding) - == current_binding_level->level_chain)) - /* We have something like: - - int i; - for (int i; ;); - - and we are leaving the `for' scope. There's no reason to - keep the binding of the inner `i' in this case. */ - pop_binding (DECL_NAME (link), link); - else if ((outer_binding - && (TREE_CODE (BINDING_VALUE (outer_binding)) - == TYPE_DECL)) - || (ns_binding - && TREE_CODE (ns_binding) == TYPE_DECL)) - /* Here, we have something like: - - typedef int I; - - void f () { - for (int I; ;); - } - - We must pop the for-scope binding so we know what's a - type and what isn't. */ - pop_binding (DECL_NAME (link), link); - else - { - /* Mark this VAR_DECL as dead so that we can tell we left it - there only for backward compatibility. */ - DECL_DEAD_FOR_LOCAL (link) = 1; - - /* Keep track of what should of have happenned when we - popped the binding. */ - if (outer_binding && BINDING_VALUE (outer_binding)) - DECL_SHADOWED_FOR_VAR (link) - = BINDING_VALUE (outer_binding); - - /* Add it to the list of dead variables in the next - outermost binding to that we can remove these when we - leave that binding. */ - current_binding_level->level_chain->dead_vars_from_for - = tree_cons (NULL_TREE, link, - current_binding_level->level_chain-> - dead_vars_from_for); - - /* Although we don't pop the CPLUS_BINDING, we do clear - its BINDING_LEVEL since the level is going away now. */ - BINDING_LEVEL (IDENTIFIER_BINDING (DECL_NAME (link))) - = 0; - } - } - else - { - /* Remove the binding. */ - decl = link; - if (TREE_CODE (decl) == TREE_LIST) - decl = TREE_VALUE (decl); - if (TREE_CODE_CLASS (TREE_CODE (decl)) == 'd') - pop_binding (DECL_NAME (decl), decl); - else if (TREE_CODE (decl) == OVERLOAD) - pop_binding (DECL_NAME (OVL_FUNCTION (decl)), decl); - else - my_friendly_abort (0); - } - } - - /* Remove declarations for any `for' variables from inner scopes - that we kept around. */ - for (link = current_binding_level->dead_vars_from_for; - link; link = TREE_CHAIN (link)) - pop_binding (DECL_NAME (TREE_VALUE (link)), TREE_VALUE (link)); - - /* Restore the IDENTIFIER_TYPE_VALUEs. */ - for (link = current_binding_level->type_shadowed; - link; link = TREE_CHAIN (link)) - SET_IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (link), TREE_VALUE (link)); - - /* There may be OVERLOADs (wrapped in TREE_LISTs) on the BLOCK_VARs - list if a `using' declaration put them there. The debugging - back-ends won't understand OVERLOAD, so we remove them here. - Because the BLOCK_VARS are (temporarily) shared with - CURRENT_BINDING_LEVEL->NAMES we must do this fixup after we have - popped all the bindings. */ - if (block) - { - tree* d; - - for (d = &BLOCK_VARS (block); *d; ) - { - if (TREE_CODE (*d) == TREE_LIST) - *d = TREE_CHAIN (*d); - else - d = &TREE_CHAIN (*d); - } - } - - /* If the level being exited is the top level of a function, - check over all the labels. */ - - if (functionbody) - { - /* If this is the top level block of a function, - the vars are the function's parameters. - Don't leave them in the BLOCK because they are - found in the FUNCTION_DECL instead. */ - - BLOCK_VARS (block) = 0; - - /* Clear out the definitions of all label names, - since their scopes end here. */ - - for (link = named_labels; link; link = TREE_CHAIN (link)) - { - register tree label = TREE_VALUE (link); - - if (DECL_INITIAL (label) == NULL_TREE) - { - cp_error_at ("label `%D' used but not defined", label); - /* Avoid crashing later. */ - define_label (input_filename, 1, DECL_NAME (label)); - } - else if (warn_unused && !TREE_USED (label)) - cp_warning_at ("label `%D' defined but not used", label); - SET_IDENTIFIER_LABEL_VALUE (DECL_NAME (label), NULL_TREE); - - /* Put the labels into the "variables" of the - top-level block, so debugger can see them. */ - TREE_CHAIN (label) = BLOCK_VARS (block); - BLOCK_VARS (block) = label; - } - - named_labels = NULL_TREE; - } - - /* Any uses of undefined labels now operate under constraints - of next binding contour. */ - { - struct binding_level *level_chain; - level_chain = current_binding_level->level_chain; - if (level_chain) - { - struct named_label_list *labels; - for (labels = named_label_uses; labels; labels = labels->next) - if (labels->binding_level == current_binding_level) - { - labels->binding_level = level_chain; - labels->names_in_scope = level_chain->names; - } - } - } - - tmp = current_binding_level->keep; - - pop_binding_level (); - if (functionbody) - DECL_INITIAL (current_function_decl) = block; - else if (block) - { - if (!block_previously_created) - current_binding_level->blocks - = chainon (current_binding_level->blocks, block); - } - /* If we did not make a block for the level just exited, - any blocks made for inner levels - (since they cannot be recorded as subblocks in that level) - must be carried forward so they will later become subblocks - of something else. */ - else if (subblocks) - current_binding_level->blocks - = chainon (current_binding_level->blocks, subblocks); - - /* Take care of compiler's internal binding structures. */ - if (tmp == 2) - { - expand_end_bindings (getdecls (), keep, 1); - /* Each and every BLOCK node created here in `poplevel' is important - (e.g. for proper debugging information) so if we created one - earlier, mark it as "used". */ - if (block) - TREE_USED (block) = 1; - block = poplevel (keep, reverse, real_functionbody); - } - - /* Each and every BLOCK node created here in `poplevel' is important - (e.g. for proper debugging information) so if we created one - earlier, mark it as "used". */ - if (block) - TREE_USED (block) = 1; - return block; -} - -/* Delete the node BLOCK from the current binding level. - This is used for the block inside a stmt expr ({...}) - so that the block can be reinserted where appropriate. */ - -void -delete_block (block) - tree block; -{ - tree t; - if (current_binding_level->blocks == block) - current_binding_level->blocks = TREE_CHAIN (block); - for (t = current_binding_level->blocks; t;) - { - if (TREE_CHAIN (t) == block) - TREE_CHAIN (t) = TREE_CHAIN (block); - else - t = TREE_CHAIN (t); - } - TREE_CHAIN (block) = NULL_TREE; - /* Clear TREE_USED which is always set by poplevel. - The flag is set again if insert_block is called. */ - TREE_USED (block) = 0; -} - -/* Insert BLOCK at the end of the list of subblocks of the - current binding level. This is used when a BIND_EXPR is expanded, - to handle the BLOCK node inside the BIND_EXPR. */ - -void -insert_block (block) - tree block; -{ - TREE_USED (block) = 1; - current_binding_level->blocks - = chainon (current_binding_level->blocks, block); -} - -/* Set the BLOCK node for the innermost scope - (the one we are currently in). */ - -void -set_block (block) - register tree block; -{ - current_binding_level->this_block = block; -} - -/* Do a pushlevel for class declarations. */ - -void -pushlevel_class () -{ - register struct binding_level *newlevel; - - /* Reuse or create a struct for this binding level. */ -#if defined(DEBUG_CP_BINDING_LEVELS) - if (0) -#else /* !defined(DEBUG_CP_BINDING_LEVELS) */ - if (free_binding_level) -#endif /* !defined(DEBUG_CP_BINDING_LEVELS) */ - { - newlevel = free_binding_level; - free_binding_level = free_binding_level->level_chain; - } - else - newlevel = make_binding_level (); - -#if defined(DEBUG_CP_BINDING_LEVELS) - is_class_level = 1; -#endif /* defined(DEBUG_CP_BINDING_LEVELS) */ - - push_binding_level (newlevel, 0, 0); - - decl_stack = push_decl_level (decl_stack, &decl_obstack); - class_binding_level = current_binding_level; - class_binding_level->parm_flag = 2; - /* We have just pushed into a new binding level. Now, fake out the rest - of the compiler. Set the `current_binding_level' back to point to - the most closely containing non-class binding level. */ - do - { - current_binding_level = current_binding_level->level_chain; - } - while (current_binding_level->parm_flag == 2); -} - -/* ...and a poplevel for class declarations. FORCE is used to force - clearing out of CLASS_VALUEs after a class definition. */ - -tree -poplevel_class (force) - int force; -{ - register struct binding_level *level = class_binding_level; - tree block = NULL_TREE; - tree shadowed; - - my_friendly_assert (level != 0, 354); - - decl_stack = pop_stack_level (decl_stack); - /* If we're leaving a toplevel class, don't bother to do the setting - of IDENTIFIER_CLASS_VALUE to NULL_TREE, since first of all this slot - shouldn't even be used when current_class_type isn't set, and second, - if we don't touch it here, we're able to use the cache effect if the - next time we're entering a class scope, it is the same class. */ - if (current_class_depth != 1 || force) - for (shadowed = level->class_shadowed; - shadowed; - shadowed = TREE_CHAIN (shadowed)) - IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (shadowed)) = TREE_VALUE (shadowed); - else - /* Remember to save what IDENTIFIER's were bound in this scope so we - can recover from cache misses. */ - { - previous_class_type = current_class_type; - previous_class_values = class_binding_level->class_shadowed; - } - for (shadowed = level->type_shadowed; - shadowed; - shadowed = TREE_CHAIN (shadowed)) - SET_IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (shadowed), TREE_VALUE (shadowed)); - - /* Remove the bindings for all of the class-level declarations. */ - for (shadowed = level->class_shadowed; - shadowed; - shadowed = TREE_CHAIN (shadowed)) - pop_binding (TREE_PURPOSE (shadowed), TREE_TYPE (shadowed)); - - GNU_xref_end_scope ((HOST_WIDE_INT) class_binding_level, - (HOST_WIDE_INT) class_binding_level->level_chain, - class_binding_level->parm_flag, - class_binding_level->keep); - - if (class_binding_level->parm_flag != 2) - class_binding_level = (struct binding_level *)0; - - /* Now, pop out of the binding level which we created up in the - `pushlevel_class' routine. */ -#if defined(DEBUG_CP_BINDING_LEVELS) - is_class_level = 1; -#endif /* defined(DEBUG_CP_BINDING_LEVELS) */ - - pop_binding_level (); - - return block; -} - -/* For debugging. */ -static int no_print_functions = 0; -static int no_print_builtins = 0; - -void -print_binding_level (lvl) - struct binding_level *lvl; -{ - tree t; - int i = 0, len; - fprintf (stderr, " blocks="); - fprintf (stderr, HOST_PTR_PRINTF, lvl->blocks); - fprintf (stderr, " n_incomplete=%d parm_flag=%d keep=%d", - list_length (lvl->incomplete), lvl->parm_flag, lvl->keep); - if (lvl->tag_transparent) - fprintf (stderr, " tag-transparent"); - if (lvl->more_cleanups_ok) - fprintf (stderr, " more-cleanups-ok"); - if (lvl->have_cleanups) - fprintf (stderr, " have-cleanups"); - fprintf (stderr, "\n"); - if (lvl->names) - { - fprintf (stderr, " names:\t"); - /* We can probably fit 3 names to a line? */ - for (t = lvl->names; t; t = TREE_CHAIN (t)) - { - if (no_print_functions && (TREE_CODE (t) == FUNCTION_DECL)) - continue; - if (no_print_builtins - && (TREE_CODE (t) == TYPE_DECL) - && (!strcmp (DECL_SOURCE_FILE (t),""))) - continue; - - /* Function decls tend to have longer names. */ - if (TREE_CODE (t) == FUNCTION_DECL) - len = 3; - else - len = 2; - i += len; - if (i > 6) - { - fprintf (stderr, "\n\t"); - i = len; - } - print_node_brief (stderr, "", t, 0); - if (t == error_mark_node) - break; - } - if (i) - fprintf (stderr, "\n"); - } - if (lvl->tags) - { - fprintf (stderr, " tags:\t"); - i = 0; - for (t = lvl->tags; t; t = TREE_CHAIN (t)) - { - if (TREE_PURPOSE (t) == NULL_TREE) - len = 3; - else if (TREE_PURPOSE (t) == TYPE_IDENTIFIER (TREE_VALUE (t))) - len = 2; - else - len = 4; - i += len; - if (i > 5) - { - fprintf (stderr, "\n\t"); - i = len; - } - if (TREE_PURPOSE (t) == NULL_TREE) - { - print_node_brief (stderr, ""); - } - else if (TREE_PURPOSE (t) == TYPE_IDENTIFIER (TREE_VALUE (t))) - print_node_brief (stderr, "", TREE_VALUE (t), 0); - else - { - print_node_brief (stderr, ""); - } - } - if (i) - fprintf (stderr, "\n"); - } - if (lvl->class_shadowed) - { - fprintf (stderr, " class-shadowed:"); - for (t = lvl->class_shadowed; t; t = TREE_CHAIN (t)) - { - fprintf (stderr, " %s ", IDENTIFIER_POINTER (TREE_PURPOSE (t))); - } - fprintf (stderr, "\n"); - } - if (lvl->type_shadowed) - { - fprintf (stderr, " type-shadowed:"); - for (t = lvl->type_shadowed; t; t = TREE_CHAIN (t)) - { - fprintf (stderr, " %s ", IDENTIFIER_POINTER (TREE_PURPOSE (t))); - } - fprintf (stderr, "\n"); - } -} - -void -print_other_binding_stack (stack) - struct binding_level *stack; -{ - struct binding_level *level; - for (level = stack; level != global_binding_level; level = level->level_chain) - { - fprintf (stderr, "binding level "); - fprintf (stderr, HOST_PTR_PRINTF, level); - fprintf (stderr, "\n"); - print_binding_level (level); - } -} - -void -print_binding_stack () -{ - struct binding_level *b; - fprintf (stderr, "current_binding_level="); - fprintf (stderr, HOST_PTR_PRINTF, current_binding_level); - fprintf (stderr, "\nclass_binding_level="); - fprintf (stderr, HOST_PTR_PRINTF, class_binding_level); - fprintf (stderr, "\nglobal_binding_level="); - fprintf (stderr, HOST_PTR_PRINTF, global_binding_level); - fprintf (stderr, "\n"); - if (class_binding_level) - { - for (b = class_binding_level; b; b = b->level_chain) - if (b == current_binding_level) - break; - if (b) - b = class_binding_level; - else - b = current_binding_level; - } - else - b = current_binding_level; - print_other_binding_stack (b); - fprintf (stderr, "global:\n"); - print_binding_level (global_binding_level); -} - -/* Namespace binding access routines: The namespace_bindings field of - the identifier is polymorphic, with three possible values: - NULL_TREE, a list of CPLUS_BINDINGS, or any other tree_node - indicating the BINDING_VALUE of global_namespace. */ - -/* Check whether the a binding for the name to scope is known. - Assumes that the bindings of the name are already a list - of bindings. Returns the binding found, or NULL_TREE. */ - -static tree -find_binding (name, scope) - tree name; - tree scope; -{ - tree iter, prev = NULL_TREE; - - scope = ORIGINAL_NAMESPACE (scope); - - for (iter = IDENTIFIER_NAMESPACE_BINDINGS (name); iter; - iter = TREE_CHAIN (iter)) - { - my_friendly_assert (TREE_CODE (iter) == CPLUS_BINDING, 374); - if (BINDING_SCOPE (iter) == scope) - { - /* Move binding found to the fron of the list, so - subsequent lookups will find it faster. */ - if (prev) - { - TREE_CHAIN (prev) = TREE_CHAIN (iter); - TREE_CHAIN (iter) = IDENTIFIER_NAMESPACE_BINDINGS (name); - IDENTIFIER_NAMESPACE_BINDINGS (name) = iter; - } - return iter; - } - prev = iter; - } - return NULL_TREE; -} - -/* Always returns a binding for name in scope. If the - namespace_bindings is not a list, convert it to one first. - If no binding is found, make a new one. */ - -tree -binding_for_name (name, scope) - tree name; - tree scope; -{ - tree b = IDENTIFIER_NAMESPACE_BINDINGS (name); - tree result; - - scope = ORIGINAL_NAMESPACE (scope); - - if (b && TREE_CODE (b) != CPLUS_BINDING) - { - /* Get rid of optimization for global scope. */ - IDENTIFIER_NAMESPACE_BINDINGS (name) = NULL_TREE; - BINDING_VALUE (binding_for_name (name, global_namespace)) = b; - b = IDENTIFIER_NAMESPACE_BINDINGS (name); - } - if (b && (result = find_binding (name, scope))) - return result; - /* Not found, make a new permanent one. */ - push_obstacks (&permanent_obstack, &permanent_obstack); - result = make_node (CPLUS_BINDING); - TREE_CHAIN (result) = b; - IDENTIFIER_NAMESPACE_BINDINGS (name) = result; - BINDING_SCOPE (result) = scope; - BINDING_TYPE (result) = NULL_TREE; - BINDING_VALUE (result) = NULL_TREE; - pop_obstacks (); - return result; -} - -/* Return the binding value for name in scope, considering that - namespace_binding may or may not be a list of CPLUS_BINDINGS. */ - -tree -namespace_binding (name, scope) - tree name; - tree scope; -{ - tree b = IDENTIFIER_NAMESPACE_BINDINGS (name); - if (b == NULL_TREE) - return NULL_TREE; - if (scope == NULL_TREE) - scope = global_namespace; - if (TREE_CODE (b) != CPLUS_BINDING) - return (scope == global_namespace) ? b : NULL_TREE; - name = find_binding (name,scope); - if (name == NULL_TREE) - return name; - return BINDING_VALUE (name); -} - -/* Set the binding value for name in scope. If modifying the binding - of global_namespace is attempted, try to optimize it. */ - -void -set_namespace_binding (name, scope, val) - tree name; - tree scope; - tree val; -{ - tree b; - - if (scope == NULL_TREE) - scope = global_namespace; - - if (scope == global_namespace) - { - b = IDENTIFIER_NAMESPACE_BINDINGS (name); - if (b == NULL_TREE || TREE_CODE (b) != CPLUS_BINDING) - { - IDENTIFIER_NAMESPACE_BINDINGS (name) = val; - return; - } - } - b = binding_for_name (name, scope); - BINDING_VALUE (b) = val; -} - -/* Push into the scope of the NAME namespace. If NAME is NULL_TREE, then we - select a name that is unique to this compilation unit. */ - -void -push_namespace (name) - tree name; -{ - tree d = NULL_TREE; - int need_new = 1; - int implicit_use = 0; - int global = 0; - if (!global_namespace) - { - /* This must be ::. */ - my_friendly_assert (name == get_identifier ("::"), 377); - global = 1; - } - else if (!name) - { - /* The name of anonymous namespace is unique for the translation - unit. */ - if (!anonymous_namespace_name) - anonymous_namespace_name = get_file_function_name ('N'); - name = anonymous_namespace_name; - d = IDENTIFIER_NAMESPACE_VALUE (name); - if (d) - /* Reopening anonymous namespace. */ - need_new = 0; - implicit_use = 1; - } - else if (current_namespace == global_namespace - && name == DECL_NAME (std_node)) - { - in_std++; - return; - } - else - { - /* Check whether this is an extended namespace definition. */ - d = IDENTIFIER_NAMESPACE_VALUE (name); - if (d != NULL_TREE && TREE_CODE (d) == NAMESPACE_DECL) - { - need_new = 0; - if (DECL_NAMESPACE_ALIAS (d)) - { - cp_error ("namespace alias `%D' not allowed here, assuming `%D'", - d, DECL_NAMESPACE_ALIAS (d)); - d = DECL_NAMESPACE_ALIAS (d); - } - } - } - - if (need_new) - { - /* Make a new namespace, binding the name to it. */ - d = build_lang_decl (NAMESPACE_DECL, name, void_type_node); - /* The global namespace is not pushed, and the global binding - level is set elsewhere. */ - if (!global) - { - d = pushdecl (d); - pushlevel (0); - declare_namespace_level (); - NAMESPACE_LEVEL (d) = current_binding_level; - } - } - else - resume_binding_level (NAMESPACE_LEVEL (d)); - - if (implicit_use) - do_using_directive (d); - /* Enter the name space. */ - current_namespace = d; -} - -/* Pop from the scope of the current namespace. */ - -void -pop_namespace () -{ - if (current_namespace == global_namespace) - { - my_friendly_assert (in_std>0, 980421); - in_std--; - return; - } - current_namespace = CP_DECL_CONTEXT (current_namespace); - /* The binding level is not popped, as it might be re-opened later. */ - suspend_binding_level (); -} - -/* Concatenate the binding levels of all namespaces. */ - -void -cat_namespace_levels() -{ - tree current; - tree last; - struct binding_level *b; - - last = NAMESPACE_LEVEL (global_namespace) -> names; - /* The nested namespaces appear in the names list of their ancestors. */ - for (current = last; current; current = TREE_CHAIN (current)) - { - /* Catch simple infinite loops. */ - if (TREE_CHAIN (current) == current) - my_friendly_abort (990126); - - if (TREE_CODE (current) != NAMESPACE_DECL - || DECL_NAMESPACE_ALIAS (current)) - continue; - if (!DECL_LANG_SPECIFIC (current)) - { - /* Hmm. std. */ - my_friendly_assert (current == std_node, 393); - continue; - } - b = NAMESPACE_LEVEL (current); - while (TREE_CHAIN (last)) - last = TREE_CHAIN (last); - TREE_CHAIN (last) = NAMESPACE_LEVEL (current) -> names; - } -} - -/* Subroutines for reverting temporarily to top-level for instantiation - of templates and such. We actually need to clear out the class- and - local-value slots of all identifiers, so that only the global values - are at all visible. Simply setting current_binding_level to the global - scope isn't enough, because more binding levels may be pushed. */ -struct saved_scope { - struct binding_level *old_binding_level; - tree old_bindings; - tree old_namespace; - struct saved_scope *prev; - tree class_name, class_type; - tree access_specifier; - tree function_decl; - struct binding_level *class_bindings; - tree *lang_base, *lang_stack, lang_name; - int lang_stacksize; - int minimal_parse_mode; - tree last_function_parms; - tree template_parms; - HOST_WIDE_INT processing_template_decl; - tree previous_class_type, previous_class_values; - int processing_specialization; - int processing_explicit_instantiation; -}; -static struct saved_scope *current_saved_scope; - -/* A chain of the binding vecs created by store_bindings. We create a - whole bunch of these during compilation, on permanent_obstack, so we - can't just throw them away. */ -static tree free_binding_vecs; - -static tree -store_bindings (names, old_bindings) - tree names, old_bindings; -{ - tree t; - for (t = names; t; t = TREE_CHAIN (t)) - { - tree binding, t1, id; - - if (TREE_CODE (t) == TREE_LIST) - id = TREE_PURPOSE (t); - else - id = DECL_NAME (t); - - if (!id - /* Note that we may have an IDENTIFIER_CLASS_VALUE even when - we have no IDENTIFIER_BINDING if we have left the class - scope, but cached the class-level declarations. */ - || !(IDENTIFIER_BINDING (id) || IDENTIFIER_CLASS_VALUE (id))) - continue; - - for (t1 = old_bindings; t1; t1 = TREE_CHAIN (t1)) - if (TREE_VEC_ELT (t1, 0) == id) - goto skip_it; - - if (free_binding_vecs) - { - binding = free_binding_vecs; - free_binding_vecs = TREE_CHAIN (free_binding_vecs); - } - else - binding = make_tree_vec (4); - - if (id) - { - my_friendly_assert (TREE_CODE (id) == IDENTIFIER_NODE, 135); - TREE_VEC_ELT (binding, 0) = id; - TREE_VEC_ELT (binding, 1) = REAL_IDENTIFIER_TYPE_VALUE (id); - TREE_VEC_ELT (binding, 2) = IDENTIFIER_BINDING (id); - TREE_VEC_ELT (binding, 3) = IDENTIFIER_CLASS_VALUE (id); - IDENTIFIER_BINDING (id) = NULL_TREE; - IDENTIFIER_CLASS_VALUE (id) = NULL_TREE; - } - TREE_CHAIN (binding) = old_bindings; - old_bindings = binding; - skip_it: - ; - } - return old_bindings; -} - -void -maybe_push_to_top_level (pseudo) - int pseudo; -{ - extern int current_lang_stacksize; - struct saved_scope *s - = (struct saved_scope *) xmalloc (sizeof (struct saved_scope)); - struct binding_level *b = inner_binding_level; - tree old_bindings = NULL_TREE; - - if (current_function_decl) - push_cp_function_context (NULL_TREE); - - if (previous_class_type) - old_bindings = store_bindings (previous_class_values, old_bindings); - - /* Have to include global_binding_level, because class-level decls - aren't listed anywhere useful. */ - for (; b; b = b->level_chain) - { - tree t; - - /* Template IDs are inserted into the global level. If they were - inserted into namespace level, finish_file wouldn't find them - when doing pending instantiations. Therefore, don't stop at - namespace level, but continue until :: . */ - if (b == global_binding_level || (pseudo && b->pseudo_global)) - break; - - old_bindings = store_bindings (b->names, old_bindings); - /* We also need to check class_shadowed to save class-level type - bindings, since pushclass doesn't fill in b->names. */ - if (b->parm_flag == 2) - old_bindings = store_bindings (b->class_shadowed, old_bindings); - - /* Unwind type-value slots back to top level. */ - for (t = b->type_shadowed; t; t = TREE_CHAIN (t)) - SET_IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (t), TREE_VALUE (t)); - } - - s->old_binding_level = current_binding_level; - current_binding_level = b; - - s->old_namespace = current_namespace; - s->class_name = current_class_name; - s->class_type = current_class_type; - s->access_specifier = current_access_specifier; - s->function_decl = current_function_decl; - s->class_bindings = class_binding_level; - s->lang_stack = current_lang_stack; - s->lang_base = current_lang_base; - s->lang_stacksize = current_lang_stacksize; - s->lang_name = current_lang_name; - s->minimal_parse_mode = minimal_parse_mode; - s->last_function_parms = last_function_parms; - s->template_parms = current_template_parms; - s->processing_template_decl = processing_template_decl; - s->previous_class_type = previous_class_type; - s->previous_class_values = previous_class_values; - s->processing_specialization = processing_specialization; - s->processing_explicit_instantiation = processing_explicit_instantiation; - - current_class_name = current_class_type = NULL_TREE; - current_function_decl = NULL_TREE; - class_binding_level = (struct binding_level *)0; - current_lang_stacksize = 10; - current_lang_stack = current_lang_base - = (tree *) xmalloc (current_lang_stacksize * sizeof (tree)); - current_lang_name = lang_name_cplusplus; - strict_prototype = strict_prototypes_lang_cplusplus; - named_labels = NULL_TREE; - shadowed_labels = NULL_TREE; - minimal_parse_mode = 0; - previous_class_type = previous_class_values = NULL_TREE; - processing_specialization = 0; - processing_explicit_instantiation = 0; - current_template_parms = NULL_TREE; - processing_template_decl = 0; - current_namespace = global_namespace; - - s->prev = current_saved_scope; - s->old_bindings = old_bindings; - current_saved_scope = s; - - push_obstacks (&permanent_obstack, &permanent_obstack); -} - -void -push_to_top_level () -{ - maybe_push_to_top_level (0); -} - -void -pop_from_top_level () -{ - extern int current_lang_stacksize; - struct saved_scope *s = current_saved_scope; - tree t; - - /* Clear out class-level bindings cache. */ - if (previous_class_type) - { - popclass (-1); - previous_class_type = NULL_TREE; - } - - pop_obstacks (); - - current_binding_level = s->old_binding_level; - current_saved_scope = s->prev; - for (t = s->old_bindings; t; ) - { - tree save = t; - tree id = TREE_VEC_ELT (t, 0); - if (id) - { - SET_IDENTIFIER_TYPE_VALUE (id, TREE_VEC_ELT (t, 1)); - IDENTIFIER_BINDING (id) = TREE_VEC_ELT (t, 2); - IDENTIFIER_CLASS_VALUE (id) = TREE_VEC_ELT (t, 3); - } - t = TREE_CHAIN (t); - TREE_CHAIN (save) = free_binding_vecs; - free_binding_vecs = save; - } - current_namespace = s->old_namespace; - current_class_name = s->class_name; - current_class_type = s->class_type; - current_access_specifier = s->access_specifier; - current_function_decl = s->function_decl; - class_binding_level = s->class_bindings; - free (current_lang_base); - current_lang_base = s->lang_base; - current_lang_stack = s->lang_stack; - current_lang_name = s->lang_name; - current_lang_stacksize = s->lang_stacksize; - if (current_lang_name == lang_name_cplusplus) - strict_prototype = strict_prototypes_lang_cplusplus; - else if (current_lang_name == lang_name_c) - strict_prototype = strict_prototypes_lang_c; - minimal_parse_mode = s->minimal_parse_mode; - last_function_parms = s->last_function_parms; - current_template_parms = s->template_parms; - processing_template_decl = s->processing_template_decl; - previous_class_type = s->previous_class_type; - previous_class_values = s->previous_class_values; - processing_specialization = s->processing_specialization; - processing_explicit_instantiation = s->processing_explicit_instantiation; - - free (s); - - if (current_function_decl) - pop_cp_function_context (NULL_TREE); -} - -/* Push a definition of struct, union or enum tag "name". - into binding_level "b". "type" should be the type node, - We assume that the tag "name" is not already defined. - - Note that the definition may really be just a forward reference. - In that case, the TYPE_SIZE will be a NULL_TREE. - - C++ gratuitously puts all these tags in the name space. */ - -/* When setting the IDENTIFIER_TYPE_VALUE field of an identifier ID, - record the shadowed value for this binding contour. TYPE is - the type that ID maps to. */ - -static void -set_identifier_type_value_with_scope (id, type, b) - tree id; - tree type; - struct binding_level *b; -{ - if (!b->namespace_p) - { - /* Shadow the marker, not the real thing, so that the marker - gets restored later. */ - tree old_type_value = REAL_IDENTIFIER_TYPE_VALUE (id); - b->type_shadowed - = tree_cons (id, old_type_value, b->type_shadowed); - } - else - { - tree binding = binding_for_name (id, current_namespace); - BINDING_TYPE (binding) = type; - /* Store marker instead of real type. */ - type = global_type_node; - } - SET_IDENTIFIER_TYPE_VALUE (id, type); -} - -/* As set_identifier_type_value_with_scope, but using inner_binding_level. */ - -void -set_identifier_type_value (id, type) - tree id; - tree type; -{ - set_identifier_type_value_with_scope (id, type, inner_binding_level); -} - -/* Return the type associated with id. */ - -tree -identifier_type_value (id) - tree id; -{ - /* There is no type with that name, anywhere. */ - if (REAL_IDENTIFIER_TYPE_VALUE (id) == NULL_TREE) - return NULL_TREE; - /* This is not the type marker, but the real thing. */ - if (REAL_IDENTIFIER_TYPE_VALUE (id) != global_type_node) - return REAL_IDENTIFIER_TYPE_VALUE (id); - /* Have to search for it. It must be on the global level, now. - Ask lookup_name not to return non-types. */ - id = lookup_name_real (id, 2, 1, 0); - if (id) - return TREE_TYPE (id); - return NULL_TREE; -} - -/* Pop off extraneous binding levels left over due to syntax errors. - - We don't pop past namespaces, as they might be valid. */ - -void -pop_everything () -{ -#ifdef DEBUG_CP_BINDING_LEVELS - fprintf (stderr, "XXX entering pop_everything ()\n"); -#endif - while (! toplevel_bindings_p () && ! pseudo_global_level_p ()) - { - if (class_binding_level) - pop_nested_class (1); - else - poplevel (0, 0, 0); - } -#ifdef DEBUG_CP_BINDING_LEVELS - fprintf (stderr, "XXX leaving pop_everything ()\n"); -#endif -} - -/* The type TYPE is being declared. If it is a class template, or a - specialization of a class template, do any processing required and - perform error-checking. If IS_FRIEND is non-zero, this TYPE is - being declared a friend. B is the binding level at which this TYPE - should be bound. - - Returns the TYPE_DECL for TYPE, which may have been altered by this - processing. */ - -static tree -maybe_process_template_type_declaration (type, globalize, b) - tree type; - int globalize; - struct binding_level* b; -{ - tree decl = TYPE_NAME (type); - - if (processing_template_parmlist) - /* You can't declare a new template type in a template parameter - list. But, you can declare a non-template type: - - template struct S; - - is a forward-declaration of `A'. */ - ; - else - { - maybe_check_template_type (type); - - my_friendly_assert (IS_AGGR_TYPE (type) - || TREE_CODE (type) == ENUMERAL_TYPE, 0); - - - if (/* If !GLOBALIZE then we are looking at a definition. - It may not be a primary template. (For example, in: - - template - struct S1 { class S2 {}; } - - we have to push_template_decl for S2.) */ - (processing_template_decl && !globalize) - /* If we are declaring a friend template class, we will - have GLOBALIZE set, since something like: - - template - struct S1 { - template - friend class S2; - }; - - declares S2 to be at global scope. */ - || PROCESSING_REAL_TEMPLATE_DECL_P ()) - { - /* This may change after the call to - push_template_decl_real, but we want the original value. */ - tree name = DECL_NAME (decl); - - decl = push_template_decl_real (decl, globalize); - /* If the current binding level is the binding level for the - template parameters (see the comment in - begin_template_parm_list) and the enclosing level is a class - scope, and we're not looking at a friend, push the - declaration of the member class into the class scope. In the - friend case, push_template_decl will already have put the - friend into global scope, if appropriate. */ - if (TREE_CODE (type) != ENUMERAL_TYPE - && !globalize && b->pseudo_global - && b->level_chain->parm_flag == 2) - { - pushdecl_with_scope (CLASSTYPE_TI_TEMPLATE (type), - b->level_chain); - finish_member_declaration (CLASSTYPE_TI_TEMPLATE (type)); - /* Put this tag on the list of tags for the class, since - that won't happen below because B is not the class - binding level, but is instead the pseudo-global level. */ - b->level_chain->tags = - saveable_tree_cons (name, type, b->level_chain->tags); - TREE_NONLOCAL_FLAG (type) = 1; - if (TYPE_SIZE (current_class_type) == NULL_TREE) - CLASSTYPE_TAGS (current_class_type) = b->level_chain->tags; - } - } - } - - return decl; -} - -/* Push a tag name NAME for struct/class/union/enum type TYPE. - Normally put it into the inner-most non-tag-transparent scope, - but if GLOBALIZE is true, put it in the inner-most non-class scope. - The latter is needed for implicit declarations. */ - -void -pushtag (name, type, globalize) - tree name, type; - int globalize; -{ - register struct binding_level *b; - tree context = 0; - tree c_decl = 0; - - b = inner_binding_level; - while (b->tag_transparent - || (globalize && b->parm_flag == 2)) - b = b->level_chain; - - if (toplevel_bindings_p ()) - b->tags = perm_tree_cons (name, type, b->tags); - else - b->tags = saveable_tree_cons (name, type, b->tags); - - if (name) - { - context = type ? TYPE_CONTEXT (type) : NULL_TREE; - if (! context) - { - tree cs = current_scope (); - - if (! globalize) - context = cs; - else if (cs != NULL_TREE - && TREE_CODE_CLASS (TREE_CODE (cs)) == 't') - /* When declaring a friend class of a local class, we want - to inject the newly named class into the scope - containing the local class, not the namespace scope. */ - context = hack_decl_function_context (get_type_decl (cs)); - } - if (context) - c_decl = TREE_CODE (context) == FUNCTION_DECL - ? context : TYPE_MAIN_DECL (context); - - if (!context) - context = current_namespace; - - /* Do C++ gratuitous typedefing. */ - if (IDENTIFIER_TYPE_VALUE (name) != type) - { - register tree d = NULL_TREE; - int newdecl = 0, in_class = 0; - - if ((b->pseudo_global && b->level_chain->parm_flag == 2) - || b->parm_flag == 2) - in_class = 1; - else - d = lookup_nested_type (type, c_decl); - - if (d == NULL_TREE) - { - newdecl = 1; - d = build_decl (TYPE_DECL, name, type); - if (current_lang_name == lang_name_java) - TYPE_FOR_JAVA (type) = 1; - SET_DECL_ARTIFICIAL (d); - if (! in_class) - set_identifier_type_value_with_scope (name, type, b); - } - else - d = TYPE_MAIN_DECL (d); - - TYPE_NAME (type) = d; - DECL_CONTEXT (d) = FROB_CONTEXT (context); - - d = maybe_process_template_type_declaration (type, - globalize, b); - - if (b->parm_flag == 2) - { - pushdecl_class_level (d); - if (newdecl && !PROCESSING_REAL_TEMPLATE_DECL_P ()) - /* Put this TYPE_DECL on the TYPE_FIELDS list for the - class. But if it's a member template class, we - want the TEMPLATE_DECL, not the TYPE_DECL, so this - is done later. */ - finish_member_declaration (d); - } - else - d = pushdecl_with_scope (d, b); - - if (newdecl) - { - if (ANON_AGGRNAME_P (name)) - DECL_IGNORED_P (d) = 1; - - TYPE_CONTEXT (type) = DECL_CONTEXT (d); - DECL_ASSEMBLER_NAME (d) = DECL_NAME (d); - if (!uses_template_parms (type)) - DECL_ASSEMBLER_NAME (d) - = get_identifier (build_overload_name (type, 1, 1)); - } - } - if (b->parm_flag == 2) - { - TREE_NONLOCAL_FLAG (type) = 1; - if (TYPE_SIZE (current_class_type) == NULL_TREE) - CLASSTYPE_TAGS (current_class_type) = b->tags; - } - } - - if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL) - /* Use the canonical TYPE_DECL for this node. */ - TYPE_STUB_DECL (type) = TYPE_NAME (type); - else - { - /* Create a fake NULL-named TYPE_DECL node whose TREE_TYPE - will be the tagged type we just added to the current - binding level. This fake NULL-named TYPE_DECL node helps - dwarfout.c to know when it needs to output a - representation of a tagged type, and it also gives us a - convenient place to record the "scope start" address for - the tagged type. */ - - tree d = build_decl (TYPE_DECL, NULL_TREE, type); - TYPE_STUB_DECL (type) = pushdecl_with_scope (d, b); - } -} - -/* Counter used to create anonymous type names. */ - -static int anon_cnt = 0; - -/* Return an IDENTIFIER which can be used as a name for - anonymous structs and unions. */ - -tree -make_anon_name () -{ - char buf[32]; - - sprintf (buf, ANON_AGGRNAME_FORMAT, anon_cnt++); - return get_identifier (buf); -} - -/* Clear the TREE_PURPOSE slot of tags which have anonymous typenames. - This keeps dbxout from getting confused. */ - -void -clear_anon_tags () -{ - register struct binding_level *b; - register tree tags; - static int last_cnt = 0; - - /* Fast out if no new anon names were declared. */ - if (last_cnt == anon_cnt) - return; - - b = current_binding_level; - while (b->tag_transparent) - b = b->level_chain; - tags = b->tags; - while (tags) - { - /* A NULL purpose means we have already processed all tags - from here to the end of the list. */ - if (TREE_PURPOSE (tags) == NULL_TREE) - break; - if (ANON_AGGRNAME_P (TREE_PURPOSE (tags))) - TREE_PURPOSE (tags) = NULL_TREE; - tags = TREE_CHAIN (tags); - } - last_cnt = anon_cnt; -} - -/* Subroutine of duplicate_decls: return truthvalue of whether - or not types of these decls match. - - For C++, we must compare the parameter list so that `int' can match - `int&' in a parameter position, but `int&' is not confused with - `const int&'. */ - -int -decls_match (newdecl, olddecl) - tree newdecl, olddecl; -{ - int types_match; - - if (newdecl == olddecl) - return 1; - - if (TREE_CODE (newdecl) != TREE_CODE (olddecl)) - /* If the two DECLs are not even the same kind of thing, we're not - interested in their types. */ - return 0; - - if (TREE_CODE (newdecl) == FUNCTION_DECL) - { - tree f1 = TREE_TYPE (newdecl); - tree f2 = TREE_TYPE (olddecl); - tree p1 = TYPE_ARG_TYPES (f1); - tree p2 = TYPE_ARG_TYPES (f2); - - if (DECL_REAL_CONTEXT (newdecl) != DECL_REAL_CONTEXT (olddecl) - && ! (DECL_LANGUAGE (newdecl) == lang_c - && DECL_LANGUAGE (olddecl) == lang_c)) - return 0; - - /* When we parse a static member function definition, - we put together a FUNCTION_DECL which thinks its type - is METHOD_TYPE. Change that to FUNCTION_TYPE, and - proceed. */ - if (TREE_CODE (f1) == METHOD_TYPE && DECL_STATIC_FUNCTION_P (olddecl)) - revert_static_member_fn (&newdecl, &f1, &p1); - else if (TREE_CODE (f2) == METHOD_TYPE - && DECL_STATIC_FUNCTION_P (newdecl)) - revert_static_member_fn (&olddecl, &f2, &p2); - - /* Here we must take care of the case where new default - parameters are specified. Also, warn if an old - declaration becomes ambiguous because default - parameters may cause the two to be ambiguous. */ - if (TREE_CODE (f1) != TREE_CODE (f2)) - { - if (TREE_CODE (f1) == OFFSET_TYPE) - cp_compiler_error ("`%D' redeclared as member function", newdecl); - else - cp_compiler_error ("`%D' redeclared as non-member function", newdecl); - return 0; - } - - if (same_type_p (TREE_TYPE (f1), TREE_TYPE (f2))) - { - if (! strict_prototypes_lang_c && DECL_LANGUAGE (olddecl) == lang_c - && p2 == NULL_TREE) - { - types_match = self_promoting_args_p (p1); - if (p1 == void_list_node) - TREE_TYPE (newdecl) = TREE_TYPE (olddecl); - } - else if (!strict_prototypes_lang_c && DECL_LANGUAGE (olddecl)==lang_c - && DECL_LANGUAGE (newdecl) == lang_c && p1 == NULL_TREE) - { - types_match = self_promoting_args_p (p2); - TREE_TYPE (newdecl) = TREE_TYPE (olddecl); - } - else - types_match = compparms (p1, p2); - } - else - types_match = 0; - } - else if (TREE_CODE (newdecl) == TEMPLATE_DECL) - { - if (!comp_template_parms (DECL_TEMPLATE_PARMS (newdecl), - DECL_TEMPLATE_PARMS (olddecl))) - return 0; - - if (TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) == TYPE_DECL) - types_match = 1; - else - types_match = decls_match (DECL_TEMPLATE_RESULT (olddecl), - DECL_TEMPLATE_RESULT (newdecl)); - } - else - { - if (TREE_TYPE (newdecl) == error_mark_node) - types_match = TREE_TYPE (olddecl) == error_mark_node; - else if (TREE_TYPE (olddecl) == NULL_TREE) - types_match = TREE_TYPE (newdecl) == NULL_TREE; - else if (TREE_TYPE (newdecl) == NULL_TREE) - types_match = 0; - else - types_match = comptypes (TREE_TYPE (newdecl), - TREE_TYPE (olddecl), - COMPARE_REDECLARATION); - } - - return types_match; -} - -/* If NEWDECL is `static' and an `extern' was seen previously, - warn about it. (OLDDECL may be NULL_TREE; NAME contains - information about previous usage as an `extern'.) - - Note that this does not apply to the C++ case of declaring - a variable `extern const' and then later `const'. - - Don't complain about built-in functions, since they are beyond - the user's control. */ - -static void -warn_extern_redeclared_static (newdecl, olddecl) - tree newdecl, olddecl; -{ - tree name; - - static char *explicit_extern_static_warning - = "`%D' was declared `extern' and later `static'"; - static char *implicit_extern_static_warning - = "`%D' was declared implicitly `extern' and later `static'"; - - if (TREE_CODE (newdecl) == TYPE_DECL) - return; - - name = DECL_ASSEMBLER_NAME (newdecl); - if (TREE_PUBLIC (name) && DECL_THIS_STATIC (newdecl)) - { - /* It's okay to redeclare an ANSI built-in function as static, - or to declare a non-ANSI built-in function as anything. */ - if (! (TREE_CODE (newdecl) == FUNCTION_DECL - && olddecl != NULL_TREE - && TREE_CODE (olddecl) == FUNCTION_DECL - && (DECL_BUILT_IN (olddecl) - || DECL_BUILT_IN_NONANSI (olddecl)))) - { - cp_pedwarn (IDENTIFIER_IMPLICIT_DECL (name) - ? implicit_extern_static_warning - : explicit_extern_static_warning, newdecl); - if (olddecl != NULL_TREE) - cp_pedwarn_at ("previous declaration of `%D'", olddecl); - } - } -} - -/* Handle when a new declaration NEWDECL has the same name as an old - one OLDDECL in the same binding contour. Prints an error message - if appropriate. - - If safely possible, alter OLDDECL to look like NEWDECL, and return 1. - Otherwise, return 0. */ - -int -duplicate_decls (newdecl, olddecl) - tree newdecl, olddecl; -{ - extern struct obstack permanent_obstack; - unsigned olddecl_uid = DECL_UID (olddecl); - int olddecl_friend = 0, types_match = 0; - int new_defines_function = 0; - - if (newdecl == olddecl) - return 1; - - types_match = decls_match (newdecl, olddecl); - - /* If either the type of the new decl or the type of the old decl is an - error_mark_node, then that implies that we have already issued an - error (earlier) for some bogus type specification, and in that case, - it is rather pointless to harass the user with yet more error message - about the same declaration, so just pretend the types match here. */ - if (TREE_TYPE (newdecl) == error_mark_node - || TREE_TYPE (olddecl) == error_mark_node) - types_match = 1; - - /* Check for redeclaration and other discrepancies. */ - if (TREE_CODE (olddecl) == FUNCTION_DECL - && DECL_ARTIFICIAL (olddecl) - && (DECL_BUILT_IN (olddecl) || DECL_BUILT_IN_NONANSI (olddecl))) - { - /* If you declare a built-in or predefined function name as static, - the old definition is overridden, but optionally warn this was a - bad choice of name. Ditto for overloads. */ - if (! TREE_PUBLIC (newdecl) - || (TREE_CODE (newdecl) == FUNCTION_DECL - && DECL_LANGUAGE (newdecl) != DECL_LANGUAGE (olddecl))) - { - if (warn_shadow) - cp_warning ("shadowing %s function `%#D'", - DECL_BUILT_IN (olddecl) ? "built-in" : "library", - olddecl); - /* Discard the old built-in function. */ - return 0; - } - else if (! types_match) - { - if (TREE_CODE (newdecl) != FUNCTION_DECL) - { - /* If the built-in is not ansi, then programs can override - it even globally without an error. */ - if (! DECL_BUILT_IN (olddecl)) - cp_warning ("library function `%#D' redeclared as non-function `%#D'", - olddecl, newdecl); - else - { - cp_error ("declaration of `%#D'", newdecl); - cp_error ("conflicts with built-in declaration `%#D'", - olddecl); - } - return 0; - } - - cp_warning ("declaration of `%#D'", newdecl); - cp_warning ("conflicts with built-in declaration `%#D'", - olddecl); - } - } - else if (TREE_CODE (olddecl) != TREE_CODE (newdecl)) - { - if ((TREE_CODE (olddecl) == TYPE_DECL && DECL_ARTIFICIAL (olddecl) - && TREE_CODE (newdecl) != TYPE_DECL - && ! (TREE_CODE (newdecl) == TEMPLATE_DECL - && TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) == TYPE_DECL)) - || (TREE_CODE (newdecl) == TYPE_DECL && DECL_ARTIFICIAL (newdecl) - && TREE_CODE (olddecl) != TYPE_DECL - && ! (TREE_CODE (olddecl) == TEMPLATE_DECL - && (TREE_CODE (DECL_TEMPLATE_RESULT (olddecl)) - == TYPE_DECL)))) - { - /* We do nothing special here, because C++ does such nasty - things with TYPE_DECLs. Instead, just let the TYPE_DECL - get shadowed, and know that if we need to find a TYPE_DECL - for a given name, we can look in the IDENTIFIER_TYPE_VALUE - slot of the identifier. */ - return 0; - } - - if ((TREE_CODE (newdecl) == FUNCTION_DECL - && DECL_FUNCTION_TEMPLATE_P (olddecl)) - || (TREE_CODE (olddecl) == FUNCTION_DECL - && DECL_FUNCTION_TEMPLATE_P (newdecl))) - return 0; - - cp_error ("`%#D' redeclared as different kind of symbol", newdecl); - if (TREE_CODE (olddecl) == TREE_LIST) - olddecl = TREE_VALUE (olddecl); - cp_error_at ("previous declaration of `%#D'", olddecl); - - /* New decl is completely inconsistent with the old one => - tell caller to replace the old one. */ - - return 0; - } - else if (!types_match) - { - if (DECL_REAL_CONTEXT (newdecl) != DECL_REAL_CONTEXT (olddecl)) - /* These are certainly not duplicate declarations; they're - from different scopes. */ - return 0; - - if (TREE_CODE (newdecl) == TEMPLATE_DECL) - { - /* The name of a class template may not be declared to refer to - any other template, class, function, object, namespace, value, - or type in the same scope. */ - if (TREE_CODE (DECL_TEMPLATE_RESULT (olddecl)) == TYPE_DECL - || TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) == TYPE_DECL) - { - cp_error ("declaration of template `%#D'", newdecl); - cp_error_at ("conflicts with previous declaration `%#D'", - olddecl); - } - else if (TREE_CODE (DECL_TEMPLATE_RESULT (olddecl)) == FUNCTION_DECL - && TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) == FUNCTION_DECL - && compparms (TYPE_ARG_TYPES (TREE_TYPE (DECL_TEMPLATE_RESULT (olddecl))), - TYPE_ARG_TYPES (TREE_TYPE (DECL_TEMPLATE_RESULT (newdecl)))) - && comp_template_parms (DECL_TEMPLATE_PARMS (newdecl), - DECL_TEMPLATE_PARMS (olddecl))) - { - cp_error ("new declaration `%#D'", newdecl); - cp_error_at ("ambiguates old declaration `%#D'", olddecl); - } - return 0; - } - if (TREE_CODE (newdecl) == FUNCTION_DECL) - { - if (DECL_LANGUAGE (newdecl) == lang_c - && DECL_LANGUAGE (olddecl) == lang_c) - { - cp_error ("declaration of C function `%#D' conflicts with", - newdecl); - cp_error_at ("previous declaration `%#D' here", olddecl); - } - else if (compparms (TYPE_ARG_TYPES (TREE_TYPE (newdecl)), - TYPE_ARG_TYPES (TREE_TYPE (olddecl)))) - { - cp_error ("new declaration `%#D'", newdecl); - cp_error_at ("ambiguates old declaration `%#D'", olddecl); - } - else - return 0; - } - - /* Already complained about this, so don't do so again. */ - else if (current_class_type == NULL_TREE - || IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (newdecl)) != current_class_type) - { - cp_error ("conflicting types for `%#D'", newdecl); - cp_error_at ("previous declaration as `%#D'", olddecl); - } - } - else if (TREE_CODE (newdecl) == FUNCTION_DECL - && ((DECL_TEMPLATE_SPECIALIZATION (olddecl) - && (!DECL_TEMPLATE_INFO (newdecl) - || (DECL_TI_TEMPLATE (newdecl) - != DECL_TI_TEMPLATE (olddecl)))) - || (DECL_TEMPLATE_SPECIALIZATION (newdecl) - && (!DECL_TEMPLATE_INFO (olddecl) - || (DECL_TI_TEMPLATE (olddecl) - != DECL_TI_TEMPLATE (newdecl)))))) - /* It's OK to have a template specialization and a non-template - with the same type, or to have specializations of two - different templates with the same type. Note that if one is a - specialization, and the other is an instantiation of the same - template, that we do not exit at this point. That situation - can occur if we instantiate a template class, and then - specialize one of its methods. This situation is legal, but - the declarations must be merged in the usual way. */ - return 0; - else if (TREE_CODE (newdecl) == FUNCTION_DECL - && ((DECL_TEMPLATE_INSTANTIATION (olddecl) - && !DECL_USE_TEMPLATE (newdecl)) - || (DECL_TEMPLATE_INSTANTIATION (newdecl) - && !DECL_USE_TEMPLATE (olddecl)))) - /* One of the declarations is a template instantiation, and the - other is not a template at all. That's OK. */ - return 0; - else if (TREE_CODE (newdecl) == NAMESPACE_DECL - && DECL_NAMESPACE_ALIAS (newdecl) - && DECL_NAMESPACE_ALIAS (newdecl) == DECL_NAMESPACE_ALIAS (olddecl)) - /* Redeclaration of namespace alias, ignore it. */ - return 1; - else - { - char *errmsg = redeclaration_error_message (newdecl, olddecl); - if (errmsg) - { - cp_error (errmsg, newdecl); - if (DECL_NAME (olddecl) != NULL_TREE) - cp_error_at ((DECL_INITIAL (olddecl) - && namespace_bindings_p ()) - ? "`%#D' previously defined here" - : "`%#D' previously declared here", olddecl); - } - else if (TREE_CODE (olddecl) == FUNCTION_DECL - && DECL_INITIAL (olddecl) != NULL_TREE - && TYPE_ARG_TYPES (TREE_TYPE (olddecl)) == NULL_TREE - && TYPE_ARG_TYPES (TREE_TYPE (newdecl)) != NULL_TREE) - { - /* Prototype decl follows defn w/o prototype. */ - cp_warning_at ("prototype for `%#D'", newdecl); - cp_warning_at ("follows non-prototype definition here", olddecl); - } - else if (TREE_CODE (olddecl) == FUNCTION_DECL - && DECL_LANGUAGE (newdecl) != DECL_LANGUAGE (olddecl)) - { - /* extern "C" int foo (); - int foo () { bar (); } - is OK. */ - if (current_lang_stack == current_lang_base) - DECL_LANGUAGE (newdecl) = DECL_LANGUAGE (olddecl); - else - { - cp_error_at ("previous declaration of `%#D' with %L linkage", - olddecl, DECL_LANGUAGE (olddecl)); - cp_error ("conflicts with new declaration with %L linkage", - DECL_LANGUAGE (newdecl)); - } - } - - if (DECL_LANG_SPECIFIC (olddecl) && DECL_USE_TEMPLATE (olddecl)) - ; - else if (TREE_CODE (olddecl) == FUNCTION_DECL) - { - tree t1 = TYPE_ARG_TYPES (TREE_TYPE (olddecl)); - tree t2 = TYPE_ARG_TYPES (TREE_TYPE (newdecl)); - int i = 1; - - if (TREE_CODE (TREE_TYPE (newdecl)) == METHOD_TYPE) - t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2); - - for (; t1 && t1 != void_list_node; - t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2), i++) - if (TREE_PURPOSE (t1) && TREE_PURPOSE (t2)) - { - if (1 == simple_cst_equal (TREE_PURPOSE (t1), - TREE_PURPOSE (t2))) - { - if (pedantic) - { - cp_pedwarn ("default argument given for parameter %d of `%#D'", - i, newdecl); - cp_pedwarn_at ("after previous specification in `%#D'", - olddecl); - } - } - else - { - cp_error ("default argument given for parameter %d of `%#D'", - i, newdecl); - cp_error_at ("after previous specification in `%#D'", - olddecl); - } - } - - if (DECL_THIS_INLINE (newdecl) && ! DECL_THIS_INLINE (olddecl) - && TREE_ADDRESSABLE (olddecl) && warn_inline) - { - cp_warning ("`%#D' was used before it was declared inline", - newdecl); - cp_warning_at ("previous non-inline declaration here", - olddecl); - } - } - } - - /* If new decl is `static' and an `extern' was seen previously, - warn about it. */ - warn_extern_redeclared_static (newdecl, olddecl); - - /* We have committed to returning 1 at this point. */ - if (TREE_CODE (newdecl) == FUNCTION_DECL) - { - /* Now that functions must hold information normally held - by field decls, there is extra work to do so that - declaration information does not get destroyed during - definition. */ - if (DECL_VINDEX (olddecl)) - DECL_VINDEX (newdecl) = DECL_VINDEX (olddecl); - if (DECL_CONTEXT (olddecl)) - DECL_CONTEXT (newdecl) = DECL_CONTEXT (olddecl); - if (DECL_CLASS_CONTEXT (olddecl)) - DECL_CLASS_CONTEXT (newdecl) = DECL_CLASS_CONTEXT (olddecl); - if (DECL_PENDING_INLINE_INFO (newdecl) == (struct pending_inline *)0) - DECL_PENDING_INLINE_INFO (newdecl) = DECL_PENDING_INLINE_INFO (olddecl); - DECL_STATIC_CONSTRUCTOR (newdecl) |= DECL_STATIC_CONSTRUCTOR (olddecl); - DECL_STATIC_DESTRUCTOR (newdecl) |= DECL_STATIC_DESTRUCTOR (olddecl); - DECL_ABSTRACT_VIRTUAL_P (newdecl) |= DECL_ABSTRACT_VIRTUAL_P (olddecl); - DECL_VIRTUAL_P (newdecl) |= DECL_VIRTUAL_P (olddecl); - DECL_NEEDS_FINAL_OVERRIDER_P (newdecl) |= DECL_NEEDS_FINAL_OVERRIDER_P (olddecl); - new_defines_function = DECL_INITIAL (newdecl) != NULL_TREE; - - /* Optionally warn about more than one declaration for the same - name, but don't warn about a function declaration followed by a - definition. */ - if (warn_redundant_decls && ! DECL_ARTIFICIAL (olddecl) - && !(new_defines_function && DECL_INITIAL (olddecl) == NULL_TREE) - /* Don't warn about extern decl followed by definition. */ - && !(DECL_EXTERNAL (olddecl) && ! DECL_EXTERNAL (newdecl)) - /* Don't warn about friends, let add_friend take care of it. */ - && ! DECL_FRIEND_P (newdecl)) - { - cp_warning ("redundant redeclaration of `%D' in same scope", newdecl); - cp_warning_at ("previous declaration of `%D'", olddecl); - } - } - - /* Deal with C++: must preserve virtual function table size. */ - if (TREE_CODE (olddecl) == TYPE_DECL) - { - register tree newtype = TREE_TYPE (newdecl); - register tree oldtype = TREE_TYPE (olddecl); - - if (newtype != error_mark_node && oldtype != error_mark_node - && TYPE_LANG_SPECIFIC (newtype) && TYPE_LANG_SPECIFIC (oldtype)) - { - CLASSTYPE_VSIZE (newtype) = CLASSTYPE_VSIZE (oldtype); - CLASSTYPE_FRIEND_CLASSES (newtype) - = CLASSTYPE_FRIEND_CLASSES (oldtype); - } - } - - /* Copy all the DECL_... slots specified in the new decl - except for any that we copy here from the old type. */ - DECL_MACHINE_ATTRIBUTES (newdecl) - = merge_machine_decl_attributes (olddecl, newdecl); - - if (TREE_CODE (newdecl) == TEMPLATE_DECL) - { - if (! duplicate_decls (DECL_TEMPLATE_RESULT (newdecl), - DECL_TEMPLATE_RESULT (olddecl))) - cp_error ("invalid redeclaration of %D", newdecl); - TREE_TYPE (olddecl) = TREE_TYPE (DECL_TEMPLATE_RESULT (olddecl)); - DECL_TEMPLATE_SPECIALIZATIONS (olddecl) - = chainon (DECL_TEMPLATE_SPECIALIZATIONS (olddecl), - DECL_TEMPLATE_SPECIALIZATIONS (newdecl)); - - return 1; - } - - if (types_match) - { - /* Automatically handles default parameters. */ - tree oldtype = TREE_TYPE (olddecl); - tree newtype; - - /* Make sure we put the new type in the same obstack as the old one. */ - if (oldtype) - push_obstacks (TYPE_OBSTACK (oldtype), TYPE_OBSTACK (oldtype)); - else - { - push_obstacks_nochange (); - end_temporary_allocation (); - } - - /* Merge the data types specified in the two decls. */ - newtype = common_type (TREE_TYPE (newdecl), TREE_TYPE (olddecl)); - - if (TREE_CODE (newdecl) == VAR_DECL) - DECL_THIS_EXTERN (newdecl) |= DECL_THIS_EXTERN (olddecl); - /* Do this after calling `common_type' so that default - parameters don't confuse us. */ - else if (TREE_CODE (newdecl) == FUNCTION_DECL - && (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (newdecl)) - != TYPE_RAISES_EXCEPTIONS (TREE_TYPE (olddecl)))) - { - TREE_TYPE (newdecl) = build_exception_variant (newtype, - TYPE_RAISES_EXCEPTIONS (TREE_TYPE (newdecl))); - TREE_TYPE (olddecl) = build_exception_variant (newtype, - TYPE_RAISES_EXCEPTIONS (oldtype)); - - if ((pedantic || ! DECL_IN_SYSTEM_HEADER (olddecl)) - && DECL_SOURCE_LINE (olddecl) != 0 - && flag_exceptions - && ! compexcepttypes (TREE_TYPE (newdecl), TREE_TYPE (olddecl))) - { - cp_pedwarn ("declaration of `%D' throws different exceptions", - newdecl); - cp_pedwarn_at ("previous declaration here", olddecl); - } - } - TREE_TYPE (newdecl) = TREE_TYPE (olddecl) = newtype; - - /* Lay the type out, unless already done. */ - if (newtype != canonical_type_variant (oldtype) - && TREE_TYPE (newdecl) != error_mark_node - && !(processing_template_decl && uses_template_parms (newdecl))) - layout_type (TREE_TYPE (newdecl)); - - if ((TREE_CODE (newdecl) == VAR_DECL - || TREE_CODE (newdecl) == PARM_DECL - || TREE_CODE (newdecl) == RESULT_DECL - || TREE_CODE (newdecl) == FIELD_DECL - || TREE_CODE (newdecl) == TYPE_DECL) - && !(processing_template_decl && uses_template_parms (newdecl))) - layout_decl (newdecl, 0); - - /* Merge the type qualifiers. */ - if (TREE_READONLY (newdecl)) - TREE_READONLY (olddecl) = 1; - if (TREE_THIS_VOLATILE (newdecl)) - TREE_THIS_VOLATILE (olddecl) = 1; - - /* Merge the initialization information. */ - if (DECL_INITIAL (newdecl) == NULL_TREE - && DECL_INITIAL (olddecl) != NULL_TREE) - { - DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl); - DECL_SOURCE_FILE (newdecl) = DECL_SOURCE_FILE (olddecl); - DECL_SOURCE_LINE (newdecl) = DECL_SOURCE_LINE (olddecl); - if (DECL_LANG_SPECIFIC (newdecl) - && DECL_LANG_SPECIFIC (olddecl)) - DECL_SAVED_TREE (newdecl) = DECL_SAVED_TREE (olddecl); - } - - /* Merge the section attribute. - We want to issue an error if the sections conflict but that must be - done later in decl_attributes since we are called before attributes - are assigned. */ - if (DECL_SECTION_NAME (newdecl) == NULL_TREE) - DECL_SECTION_NAME (newdecl) = DECL_SECTION_NAME (olddecl); - - /* Keep the old rtl since we can safely use it, unless it's the - call to abort() used for abstract virtuals. */ - if ((DECL_LANG_SPECIFIC (olddecl) - && !DECL_ABSTRACT_VIRTUAL_P (olddecl)) - || DECL_RTL (olddecl) != DECL_RTL (abort_fndecl)) - DECL_RTL (newdecl) = DECL_RTL (olddecl); - - pop_obstacks (); - } - /* If cannot merge, then use the new type and qualifiers, - and don't preserve the old rtl. */ - else - { - /* Clean out any memory we had of the old declaration. */ - tree oldstatic = value_member (olddecl, static_aggregates); - if (oldstatic) - TREE_VALUE (oldstatic) = error_mark_node; - - TREE_TYPE (olddecl) = TREE_TYPE (newdecl); - TREE_READONLY (olddecl) = TREE_READONLY (newdecl); - TREE_THIS_VOLATILE (olddecl) = TREE_THIS_VOLATILE (newdecl); - TREE_SIDE_EFFECTS (olddecl) = TREE_SIDE_EFFECTS (newdecl); - } - - /* Merge the storage class information. */ - DECL_WEAK (newdecl) |= DECL_WEAK (olddecl); - DECL_ONE_ONLY (newdecl) |= DECL_ONE_ONLY (olddecl); - TREE_PUBLIC (newdecl) = TREE_PUBLIC (olddecl); - TREE_STATIC (olddecl) = TREE_STATIC (newdecl) |= TREE_STATIC (olddecl); - if (! DECL_EXTERNAL (olddecl)) - DECL_EXTERNAL (newdecl) = 0; - - if (DECL_LANG_SPECIFIC (newdecl) && DECL_LANG_SPECIFIC (olddecl)) - { - DECL_INTERFACE_KNOWN (newdecl) |= DECL_INTERFACE_KNOWN (olddecl); - DECL_NOT_REALLY_EXTERN (newdecl) |= DECL_NOT_REALLY_EXTERN (olddecl); - DECL_COMDAT (newdecl) |= DECL_COMDAT (olddecl); - /* Don't really know how much of the language-specific - values we should copy from old to new. */ - DECL_IN_AGGR_P (newdecl) = DECL_IN_AGGR_P (olddecl); - DECL_ACCESS (newdecl) = DECL_ACCESS (olddecl); - DECL_NONCONVERTING_P (newdecl) = DECL_NONCONVERTING_P (olddecl); - DECL_TEMPLATE_INFO (newdecl) = DECL_TEMPLATE_INFO (olddecl); - olddecl_friend = DECL_FRIEND_P (olddecl); - } - - if (TREE_CODE (newdecl) == FUNCTION_DECL) - { - if (DECL_TEMPLATE_INSTANTIATION (olddecl) - && !DECL_TEMPLATE_INSTANTIATION (newdecl)) - { - /* If newdecl is not a specialization, then it is not a - template-related function at all. And that means that we - shoud have exited above, returning 0. */ - my_friendly_assert (DECL_TEMPLATE_SPECIALIZATION (newdecl), - 0); - - if (TREE_USED (olddecl)) - /* From [temp.expl.spec]: - - If a template, a member template or the member of a class - template is explicitly specialized then that - specialization shall be declared before the first use of - that specialization that would cause an implicit - instantiation to take place, in every translation unit in - which such a use occurs. */ - cp_error ("explicit specialization of %D after first use", - olddecl); - - SET_DECL_TEMPLATE_SPECIALIZATION (olddecl); - } - DECL_THIS_INLINE (newdecl) |= DECL_THIS_INLINE (olddecl); - - /* If either decl says `inline', this fn is inline, unless its - definition was passed already. */ - if (DECL_INLINE (newdecl) && DECL_INITIAL (olddecl) == NULL_TREE) - DECL_INLINE (olddecl) = 1; - DECL_INLINE (newdecl) = DECL_INLINE (olddecl); - - if (! types_match) - { - DECL_LANGUAGE (olddecl) = DECL_LANGUAGE (newdecl); - DECL_ASSEMBLER_NAME (olddecl) = DECL_ASSEMBLER_NAME (newdecl); - DECL_RTL (olddecl) = DECL_RTL (newdecl); - } - if (! types_match || new_defines_function) - { - /* These need to be copied so that the names are available. */ - DECL_ARGUMENTS (olddecl) = DECL_ARGUMENTS (newdecl); - DECL_RESULT (olddecl) = DECL_RESULT (newdecl); - } - if (new_defines_function) - /* If defining a function declared with other language - linkage, use the previously declared language linkage. */ - DECL_LANGUAGE (newdecl) = DECL_LANGUAGE (olddecl); - else - { - /* If redeclaring a builtin function, and not a definition, - it stays built in. */ - if (DECL_BUILT_IN (olddecl)) - { - DECL_BUILT_IN (newdecl) = 1; - DECL_FUNCTION_CODE (newdecl) = DECL_FUNCTION_CODE (olddecl); - /* If we're keeping the built-in definition, keep the rtl, - regardless of declaration matches. */ - DECL_RTL (newdecl) = DECL_RTL (olddecl); - } - else - DECL_FRAME_SIZE (newdecl) = DECL_FRAME_SIZE (olddecl); - - DECL_RESULT (newdecl) = DECL_RESULT (olddecl); - if ((DECL_SAVED_INSNS (newdecl) = DECL_SAVED_INSNS (olddecl))) - /* Previously saved insns go together with - the function's previous definition. */ - DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl); - /* Don't clear out the arguments if we're redefining a function. */ - if (DECL_ARGUMENTS (olddecl)) - DECL_ARGUMENTS (newdecl) = DECL_ARGUMENTS (olddecl); - } - if (DECL_LANG_SPECIFIC (olddecl)) - DECL_MAIN_VARIANT (newdecl) = DECL_MAIN_VARIANT (olddecl); - } - - if (TREE_CODE (newdecl) == NAMESPACE_DECL) - { - NAMESPACE_LEVEL (newdecl) = NAMESPACE_LEVEL (olddecl); - } - - /* Now preserve various other info from the definition. */ - TREE_ADDRESSABLE (newdecl) = TREE_ADDRESSABLE (olddecl); - TREE_ASM_WRITTEN (newdecl) = TREE_ASM_WRITTEN (olddecl); - DECL_COMMON (newdecl) = DECL_COMMON (olddecl); - DECL_ASSEMBLER_NAME (newdecl) = DECL_ASSEMBLER_NAME (olddecl); - - if (TREE_CODE (newdecl) == FUNCTION_DECL) - { - int function_size; - struct lang_decl *ol = DECL_LANG_SPECIFIC (olddecl); - struct lang_decl *nl = DECL_LANG_SPECIFIC (newdecl); - - function_size = sizeof (struct tree_decl); - - bcopy ((char *) newdecl + sizeof (struct tree_common), - (char *) olddecl + sizeof (struct tree_common), - function_size - sizeof (struct tree_common)); - - /* Can we safely free the storage used by newdecl? */ - -#define ROUND(x) ((x + obstack_alignment_mask (&permanent_obstack)) \ - & ~ obstack_alignment_mask (&permanent_obstack)) - - if (DECL_TEMPLATE_INSTANTIATION (newdecl)) - { - /* If newdecl is a template instantiation, it is possible that - the following sequence of events has occurred: - - o A friend function was declared in a class template. The - class template was instantiated. - - o The instantiation of the friend declaration was - recorded on the instantiation list, and is newdecl. - - o Later, however, instantiate_class_template called pushdecl - on the newdecl to perform name injection. But, pushdecl in - turn called duplicate_decls when it discovered that another - declaration of a global function with the same name already - existed. - - o Here, in duplicate_decls, we decided to clobber newdecl. - - If we're going to do that, we'd better make sure that - olddecl, and not newdecl, is on the list of - instantiations so that if we try to do the instantiation - again we won't get the clobbered declaration. */ - - tree tmpl = DECL_TI_TEMPLATE (newdecl); - tree decls = DECL_TEMPLATE_SPECIALIZATIONS (tmpl); - - for (; decls; decls = TREE_CHAIN (decls)) - if (TREE_VALUE (decls) == newdecl) - TREE_VALUE (decls) = olddecl; - } - - if (((char *)newdecl + ROUND (function_size) == (char *)nl - && ((char *)newdecl + ROUND (function_size) - + ROUND (sizeof (struct lang_decl)) - == obstack_next_free (&permanent_obstack))) - || ((char *)newdecl + ROUND (function_size) - == obstack_next_free (&permanent_obstack))) - { - DECL_MAIN_VARIANT (newdecl) = olddecl; - DECL_LANG_SPECIFIC (olddecl) = ol; - bcopy ((char *)nl, (char *)ol, sizeof (struct lang_decl)); - - obstack_free (&permanent_obstack, newdecl); - } - else if (LANG_DECL_PERMANENT (ol) && ol != nl) - { - if (DECL_MAIN_VARIANT (olddecl) == olddecl) - { - /* Save these lang_decls that would otherwise be lost. */ - extern tree free_lang_decl_chain; - tree free_lang_decl = (tree) ol; - - if (DECL_LANG_SPECIFIC (olddecl) == ol) - abort (); - - TREE_CHAIN (free_lang_decl) = free_lang_decl_chain; - free_lang_decl_chain = free_lang_decl; - } - else - { - /* Storage leak. */; - } - } - } - else - { - bcopy ((char *) newdecl + sizeof (struct tree_common), - (char *) olddecl + sizeof (struct tree_common), - sizeof (struct tree_decl) - sizeof (struct tree_common) - + tree_code_length [(int)TREE_CODE (newdecl)] * sizeof (char *)); - } - - DECL_UID (olddecl) = olddecl_uid; - if (olddecl_friend) - DECL_FRIEND_P (olddecl) = 1; - - /* NEWDECL contains the merged attribute lists. - Update OLDDECL to be the same. */ - DECL_MACHINE_ATTRIBUTES (olddecl) = DECL_MACHINE_ATTRIBUTES (newdecl); - - return 1; -} - -/* Record a decl-node X as belonging to the current lexical scope. - Check for errors (such as an incompatible declaration for the same - name already seen in the same scope). - - Returns either X or an old decl for the same name. - If an old decl is returned, it may have been smashed - to agree with what X says. */ - -tree -pushdecl (x) - tree x; -{ - register tree t; - register tree name = DECL_ASSEMBLER_NAME (x); - int need_new_binding = 1; - - if (DECL_TEMPLATE_PARM_P (x)) - /* Template parameters have no context; they are not X::T even - when declared within a class or namespace. */ - ; - else - { - if (current_function_decl && x != current_function_decl - /* A local declaration for a function doesn't constitute - nesting. */ - && (TREE_CODE (x) != FUNCTION_DECL || DECL_INITIAL (x)) - /* Don't change DECL_CONTEXT of virtual methods. */ - && (TREE_CODE (x) != FUNCTION_DECL || !DECL_VIRTUAL_P (x)) - && !DECL_CONTEXT (x)) - DECL_CONTEXT (x) = current_function_decl; - if (!DECL_CONTEXT (x)) - DECL_CONTEXT (x) = FROB_CONTEXT (current_namespace); - } - - /* Type are looked up using the DECL_NAME, as that is what the rest of the - compiler wants to use. */ - if (TREE_CODE (x) == TYPE_DECL || TREE_CODE (x) == VAR_DECL - || TREE_CODE (x) == NAMESPACE_DECL || TREE_CODE (x) == TEMPLATE_TYPE_PARM - || TREE_CODE (x) == TEMPLATE_TEMPLATE_PARM) - name = DECL_NAME (x); - - if (name) - { -#if 0 - /* Not needed...see below. */ - char *file; - int line; -#endif - if (TREE_CODE (name) == TEMPLATE_ID_EXPR) - name = TREE_OPERAND (name, 0); - - /* Namespace-scoped variables are not found in the current level. */ - if (TREE_CODE (x) == VAR_DECL && DECL_NAMESPACE_SCOPE_P (x)) - t = namespace_binding (name, DECL_CONTEXT (x)); - else - t = lookup_name_current_level (name); - if (t == error_mark_node) - { - /* error_mark_node is 0 for a while during initialization! */ - t = NULL_TREE; - cp_error_at ("`%#D' used prior to declaration", x); - } - - else if (t != NULL_TREE) - { -#if 0 - /* This is turned off until I have time to do it right (bpk). */ - /* With the code below that uses it... */ - file = DECL_SOURCE_FILE (t); - line = DECL_SOURCE_LINE (t); -#endif - if (TREE_CODE (t) == PARM_DECL) - { - if (DECL_CONTEXT (t) == NULL_TREE) - fatal ("parse errors have confused me too much"); - - /* Check for duplicate params. */ - if (duplicate_decls (x, t)) - return t; - } - else if (((TREE_CODE (x) == FUNCTION_DECL && DECL_LANGUAGE (x) == lang_c) - || DECL_FUNCTION_TEMPLATE_P (x)) - && is_overloaded_fn (t)) - /* Don't do anything just yet. */; - else if (t == wchar_decl_node) - { - if (pedantic && ! DECL_IN_SYSTEM_HEADER (x)) - cp_pedwarn ("redeclaration of wchar_t as `%T'", TREE_TYPE (x)); - - /* Throw away the redeclaration. */ - return t; - } - else if (TREE_CODE (t) != TREE_CODE (x)) - { - if (duplicate_decls (x, t)) - return t; - } - else if (duplicate_decls (x, t)) - { -#if 0 - /* This is turned off until I have time to do it right (bpk). */ - - /* Also warn if they did a prototype with `static' on it, but - then later left the `static' off. */ - if (! TREE_PUBLIC (name) && TREE_PUBLIC (x)) - { - if (DECL_LANG_SPECIFIC (t) && DECL_FRIEND_P (t)) - return t; - - if (extra_warnings) - { - cp_warning ("`static' missing from declaration of `%D'", - t); - warning_with_file_and_line (file, line, - "previous declaration of `%s'", - decl_as_string (t, 0)); - } - - /* Now fix things so it'll do what they expect. */ - if (current_function_decl) - TREE_PUBLIC (current_function_decl) = 0; - } - /* Due to interference in memory reclamation (X may be - obstack-deallocated at this point), we must guard against - one really special case. [jason: This should be handled - by start_function] */ - if (current_function_decl == x) - current_function_decl = t; -#endif - if (TREE_CODE (t) == TYPE_DECL) - SET_IDENTIFIER_TYPE_VALUE (name, TREE_TYPE (t)); - else if (TREE_CODE (t) == FUNCTION_DECL) - check_default_args (t); - - return t; - } - else if (DECL_MAIN_P (x)) - { - /* A redeclaration of main, but not a duplicate of the - previous one. - - [basic.start.main] - - This function shall not be overloaded. */ - cp_error_at ("invalid redeclaration of `%D'", t); - cp_error ("as `%D'", x); - /* We don't try to push this declaration since that - causes a crash. */ - return x; - } - } - - check_template_shadow (x); - - /* If this is a function conjured up by the backend, massage it - so it looks friendly. */ - if (TREE_CODE (x) == FUNCTION_DECL - && ! DECL_LANG_SPECIFIC (x)) - { - retrofit_lang_decl (x); - DECL_LANGUAGE (x) = lang_c; - } - - if (TREE_CODE (x) == FUNCTION_DECL && ! DECL_FUNCTION_MEMBER_P (x)) - { - t = push_overloaded_decl (x, PUSH_LOCAL); - if (t != x || DECL_LANGUAGE (x) == lang_c) - return t; - if (!namespace_bindings_p ()) - /* We do not need to create a binding for this name; - push_overloaded_decl will have already done so if - necessary. */ - need_new_binding = 0; - } - else if (DECL_FUNCTION_TEMPLATE_P (x) && DECL_NAMESPACE_SCOPE_P (x)) - return push_overloaded_decl (x, PUSH_GLOBAL); - - /* If declaring a type as a typedef, copy the type (unless we're - at line 0), and install this TYPE_DECL as the new type's typedef - name. See the extensive comment in ../c-decl.c (pushdecl). */ - if (TREE_CODE (x) == TYPE_DECL) - { - tree type = TREE_TYPE (x); - if (DECL_SOURCE_LINE (x) == 0) - { - if (TYPE_NAME (type) == 0) - TYPE_NAME (type) = x; - } - else if (type != error_mark_node && TYPE_NAME (type) != x - /* We don't want to copy the type when all we're - doing is making a TYPE_DECL for the purposes of - inlining. */ - && (!TYPE_NAME (type) - || TYPE_NAME (type) != DECL_ABSTRACT_ORIGIN (x))) - { - push_obstacks (TYPE_OBSTACK (type), TYPE_OBSTACK (type)); - - DECL_ORIGINAL_TYPE (x) = type; - type = build_type_copy (type); - TYPE_STUB_DECL (type) = TYPE_STUB_DECL (DECL_ORIGINAL_TYPE (x)); - TYPE_NAME (type) = x; - TREE_TYPE (x) = type; - - pop_obstacks (); - } - - if (type != error_mark_node - && TYPE_NAME (type) - && TYPE_IDENTIFIER (type)) - set_identifier_type_value_with_scope (DECL_NAME (x), type, - current_binding_level); - - } - - /* Multiple external decls of the same identifier ought to match. - - We get warnings about inline functions where they are defined. - We get warnings about other functions from push_overloaded_decl. - - Avoid duplicate warnings where they are used. */ - if (TREE_PUBLIC (x) && TREE_CODE (x) != FUNCTION_DECL) - { - tree decl; - - if (IDENTIFIER_NAMESPACE_VALUE (name) != NULL_TREE - && (DECL_EXTERNAL (IDENTIFIER_NAMESPACE_VALUE (name)) - || TREE_PUBLIC (IDENTIFIER_NAMESPACE_VALUE (name)))) - decl = IDENTIFIER_NAMESPACE_VALUE (name); - else - decl = NULL_TREE; - - if (decl - /* If different sort of thing, we already gave an error. */ - && TREE_CODE (decl) == TREE_CODE (x) - && !same_type_p (TREE_TYPE (x), TREE_TYPE (decl))) - { - cp_pedwarn ("type mismatch with previous external decl", x); - cp_pedwarn_at ("previous external decl of `%#D'", decl); - } - } - - /* This name is new in its binding level. - Install the new declaration and return it. */ - if (namespace_bindings_p ()) - { - /* Install a global value. */ - - /* If the first global decl has external linkage, - warn if we later see static one. */ - if (IDENTIFIER_GLOBAL_VALUE (name) == NULL_TREE && TREE_PUBLIC (x)) - TREE_PUBLIC (name) = 1; - - if (!(TREE_CODE (x) == TYPE_DECL && DECL_ARTIFICIAL (x) - && t != NULL_TREE)) - { - if (TREE_CODE (x) == FUNCTION_DECL) - my_friendly_assert - ((IDENTIFIER_GLOBAL_VALUE (name) == NULL_TREE) - || (IDENTIFIER_GLOBAL_VALUE (name) == x), 378); - SET_IDENTIFIER_NAMESPACE_VALUE (name, x); - } - - /* Don't forget if the function was used via an implicit decl. */ - if (IDENTIFIER_IMPLICIT_DECL (name) - && TREE_USED (IDENTIFIER_IMPLICIT_DECL (name))) - TREE_USED (x) = 1; - - /* Don't forget if its address was taken in that way. */ - if (IDENTIFIER_IMPLICIT_DECL (name) - && TREE_ADDRESSABLE (IDENTIFIER_IMPLICIT_DECL (name))) - TREE_ADDRESSABLE (x) = 1; - - /* Warn about mismatches against previous implicit decl. */ - if (IDENTIFIER_IMPLICIT_DECL (name) != NULL_TREE - /* If this real decl matches the implicit, don't complain. */ - && ! (TREE_CODE (x) == FUNCTION_DECL - && TREE_TYPE (TREE_TYPE (x)) == integer_type_node)) - cp_warning - ("`%D' was previously implicitly declared to return `int'", x); - - /* If new decl is `static' and an `extern' was seen previously, - warn about it. */ - if (x != NULL_TREE && t != NULL_TREE && decls_match (x, t)) - warn_extern_redeclared_static (x, t); - } - else - { - /* Here to install a non-global value. */ - tree oldlocal = IDENTIFIER_VALUE (name); - tree oldglobal = IDENTIFIER_NAMESPACE_VALUE (name); - - if (need_new_binding) - { - push_local_binding (name, x, 0); - /* Because push_local_binding will hook X on to the - current_binding_level's name list, we don't want to - do that again below. */ - need_new_binding = 0; - } - - /* If this is a TYPE_DECL, push it into the type value slot. */ - if (TREE_CODE (x) == TYPE_DECL) - set_identifier_type_value_with_scope (name, TREE_TYPE (x), - current_binding_level); - - /* Clear out any TYPE_DECL shadowed by a namespace so that - we won't think this is a type. The C struct hack doesn't - go through namespaces. */ - if (TREE_CODE (x) == NAMESPACE_DECL) - set_identifier_type_value_with_scope (name, NULL_TREE, - current_binding_level); - - /* If this is an extern function declaration, see if we - have a global definition or declaration for the function. */ - if (oldlocal == NULL_TREE - && DECL_EXTERNAL (x) - && oldglobal != NULL_TREE - && TREE_CODE (x) == FUNCTION_DECL - && TREE_CODE (oldglobal) == FUNCTION_DECL) - { - /* We have one. Their types must agree. */ - if (decls_match (x, oldglobal)) - /* OK */; - else - { - cp_warning ("extern declaration of `%#D' doesn't match", x); - cp_warning_at ("global declaration `%#D'", oldglobal); - } - } - /* If we have a local external declaration, - and no file-scope declaration has yet been seen, - then if we later have a file-scope decl it must not be static. */ - if (oldlocal == NULL_TREE - && oldglobal == NULL_TREE - && DECL_EXTERNAL (x) - && TREE_PUBLIC (x)) - TREE_PUBLIC (name) = 1; - - if (DECL_FROM_INLINE (x)) - /* Inline decls shadow nothing. */; - - /* Warn if shadowing an argument at the top level of the body. */ - else if (oldlocal != NULL_TREE && !DECL_EXTERNAL (x) - && TREE_CODE (oldlocal) == PARM_DECL - && TREE_CODE (x) != PARM_DECL) - { - /* Go to where the parms should be and see if we - find them there. */ - struct binding_level *b = current_binding_level->level_chain; - - if (cleanup_label) - b = b->level_chain; - - /* ARM $8.3 */ - if (b->parm_flag == 1) - cp_error ("declaration of `%#D' shadows a parameter", name); - } - else if (warn_shadow && oldlocal != NULL_TREE - && current_binding_level->is_for_scope - && !DECL_DEAD_FOR_LOCAL (oldlocal)) - { - warning ("variable `%s' shadows local", - IDENTIFIER_POINTER (name)); - cp_warning_at (" this is the shadowed declaration", oldlocal); - } - /* Maybe warn if shadowing something else. */ - else if (warn_shadow && !DECL_EXTERNAL (x) - /* No shadow warnings for internally generated vars. */ - && ! DECL_ARTIFICIAL (x) - /* No shadow warnings for vars made for inlining. */ - && ! DECL_FROM_INLINE (x)) - { - char *warnstring = NULL; - - if (oldlocal != NULL_TREE && TREE_CODE (oldlocal) == PARM_DECL) - warnstring = "declaration of `%s' shadows a parameter"; - else if (IDENTIFIER_CLASS_VALUE (name) != NULL_TREE - && current_class_ptr - && !TREE_STATIC (name)) - warnstring = "declaration of `%s' shadows a member of `this'"; - else if (oldlocal != NULL_TREE) - warnstring = "declaration of `%s' shadows previous local"; - else if (oldglobal != NULL_TREE) - /* XXX shadow warnings in outer-more namespaces */ - warnstring = "declaration of `%s' shadows global declaration"; - - if (warnstring) - warning (warnstring, IDENTIFIER_POINTER (name)); - } - } - - if (TREE_CODE (x) == FUNCTION_DECL) - check_default_args (x); - - /* Keep count of variables in this level with incomplete type. */ - if (TREE_CODE (x) == VAR_DECL - && TREE_TYPE (x) != error_mark_node - && ((TYPE_SIZE (TREE_TYPE (x)) == NULL_TREE - && PROMOTES_TO_AGGR_TYPE (TREE_TYPE (x), ARRAY_TYPE)) - /* RTTI TD entries are created while defining the type_info. */ - || (TYPE_LANG_SPECIFIC (TREE_TYPE (x)) - && TYPE_BEING_DEFINED (TREE_TYPE (x))))) - current_binding_level->incomplete - = tree_cons (NULL_TREE, x, current_binding_level->incomplete); - } - - if (need_new_binding) - { - /* Put decls on list in reverse order. - We will reverse them later if necessary. */ - TREE_CHAIN (x) = current_binding_level->names; - current_binding_level->names = x; - if (! (current_binding_level != global_binding_level - || TREE_PERMANENT (x))) - my_friendly_abort (124); - } - - return x; -} - -/* Same as pushdecl, but define X in binding-level LEVEL. We rely on the - caller to set DECL_CONTEXT properly. */ - -static tree -pushdecl_with_scope (x, level) - tree x; - struct binding_level *level; -{ - register struct binding_level *b; - tree function_decl = current_function_decl; - - current_function_decl = NULL_TREE; - if (level->parm_flag == 2) - { - b = class_binding_level; - class_binding_level = level; - pushdecl_class_level (x); - class_binding_level = b; - } - else - { - b = current_binding_level; - current_binding_level = level; - x = pushdecl (x); - current_binding_level = b; - } - current_function_decl = function_decl; - return x; -} - -/* Like pushdecl, only it places X in the current namespace, - if appropriate. */ - -tree -pushdecl_namespace_level (x) - tree x; -{ - register struct binding_level *b = inner_binding_level; - register tree t; - - t = pushdecl_with_scope (x, NAMESPACE_LEVEL (current_namespace)); - - /* Now, the type_shadowed stack may screw us. Munge it so it does - what we want. */ - if (TREE_CODE (x) == TYPE_DECL) - { - tree name = DECL_NAME (x); - tree newval; - tree *ptr = (tree *)0; - for (; b != global_binding_level; b = b->level_chain) - { - tree shadowed = b->type_shadowed; - for (; shadowed; shadowed = TREE_CHAIN (shadowed)) - if (TREE_PURPOSE (shadowed) == name) - { - ptr = &TREE_VALUE (shadowed); - /* Can't break out of the loop here because sometimes - a binding level will have duplicate bindings for - PT names. It's gross, but I haven't time to fix it. */ - } - } - newval = TREE_TYPE (x); - if (ptr == (tree *)0) - { - /* @@ This shouldn't be needed. My test case "zstring.cc" trips - up here if this is changed to an assertion. --KR */ - SET_IDENTIFIER_TYPE_VALUE (name, newval); - } - else - { - *ptr = newval; - } - } - return t; -} - -/* Like pushdecl, only it places X in GLOBAL_BINDING_LEVEL, - if appropriate. */ - -tree -pushdecl_top_level (x) - tree x; -{ - tree cur_namespace = current_namespace; - current_namespace = global_namespace; - x = pushdecl_namespace_level (x); - current_namespace = cur_namespace; - return x; -} - -/* Make the declaration of X appear in CLASS scope. */ - -void -pushdecl_class_level (x) - tree x; -{ - /* Don't use DECL_ASSEMBLER_NAME here! Everything that looks in class - scope looks for the pre-mangled name. */ - register tree name = DECL_NAME (x); - - if (name) - { - if (TYPE_BEING_DEFINED (current_class_type)) - { - /* A name N used in a class S shall refer to the same declaration - in its context and when re-evaluated in the completed scope of S. - Types, enums, and static vars are checked here; other - members are checked in finish_struct. */ - tree icv = IDENTIFIER_CLASS_VALUE (name); - - /* This should match check_member_decl_is_same_in_complete_scope. */ - if (icv && icv != x - && flag_optional_diags - /* Don't complain about inherited names. */ - && id_in_current_class (name) - /* Or shadowed tags. */ - && !(DECL_DECLARES_TYPE_P (icv) - && DECL_CONTEXT (icv) == current_class_type)) - { - cp_pedwarn ("declaration of identifier `%D' as `%#D'", name, x); - cp_pedwarn_at ("conflicts with previous use in class as `%#D'", - icv); - } - - check_template_shadow (x); - } - - push_class_level_binding (name, x); - if (TREE_CODE (x) == TYPE_DECL) - set_identifier_type_value (name, TREE_TYPE (x)); - } -} - -#if 0 -/* This function is used to push the mangled decls for nested types into - the appropriate scope. Previously pushdecl_top_level was used, but that - is incorrect for members of local classes. */ - -void -pushdecl_nonclass_level (x) - tree x; -{ - struct binding_level *b = current_binding_level; - - my_friendly_assert (b->parm_flag != 2, 180); - -#if 0 - /* Get out of template binding levels */ - while (b->pseudo_global) - b = b->level_chain; -#endif - - pushdecl_with_scope (x, b); -} -#endif - -/* Make the declaration(s) of X appear in CLASS scope - under the name NAME. */ - -void -push_class_level_binding (name, x) - tree name; - tree x; -{ - /* The class_binding_level will be NULL if x is a template - parameter name in a member template. */ - if (!class_binding_level) - return; - - /* If this declaration shadows a declaration from an enclosing - class, then we will need to restore IDENTIFIER_CLASS_VALUE when - we leave this class. Record the shadowed declaration here. */ - maybe_push_cache_obstack (); - class_binding_level->class_shadowed - = tree_cons (name, IDENTIFIER_CLASS_VALUE (name), - class_binding_level->class_shadowed); - TREE_TYPE (class_binding_level->class_shadowed) - = x; - pop_obstacks (); - - /* Put the binding on the stack of bindings for the identifier, and - update IDENTIFIER_CLASS_VALUE. */ - push_class_binding (name, x); - - obstack_ptr_grow (&decl_obstack, x); -} - -/* Insert another USING_DECL into the current binding level, - returning this declaration. If this is a redeclaration, - do nothing and return NULL_TREE. */ - -tree -push_using_decl (scope, name) - tree scope; - tree name; -{ - tree decl; - - my_friendly_assert (TREE_CODE (scope) == NAMESPACE_DECL, 383); - my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 384); - for (decl = current_binding_level->usings; decl; decl = TREE_CHAIN (decl)) - if (DECL_INITIAL (decl) == scope && DECL_NAME (decl) == name) - break; - if (decl) - return NULL_TREE; - decl = build_lang_decl (USING_DECL, name, void_type_node); - DECL_INITIAL (decl) = scope; - TREE_CHAIN (decl) = current_binding_level->usings; - current_binding_level->usings = decl; - return decl; -} - -/* Add namespace to using_directives. Return NULL_TREE if nothing was - changed (i.e. there was already a directive), or the fresh - TREE_LIST otherwise. */ - -tree -push_using_directive (used) - tree used; -{ - tree ud = current_binding_level->using_directives; - tree iter, ancestor; - - /* Check if we already have this. */ - if (purpose_member (used, ud) != NULL_TREE) - return NULL_TREE; - - /* Recursively add all namespaces used. */ - for (iter = DECL_NAMESPACE_USING (used); iter; iter = TREE_CHAIN (iter)) - push_using_directive (TREE_PURPOSE (iter)); - - ancestor = namespace_ancestor (current_decl_namespace (), used); - ud = current_binding_level->using_directives; - ud = perm_tree_cons (used, ancestor, ud); - current_binding_level->using_directives = ud; - return ud; -} - -/* DECL is a FUNCTION_DECL for a non-member function, which may have - other definitions already in place. We get around this by making - the value of the identifier point to a list of all the things that - want to be referenced by that name. It is then up to the users of - that name to decide what to do with that list. - - DECL may also be a TEMPLATE_DECL, with a FUNCTION_DECL in its DECL_RESULT - slot. It is dealt with the same way. - - FLAGS is a bitwise-or of the following values: - PUSH_LOCAL: Bind DECL in the current scope, rather than at - namespace scope. - PUSH_USING: DECL is being pushed as the result of a using - declaration. - - The value returned may be a previous declaration if we guessed wrong - about what language DECL should belong to (C or C++). Otherwise, - it's always DECL (and never something that's not a _DECL). */ - -tree -push_overloaded_decl (decl, flags) - tree decl; - int flags; -{ - tree name = DECL_NAME (decl); - tree old; - tree new_binding; - int doing_global = (namespace_bindings_p () || !(flags & PUSH_LOCAL)); - - if (doing_global) - { - old = namespace_binding (name, DECL_CONTEXT (decl)); - if (old && TREE_CODE (old) == FUNCTION_DECL - && DECL_ARTIFICIAL (old) - && (DECL_BUILT_IN (old) || DECL_BUILT_IN_NONANSI (old))) - { - if (duplicate_decls (decl, old)) - return old; - old = NULL_TREE; - } - } - else - old = lookup_name_current_level (name); - - if (old) - { - if (TREE_CODE (old) == TYPE_DECL && DECL_ARTIFICIAL (old)) - { - tree t = TREE_TYPE (old); - if (IS_AGGR_TYPE (t) && warn_shadow - && (! DECL_IN_SYSTEM_HEADER (decl) - || ! DECL_IN_SYSTEM_HEADER (old))) - cp_warning ("`%#D' hides constructor for `%#T'", decl, t); - old = NULL_TREE; - } - else if (is_overloaded_fn (old)) - { - tree tmp; - - for (tmp = old; tmp; tmp = OVL_NEXT (tmp)) - { - tree fn = OVL_CURRENT (tmp); - - if (TREE_CODE (tmp) == OVERLOAD && OVL_USED (tmp) - && !(flags & PUSH_USING) - && compparms (TYPE_ARG_TYPES (TREE_TYPE (fn)), - TYPE_ARG_TYPES (TREE_TYPE (decl)))) - cp_error ("`%#D' conflicts with previous using declaration `%#D'", - decl, fn); - - if (duplicate_decls (decl, fn)) - return fn; - } - } - else - { - cp_error_at ("previous non-function declaration `%#D'", old); - cp_error ("conflicts with function declaration `%#D'", decl); - return decl; - } - } - - if (old || TREE_CODE (decl) == TEMPLATE_DECL) - { - if (old && TREE_CODE (old) != OVERLOAD) - new_binding = ovl_cons (decl, ovl_cons (old, NULL_TREE)); - else - new_binding = ovl_cons (decl, old); - if (flags & PUSH_USING) - OVL_USED (new_binding) = 1; - } - else - /* NAME is not ambiguous. */ - new_binding = decl; - - if (doing_global) - set_namespace_binding (name, current_namespace, new_binding); - else - { - /* We only create an OVERLOAD if there was a previous binding at - this level. In that case, we need to remove the old binding - and replace it with the new binding. We must also run - through the NAMES on the binding level where the name was - bound to update the chain. */ - if (TREE_CODE (new_binding) == OVERLOAD) - { - tree *d; - - for (d = &BINDING_LEVEL (IDENTIFIER_BINDING (name))->names; - *d; - d = &TREE_CHAIN (*d)) - if (*d == old - || (TREE_CODE (*d) == TREE_LIST - && TREE_VALUE (*d) == old)) - { - if (TREE_CODE (*d) == TREE_LIST) - /* Just replace the old binding with the new. */ - TREE_VALUE (*d) = new_binding; - else - /* Build a TREE_LIST to wrap the OVERLOAD. */ - *d = build_tree_list (NULL_TREE, new_binding); - - /* And update the CPLUS_BINDING node. */ - BINDING_VALUE (IDENTIFIER_BINDING (name)) - = new_binding; - return decl; - } - - /* We should always find a previous binding in this case. */ - my_friendly_abort (0); - } - - /* Install the new binding. */ - push_local_binding (name, new_binding, flags); - } - - return decl; -} - -/* Generate an implicit declaration for identifier FUNCTIONID - as a function of type int (). Print a warning if appropriate. */ - -tree -implicitly_declare (functionid) - tree functionid; -{ - register tree decl; - int temp = allocation_temporary_p (); - - push_obstacks_nochange (); - - /* Save the decl permanently so we can warn if definition follows. - In ANSI C, warn_implicit is usually false, so the saves little space. - But in C++, it's usually true, hence the extra code. */ - if (temp && (! warn_implicit || toplevel_bindings_p ())) - end_temporary_allocation (); - - /* We used to reuse an old implicit decl here, - but this loses with inline functions because it can clobber - the saved decl chains. */ - decl = build_lang_decl (FUNCTION_DECL, functionid, default_function_type); - - DECL_EXTERNAL (decl) = 1; - TREE_PUBLIC (decl) = 1; - - /* ANSI standard says implicit declarations are in the innermost block. - So we record the decl in the standard fashion. */ - pushdecl (decl); - rest_of_decl_compilation (decl, NULL_PTR, 0, 0); - - if (warn_implicit - /* Only one warning per identifier. */ - && IDENTIFIER_IMPLICIT_DECL (functionid) == NULL_TREE) - { - cp_pedwarn ("implicit declaration of function `%#D'", decl); - } - - SET_IDENTIFIER_IMPLICIT_DECL (functionid, decl); - - pop_obstacks (); - - return decl; -} - -/* Return zero if the declaration NEWDECL is valid - when the declaration OLDDECL (assumed to be for the same name) - has already been seen. - Otherwise return an error message format string with a %s - where the identifier should go. */ - -static char * -redeclaration_error_message (newdecl, olddecl) - tree newdecl, olddecl; -{ - if (TREE_CODE (newdecl) == TYPE_DECL) - { - /* Because C++ can put things into name space for free, - constructs like "typedef struct foo { ... } foo" - would look like an erroneous redeclaration. */ - if (same_type_p (TREE_TYPE (newdecl), TREE_TYPE (olddecl))) - return 0; - else - return "redefinition of `%#D'"; - } - else if (TREE_CODE (newdecl) == FUNCTION_DECL) - { - /* If this is a pure function, its olddecl will actually be - the original initialization to `0' (which we force to call - abort()). Don't complain about redefinition in this case. */ - if (DECL_LANG_SPECIFIC (olddecl) && DECL_ABSTRACT_VIRTUAL_P (olddecl)) - return 0; - - /* If both functions come from different namespaces, this is not - a redeclaration - this is a conflict with a used function. */ - if (DECL_NAMESPACE_SCOPE_P (olddecl) - && DECL_CONTEXT (olddecl) != DECL_CONTEXT (newdecl)) - return "`%D' conflicts with used function"; - - /* We'll complain about linkage mismatches in - warn_extern_redeclared_static. */ - - /* Defining the same name twice is no good. */ - if (DECL_INITIAL (olddecl) != NULL_TREE - && DECL_INITIAL (newdecl) != NULL_TREE) - { - if (DECL_NAME (olddecl) == NULL_TREE) - return "`%#D' not declared in class"; - else - return "redefinition of `%#D'"; - } - return 0; - } - else if (TREE_CODE (newdecl) == TEMPLATE_DECL) - { - if ((TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) == FUNCTION_DECL - && DECL_INITIAL (DECL_TEMPLATE_RESULT (newdecl)) - && DECL_INITIAL (DECL_TEMPLATE_RESULT (olddecl))) - || (TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) == TYPE_DECL - && TYPE_SIZE (TREE_TYPE (newdecl)) - && TYPE_SIZE (TREE_TYPE (olddecl)))) - return "redefinition of `%#D'"; - return 0; - } - else if (toplevel_bindings_p ()) - { - /* Objects declared at top level: */ - /* If at least one is a reference, it's ok. */ - if (DECL_EXTERNAL (newdecl) || DECL_EXTERNAL (olddecl)) - return 0; - /* Reject two definitions. */ - return "redefinition of `%#D'"; - } - else - { - /* Objects declared with block scope: */ - /* Reject two definitions, and reject a definition - together with an external reference. */ - if (!(DECL_EXTERNAL (newdecl) && DECL_EXTERNAL (olddecl))) - return "redeclaration of `%#D'"; - return 0; - } -} - -/* Get the LABEL_DECL corresponding to identifier ID as a label. - Create one if none exists so far for the current function. - This function is called for both label definitions and label references. */ - -tree -lookup_label (id) - tree id; -{ - register tree decl = IDENTIFIER_LABEL_VALUE (id); - - if (current_function_decl == NULL_TREE) - { - error ("label `%s' referenced outside of any function", - IDENTIFIER_POINTER (id)); - return NULL_TREE; - } - - if ((decl == NULL_TREE - || DECL_SOURCE_LINE (decl) == 0) - && (named_label_uses == NULL - || named_label_uses->names_in_scope != current_binding_level->names - || named_label_uses->label_decl != decl)) - { - struct named_label_list *new_ent; - new_ent - = (struct named_label_list*)oballoc (sizeof (struct named_label_list)); - new_ent->label_decl = decl; - new_ent->names_in_scope = current_binding_level->names; - new_ent->binding_level = current_binding_level; - new_ent->lineno_o_goto = lineno; - new_ent->filename_o_goto = input_filename; - new_ent->next = named_label_uses; - named_label_uses = new_ent; - } - - /* Use a label already defined or ref'd with this name. */ - if (decl != NULL_TREE) - { - /* But not if it is inherited and wasn't declared to be inheritable. */ - if (DECL_CONTEXT (decl) != current_function_decl - && ! C_DECLARED_LABEL_FLAG (decl)) - return shadow_label (id); - return decl; - } - - decl = build_decl (LABEL_DECL, id, void_type_node); - - /* Make sure every label has an rtx. */ - label_rtx (decl); - - /* A label not explicitly declared must be local to where it's ref'd. */ - DECL_CONTEXT (decl) = current_function_decl; - - DECL_MODE (decl) = VOIDmode; - - /* Say where one reference is to the label, - for the sake of the error if it is not defined. */ - DECL_SOURCE_LINE (decl) = lineno; - DECL_SOURCE_FILE (decl) = input_filename; - - SET_IDENTIFIER_LABEL_VALUE (id, decl); - - named_labels = tree_cons (NULL_TREE, decl, named_labels); - named_label_uses->label_decl = decl; - - return decl; -} - -/* Make a label named NAME in the current function, - shadowing silently any that may be inherited from containing functions - or containing scopes. - - Note that valid use, if the label being shadowed - comes from another scope in the same function, - requires calling declare_nonlocal_label right away. */ - -tree -shadow_label (name) - tree name; -{ - register tree decl = IDENTIFIER_LABEL_VALUE (name); - - if (decl != NULL_TREE) - { - shadowed_labels = tree_cons (NULL_TREE, decl, shadowed_labels); - SET_IDENTIFIER_LABEL_VALUE (name, NULL_TREE); - } - - return lookup_label (name); -} - -/* Define a label, specifying the location in the source file. - Return the LABEL_DECL node for the label, if the definition is valid. - Otherwise return 0. */ - -tree -define_label (filename, line, name) - char *filename; - int line; - tree name; -{ - tree decl; - - if (minimal_parse_mode) - { - push_obstacks (&permanent_obstack, &permanent_obstack); - decl = build_decl (LABEL_DECL, name, void_type_node); - pop_obstacks (); - DECL_SOURCE_LINE (decl) = line; - DECL_SOURCE_FILE (decl) = filename; - add_tree (decl); - return decl; - } - - decl = lookup_label (name); - - /* After labels, make any new cleanups go into their - own new (temporary) binding contour. */ - current_binding_level->more_cleanups_ok = 0; - - /* If label with this name is known from an outer context, shadow it. */ - if (decl != NULL_TREE && DECL_CONTEXT (decl) != current_function_decl) - { - shadowed_labels = tree_cons (NULL_TREE, decl, shadowed_labels); - SET_IDENTIFIER_LABEL_VALUE (name, NULL_TREE); - decl = lookup_label (name); - } - - if (name == get_identifier ("wchar_t")) - cp_pedwarn ("label named wchar_t"); - - if (DECL_INITIAL (decl) != NULL_TREE) - { - cp_error ("duplicate label `%D'", decl); - return 0; - } - else - { - struct named_label_list *uses, *prev; - int identified = 0; - - /* Mark label as having been defined. */ - DECL_INITIAL (decl) = error_mark_node; - /* Say where in the source. */ - DECL_SOURCE_FILE (decl) = filename; - DECL_SOURCE_LINE (decl) = line; - - prev = NULL; - uses = named_label_uses; - while (uses != NULL) - if (uses->label_decl == decl) - { - struct binding_level *b = current_binding_level; - while (b) - { - tree new_decls = b->names; - tree old_decls = (b == uses->binding_level) - ? uses->names_in_scope : NULL_TREE; - while (new_decls != old_decls) - { - if (TREE_CODE (new_decls) == VAR_DECL - /* Don't complain about crossing initialization - of internal entities. They can't be accessed, - and they should be cleaned up - by the time we get to the label. */ - && ! DECL_ARTIFICIAL (new_decls) - && !(DECL_INITIAL (new_decls) == NULL_TREE - && pod_type_p (TREE_TYPE (new_decls)))) - { - if (! identified) - { - cp_error ("jump to label `%D'", decl); - error_with_file_and_line (uses->filename_o_goto, - uses->lineno_o_goto, - " from here"); - identified = 1; - } - if (DECL_INITIAL (new_decls) - || TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (new_decls))) - cp_error_at (" crosses initialization of `%#D'", - new_decls); - else - cp_error_at (" enters scope of non-POD `%#D'", - new_decls); - } - new_decls = TREE_CHAIN (new_decls); - } - if (b == uses->binding_level) - break; - b = b->level_chain; - } - - if (prev != NULL) - prev->next = uses->next; - else - named_label_uses = uses->next; - - uses = uses->next; - } - else - { - prev = uses; - uses = uses->next; - } - current_function_return_value = NULL_TREE; - return decl; - } -} - -struct cp_switch -{ - struct binding_level *level; - struct cp_switch *next; -}; - -static struct cp_switch *switch_stack; - -void -push_switch () -{ - struct cp_switch *p - = (struct cp_switch *) oballoc (sizeof (struct cp_switch)); - p->level = current_binding_level; - p->next = switch_stack; - switch_stack = p; -} - -void -pop_switch () -{ - switch_stack = switch_stack->next; -} - -/* Same, but for CASE labels. If DECL is NULL_TREE, it's the default. */ -/* XXX Note decl is never actually used. (bpk) */ - -void -define_case_label () -{ - tree cleanup = last_cleanup_this_contour (); - struct binding_level *b = current_binding_level; - int identified = 0; - - if (cleanup) - { - static int explained = 0; - cp_warning_at ("destructor needed for `%#D'", TREE_PURPOSE (cleanup)); - warning ("where case label appears here"); - if (!explained) - { - warning ("(enclose actions of previous case statements requiring"); - warning ("destructors in their own binding contours.)"); - explained = 1; - } - } - - for (; b && b != switch_stack->level; b = b->level_chain) - { - tree new_decls = b->names; - for (; new_decls; new_decls = TREE_CHAIN (new_decls)) - { - if (TREE_CODE (new_decls) == VAR_DECL - /* Don't complain about crossing initialization - of internal entities. They can't be accessed, - and they should be cleaned up - by the time we get to the label. */ - && ! DECL_ARTIFICIAL (new_decls) - && ((DECL_INITIAL (new_decls) != NULL_TREE - && DECL_INITIAL (new_decls) != error_mark_node) - || TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (new_decls)))) - { - if (! identified) - error ("jump to case label"); - identified = 1; - cp_error_at (" crosses initialization of `%#D'", - new_decls); - } - } - } - - /* After labels, make any new cleanups go into their - own new (temporary) binding contour. */ - - current_binding_level->more_cleanups_ok = 0; - current_function_return_value = NULL_TREE; -} - -/* Return the list of declarations of the current level. - Note that this list is in reverse order unless/until - you nreverse it; and when you do nreverse it, you must - store the result back using `storedecls' or you will lose. */ - -tree -getdecls () -{ - return current_binding_level->names; -} - -/* Return the list of type-tags (for structs, etc) of the current level. */ - -tree -gettags () -{ - return current_binding_level->tags; -} - -/* Store the list of declarations of the current level. - This is done for the parameter declarations of a function being defined, - after they are modified in the light of any missing parameters. */ - -static void -storedecls (decls) - tree decls; -{ - current_binding_level->names = decls; -} - -/* Similarly, store the list of tags of the current level. */ - -static void -storetags (tags) - tree tags; -{ - current_binding_level->tags = tags; -} - -/* Given NAME, an IDENTIFIER_NODE, - return the structure (or union or enum) definition for that name. - Searches binding levels from BINDING_LEVEL up to the global level. - If THISLEVEL_ONLY is nonzero, searches only the specified context - (but skips any tag-transparent contexts to find one that is - meaningful for tags). - FORM says which kind of type the caller wants; - it is RECORD_TYPE or UNION_TYPE or ENUMERAL_TYPE. - If the wrong kind of type is found, and it's not a template, an error is - reported. */ - -static tree -lookup_tag (form, name, binding_level, thislevel_only) - enum tree_code form; - tree name; - struct binding_level *binding_level; - int thislevel_only; -{ - register struct binding_level *level; - /* Non-zero if, we should look past a pseudo-global level, even if - THISLEVEL_ONLY. */ - int allow_pseudo_global = 1; - - for (level = binding_level; level; level = level->level_chain) - { - register tree tail; - if (ANON_AGGRNAME_P (name)) - for (tail = level->tags; tail; tail = TREE_CHAIN (tail)) - { - /* There's no need for error checking here, because - anon names are unique throughout the compilation. */ - if (TYPE_IDENTIFIER (TREE_VALUE (tail)) == name) - return TREE_VALUE (tail); - } - else if (level->namespace_p) - /* Do namespace lookup. */ - for (tail = current_namespace; 1; tail = CP_DECL_CONTEXT (tail)) - { - tree old = binding_for_name (name, tail); - - /* If we just skipped past a pseudo global level, even - though THISLEVEL_ONLY, and we find a template class - declaration, then we use the _TYPE node for the - template. See the example below. */ - if (thislevel_only && !allow_pseudo_global - && old && BINDING_VALUE (old) - && DECL_CLASS_TEMPLATE_P (BINDING_VALUE (old))) - old = TREE_TYPE (BINDING_VALUE (old)); - else - old = BINDING_TYPE (old); - - /* If it has an original type, it is a typedef, and we - should not return it. */ - if (old && DECL_ORIGINAL_TYPE (TYPE_NAME (old))) - old = NULL_TREE; - if (old && TREE_CODE (old) != form - && !(form != ENUMERAL_TYPE && TREE_CODE (old) == TEMPLATE_DECL)) - { - cp_error ("`%#D' redeclared as %C", old, form); - return NULL_TREE; - } - if (old) - return old; - if (thislevel_only || tail == global_namespace) - return NULL_TREE; - } - else - for (tail = level->tags; tail; tail = TREE_CHAIN (tail)) - { - if (TREE_PURPOSE (tail) == name) - { - enum tree_code code = TREE_CODE (TREE_VALUE (tail)); - /* Should tighten this up; it'll probably permit - UNION_TYPE and a struct template, for example. */ - if (code != form - && !(form != ENUMERAL_TYPE && code == TEMPLATE_DECL)) - { - /* Definition isn't the kind we were looking for. */ - cp_error ("`%#D' redeclared as %C", TREE_VALUE (tail), - form); - return NULL_TREE; - } - return TREE_VALUE (tail); - } - } - if (thislevel_only && ! level->tag_transparent) - { - if (level->pseudo_global && allow_pseudo_global) - { - /* We must deal with cases like this: - - template struct S; - template struct S {}; - - When looking up `S', for the second declaration, we - would like to find the first declaration. But, we - are in the pseudo-global level created for the - template parameters, rather than the (surrounding) - namespace level. Thus, we keep going one more level, - even though THISLEVEL_ONLY is non-zero. */ - allow_pseudo_global = 0; - continue; - } - else - return NULL_TREE; - } - if (current_class_type && level->level_chain->namespace_p) - { - /* Try looking in this class's tags before heading into - global binding level. */ - tree context = current_class_type; - while (context) - { - switch (TREE_CODE_CLASS (TREE_CODE (context))) - { - tree these_tags; - case 't': - these_tags = CLASSTYPE_TAGS (context); - if (ANON_AGGRNAME_P (name)) - while (these_tags) - { - if (TYPE_IDENTIFIER (TREE_VALUE (these_tags)) - == name) - return TREE_VALUE (tail); - these_tags = TREE_CHAIN (these_tags); - } - else - while (these_tags) - { - if (TREE_PURPOSE (these_tags) == name) - { - if (TREE_CODE (TREE_VALUE (these_tags)) != form) - { - cp_error ("`%#D' redeclared as %C in class scope", - TREE_VALUE (tail), form); - return NULL_TREE; - } - return TREE_VALUE (tail); - } - these_tags = TREE_CHAIN (these_tags); - } - /* If this type is not yet complete, then don't - look at its context. */ - if (TYPE_SIZE (context) == NULL_TREE) - goto no_context; - /* Go to next enclosing type, if any. */ - context = DECL_CONTEXT (TYPE_MAIN_DECL (context)); - break; - case 'd': - context = DECL_CONTEXT (context); - break; - default: - my_friendly_abort (10); - } - continue; - no_context: - break; - } - } - } - return NULL_TREE; -} - -#if 0 -void -set_current_level_tags_transparency (tags_transparent) - int tags_transparent; -{ - current_binding_level->tag_transparent = tags_transparent; -} -#endif - -/* Given a type, find the tag that was defined for it and return the tag name. - Otherwise return 0. However, the value can never be 0 - in the cases in which this is used. - - C++: If NAME is non-zero, this is the new name to install. This is - done when replacing anonymous tags with real tag names. */ - -static tree -lookup_tag_reverse (type, name) - tree type; - tree name; -{ - register struct binding_level *level; - - for (level = current_binding_level; level; level = level->level_chain) - { - register tree tail; - for (tail = level->tags; tail; tail = TREE_CHAIN (tail)) - { - if (TREE_VALUE (tail) == type) - { - if (name) - TREE_PURPOSE (tail) = name; - return TREE_PURPOSE (tail); - } - } - } - return NULL_TREE; -} - -/* Lookup TYPE in CONTEXT (a chain of nested types or a FUNCTION_DECL). - Return the type value, or NULL_TREE if not found. */ - -static tree -lookup_nested_type (type, context) - tree type; - tree context; -{ - if (context == NULL_TREE) - return NULL_TREE; - while (context) - { - switch (TREE_CODE (context)) - { - case TYPE_DECL: - { - tree ctype = TREE_TYPE (context); - tree match = value_member (type, CLASSTYPE_TAGS (ctype)); - if (match) - return TREE_VALUE (match); - context = DECL_CONTEXT (context); - - /* When we have a nested class whose member functions have - local types (e.g., a set of enums), we'll arrive here - with the DECL_CONTEXT as the actual RECORD_TYPE node for - the enclosing class. Instead, we want to make sure we - come back in here with the TYPE_DECL, not the RECORD_TYPE. */ - if (context && TREE_CODE (context) == RECORD_TYPE) - context = TREE_CHAIN (context); - } - break; - case FUNCTION_DECL: - if (TYPE_NAME (type) && TYPE_IDENTIFIER (type)) - return lookup_name (TYPE_IDENTIFIER (type), 1); - return NULL_TREE; - default: - my_friendly_abort (12); - } - } - return NULL_TREE; -} - -/* Look up NAME in the NAMESPACE. */ - -tree -lookup_namespace_name (namespace, name) - tree namespace, name; -{ - struct tree_binding _b; - tree val; - - my_friendly_assert (TREE_CODE (namespace) == NAMESPACE_DECL, 370); - - if (TREE_CODE (name) == NAMESPACE_DECL) - /* This happens for A::B when B is a namespace. */ - return name; - else if (TREE_CODE (name) == TEMPLATE_DECL) - { - /* This happens for A::B where B is a template, and there are no - template arguments. */ - cp_error ("invalid use of `%D'", name); - return error_mark_node; - } - - my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 373); - - val = binding_init (&_b); - if (!qualified_lookup_using_namespace (name, namespace, val, 0)) - return error_mark_node; - - if (BINDING_VALUE (val)) - { - val = BINDING_VALUE (val); - - /* If we have a single function from a using decl, pull it out. */ - if (TREE_CODE (val) == OVERLOAD && ! really_overloaded_fn (val)) - val = OVL_FUNCTION (val); - return val; - } - - cp_error ("`%D' undeclared in namespace `%D'", name, namespace); - return error_mark_node; -} - -/* Hash a TYPENAME_TYPE. K is really of type `tree'. */ - -static unsigned long -typename_hash (k) - hash_table_key k; -{ - unsigned long hash; - tree t; - - t = (tree) k; - hash = (((unsigned long) TYPE_CONTEXT (t)) - ^ ((unsigned long) DECL_NAME (TYPE_NAME (t)))); - - return hash; -} - -/* Compare two TYPENAME_TYPEs. K1 and K2 are really of type `tree'. */ - -static boolean -typename_compare (k1, k2) - hash_table_key k1; - hash_table_key k2; -{ - tree t1; - tree t2; - tree d1; - tree d2; - - t1 = (tree) k1; - t2 = (tree) k2; - d1 = TYPE_NAME (t1); - d2 = TYPE_NAME (t2); - - return (DECL_NAME (d1) == DECL_NAME (d2) - && same_type_p (TYPE_CONTEXT (t1), TYPE_CONTEXT (t2)) - && ((TREE_TYPE (t1) != NULL_TREE) - == (TREE_TYPE (t2) != NULL_TREE)) - && same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)) - && TYPENAME_TYPE_FULLNAME (t1) == TYPENAME_TYPE_FULLNAME (t2)); -} - -/* Build a TYPENAME_TYPE. If the type is `typename T::t', CONTEXT is - the type of `T', NAME is the IDENTIFIER_NODE for `t'. If BASE_TYPE - is non-NULL, this type is being created by the implicit typename - extension, and BASE_TYPE is a type named `t' in some base class of - `T' which depends on template parameters. - - Returns the new TYPENAME_TYPE. */ - -tree -build_typename_type (context, name, fullname, base_type) - tree context; - tree name; - tree fullname; - tree base_type; -{ - tree t; - tree d; - struct hash_entry* e; - - static struct hash_table ht; - - push_obstacks (&permanent_obstack, &permanent_obstack); - - if (!ht.table - && !hash_table_init (&ht, &hash_newfunc, &typename_hash, - &typename_compare)) - fatal ("virtual memory exhausted"); - - /* Build the TYPENAME_TYPE. */ - t = make_lang_type (TYPENAME_TYPE); - TYPE_CONTEXT (t) = FROB_CONTEXT (context); - TYPENAME_TYPE_FULLNAME (t) = fullname; - TREE_TYPE (t) = base_type; - - /* Build the corresponding TYPE_DECL. */ - d = build_decl (TYPE_DECL, name, t); - TYPE_NAME (TREE_TYPE (d)) = d; - TYPE_STUB_DECL (TREE_TYPE (d)) = d; - DECL_CONTEXT (d) = FROB_CONTEXT (context); - DECL_ARTIFICIAL (d) = 1; - - /* See if we already have this type. */ - e = hash_lookup (&ht, t, /*create=*/false, /*copy=*/0); - if (e) - { - /* This will free not only TREE_TYPE, but the lang-specific data - and the TYPE_DECL as well. */ - obstack_free (&permanent_obstack, t); - t = (tree) e->key; - } - else - /* Insert the type into the table. */ - hash_lookup (&ht, t, /*create=*/true, /*copy=*/0); - - pop_obstacks (); - - return t; -} - -tree -make_typename_type (context, name) - tree context, name; -{ - tree t; - tree fullname; - - if (TREE_CODE_CLASS (TREE_CODE (name)) == 't') - name = TYPE_IDENTIFIER (name); - else if (TREE_CODE (name) == TYPE_DECL) - name = DECL_NAME (name); - - fullname = name; - - if (TREE_CODE (name) == TEMPLATE_ID_EXPR) - { - name = TREE_OPERAND (name, 0); - if (TREE_CODE (name) == TEMPLATE_DECL) - name = TREE_OPERAND (fullname, 0) = DECL_NAME (name); - } - if (TREE_CODE (name) != IDENTIFIER_NODE) - my_friendly_abort (2000); - - if (TREE_CODE (context) == NAMESPACE_DECL) - { - /* We can get here from typename_sub0 in the explicit_template_type - expansion. Just fail. */ - cp_error ("no class template named `%#T' in `%#T'", - name, context); - return error_mark_node; - } - - if (! uses_template_parms (context) - || currently_open_class (context)) - { - if (TREE_CODE (fullname) == TEMPLATE_ID_EXPR) - { - if (IS_AGGR_TYPE (context)) - t = lookup_field (context, name, 0, 0); - else - t = NULL_TREE; - - if (t == NULL_TREE || TREE_CODE (t) != TEMPLATE_DECL - || TREE_CODE (DECL_RESULT (t)) != TYPE_DECL) - { - cp_error ("no class template named `%#T' in `%#T'", - name, context); - return error_mark_node; - } - - return lookup_template_class (t, TREE_OPERAND (fullname, 1), - NULL_TREE, context, - /*entering_scope=*/0); - } - else - { - if (IS_AGGR_TYPE (context)) - t = lookup_field (context, name, 0, 1); - else - t = NULL_TREE; - - if (t == NULL_TREE) - { - cp_error ("no type named `%#T' in `%#T'", name, context); - return error_mark_node; - } - - return TREE_TYPE (t); - } - } - - return build_typename_type (context, name, fullname, NULL_TREE); -} - -/* Select the right _DECL from multiple choices. */ - -static tree -select_decl (binding, flags) - tree binding; - int flags; -{ - tree val; - val = BINDING_VALUE (binding); - if (LOOKUP_NAMESPACES_ONLY (flags)) - { - /* We are not interested in types. */ - if (val && TREE_CODE (val) == NAMESPACE_DECL) - return val; - return NULL_TREE; - } - - /* If we could have a type and - we have nothing or we need a type and have none. */ - if (BINDING_TYPE (binding) - && (!val || ((flags & LOOKUP_PREFER_TYPES) - && TREE_CODE (val) != TYPE_DECL))) - val = TYPE_STUB_DECL (BINDING_TYPE (binding)); - /* Don't return non-types if we really prefer types. */ - else if (val && LOOKUP_TYPES_ONLY (flags) && TREE_CODE (val) != TYPE_DECL - && (!looking_for_template || TREE_CODE (val) != TEMPLATE_DECL)) - val = NULL_TREE; - - return val; -} - -/* Unscoped lookup of a global, iterate over namespaces, considering - using namespace statements. */ - -static tree -unqualified_namespace_lookup (name, flags) - tree name; - int flags; -{ - struct tree_binding _binding; - tree b = binding_init (&_binding); - tree initial = current_decl_namespace(); - tree scope = initial; - tree siter; - struct binding_level *level; - tree val = NULL_TREE; - - while (!val) - { - val = binding_for_name (name, scope); - - /* Initialize binding for this context. */ - BINDING_VALUE (b) = BINDING_VALUE (val); - BINDING_TYPE (b) = BINDING_TYPE (val); - - /* Add all _DECLs seen through local using-directives. */ - for (level = current_binding_level; - !level->namespace_p; - level = level->level_chain) - if (!lookup_using_namespace (name, b, level->using_directives, - scope, flags)) - /* Give up because of error. */ - return NULL_TREE; - - /* Add all _DECLs seen through global using-directives. */ - /* XXX local and global using lists should work equally. */ - siter = initial; - while (1) - { - if (!lookup_using_namespace (name, b, DECL_NAMESPACE_USING (siter), - scope, flags)) - /* Give up because of error. */ - return NULL_TREE; - if (siter == scope) break; - siter = CP_DECL_CONTEXT (siter); - } - - val = select_decl (b, flags); - if (scope == global_namespace) - break; - scope = CP_DECL_CONTEXT (scope); - } - return val; -} - -/* Combine prefer_type and namespaces_only into flags. */ - -static int -lookup_flags (prefer_type, namespaces_only) - int prefer_type, namespaces_only; -{ - if (namespaces_only) - return LOOKUP_PREFER_NAMESPACES; - if (prefer_type > 1) - return LOOKUP_PREFER_TYPES; - if (prefer_type > 0) - return LOOKUP_PREFER_BOTH; - return 0; -} - -/* Given a lookup that returned VAL, use FLAGS to decide if we want to - ignore it or not. Subroutine of lookup_name_real. */ - -static tree -qualify_lookup (val, flags) - tree val; - int flags; -{ - if (val == NULL_TREE) - return val; - if ((flags & LOOKUP_PREFER_NAMESPACES) && TREE_CODE (val) == NAMESPACE_DECL) - return val; - if ((flags & LOOKUP_PREFER_TYPES) - && (TREE_CODE (val) == TYPE_DECL - || ((flags & LOOKUP_TEMPLATES_EXPECTED) - && DECL_CLASS_TEMPLATE_P (val)))) - return val; - if (flags & (LOOKUP_PREFER_NAMESPACES | LOOKUP_PREFER_TYPES)) - return NULL_TREE; - return val; -} - -/* Look up NAME in the current binding level and its superiors in the - namespace of variables, functions and typedefs. Return a ..._DECL - node of some kind representing its definition if there is only one - such declaration, or return a TREE_LIST with all the overloaded - definitions if there are many, or return 0 if it is undefined. - - If PREFER_TYPE is > 0, we prefer TYPE_DECLs or namespaces. - If PREFER_TYPE is > 1, we reject non-type decls (e.g. namespaces). - If PREFER_TYPE is -2, we're being called from yylex(). (UGLY) - Otherwise we prefer non-TYPE_DECLs. - - If NONCLASS is non-zero, we don't look for the NAME in class scope, - using IDENTIFIER_CLASS_VALUE. */ - -static tree -lookup_name_real (name, prefer_type, nonclass, namespaces_only) - tree name; - int prefer_type, nonclass, namespaces_only; -{ - register tree val; - int yylex = 0; - tree from_obj = NULL_TREE; - int flags; - - /* Hack: copy flag set by parser, if set. */ - if (only_namespace_names) - namespaces_only = 1; - - if (prefer_type == -2) - { - extern int looking_for_typename; - tree type = NULL_TREE; - - yylex = 1; - prefer_type = looking_for_typename; - - flags = lookup_flags (prefer_type, namespaces_only); - /* During parsing, we need to complain. */ - flags |= LOOKUP_COMPLAIN; - /* If the next thing is '<', class templates are types. */ - if (looking_for_template) - flags |= LOOKUP_TEMPLATES_EXPECTED; - - /* std:: becomes :: for now. */ - if (got_scope == std_node) - got_scope = void_type_node; - - if (got_scope) - type = got_scope; - else if (got_object != error_mark_node) - type = got_object; - - if (type) - { - if (type == error_mark_node) - return error_mark_node; - if (TREE_CODE (type) == TYPENAME_TYPE && TREE_TYPE (type)) - type = TREE_TYPE (type); - - if (TYPE_P (type)) - type = complete_type (type); - - if (TREE_CODE (type) == VOID_TYPE) - type = global_namespace; - if (TREE_CODE (type) == NAMESPACE_DECL) - { - struct tree_binding b; - val = binding_init (&b); - if (!qualified_lookup_using_namespace (name, type, val, flags)) - return NULL_TREE; - val = select_decl (val, flags); - } - else if (! IS_AGGR_TYPE (type) - || TREE_CODE (type) == TEMPLATE_TYPE_PARM - || TREE_CODE (type) == TEMPLATE_TEMPLATE_PARM - || TREE_CODE (type) == TYPENAME_TYPE) - /* Someone else will give an error about this if needed. */ - val = NULL_TREE; - else if (TYPE_BEING_DEFINED (type)) - { - val = IDENTIFIER_CLASS_VALUE (name); - if (val && DECL_CONTEXT (val) != type) - { - struct binding_level *b = class_binding_level; - for (val = NULL_TREE; b; b = b->level_chain) - { - tree t = purpose_member (name, b->class_shadowed); - if (t && TREE_VALUE (t) - && DECL_CONTEXT (TREE_VALUE (t)) == type) - { - val = TREE_VALUE (t); - break; - } - } - } - if (val == NULL_TREE) - val = lookup_field (type, name, 0, 1); - } - else if (type == current_class_type) - val = IDENTIFIER_CLASS_VALUE (name); - else - val = lookup_member (type, name, 0, prefer_type); - } - else - val = NULL_TREE; - - if (got_scope) - goto done; - else if (got_object && val) - from_obj = val; - } - else - flags = lookup_flags (prefer_type, namespaces_only); - - /* First, look in non-namespace scopes. */ - for (val = IDENTIFIER_BINDING (name); val; val = TREE_CHAIN (val)) - { - if (!LOCAL_BINDING_P (val) && nonclass) - /* We're not looking for class-scoped bindings, so keep going. */ - continue; - - /* If this is the kind of thing we're looking for, we're done. */ - if (qualify_lookup (BINDING_VALUE (val), flags)) - { - val = BINDING_VALUE (val); - break; - } - else if ((flags & LOOKUP_PREFER_TYPES) - && qualify_lookup (BINDING_TYPE (val), flags)) - { - val = BINDING_TYPE (val); - break; - } - } - - /* If VAL is a type from a dependent base, we're not really supposed - to be able to see it; the fact that we can is the "implicit - typename" extension. We call lookup_field here to turn VAL into - a TYPE_DECL for a TYPENAME_TYPE. */ - if (processing_template_decl && val - && val == IDENTIFIER_CLASS_VALUE (name) - && TREE_CODE (val) == TYPE_DECL - && !currently_open_class (DECL_CONTEXT (val)) - && uses_template_parms (current_class_type)) - val = lookup_field (current_class_type, name, 0, 1); - - /* We don't put names from baseclasses onto the IDENTIFIER_BINDING - list when we're defining a type. It would probably be simpler to - do this, but we don't. So, we must lookup names from base - classes explicitly. */ - if (!val && !nonclass - && current_class_type && TYPE_BEING_DEFINED (current_class_type)) - { - val = qualify_lookup (lookup_field (current_class_type, name, 0, 0), - flags); - if (!val) - val = qualify_lookup (lookup_nested_field (name, !yylex), - flags); - } - - /* If we found a type from a dependent base class (using the - implicit typename extension) make sure that there's not some - global name which should be chosen instead. */ - if (val && TREE_CODE (val) == TYPE_DECL - && IMPLICIT_TYPENAME_P (TREE_TYPE (val))) - { - tree global_val; - - /* Any other name takes precedence over an implicit typename. Warn the - user about this potentially confusing lookup. */ - global_val = unqualified_namespace_lookup (name, flags); - - if (global_val) - { - tree subtype; - - /* Only warn when not lexing; we don't want to warn if they - use this name as a declarator. */ - subtype = TREE_TYPE (TREE_TYPE (val)); - if (! yylex - && ! (TREE_CODE (global_val) == TEMPLATE_DECL - && CLASSTYPE_TEMPLATE_INFO (subtype) - && CLASSTYPE_TI_TEMPLATE (subtype) == global_val) - && ! (TREE_CODE (global_val) == TYPE_DECL - && same_type_p (TREE_TYPE (global_val), subtype))) - { - cp_warning ("lookup of `%D' finds `%#D'", name, global_val); - cp_warning (" instead of `%D' from dependent base class", - val); - cp_warning (" (use `typename %T::%D' if that's what you meant)", - constructor_name (current_class_type), name); - } - - /* Use the global value instead of the implicit typename. */ - val = global_val; - } - } - else if (!val) - /* No local, or class-scoped binding. Look for a namespace-scope - declaration. */ - val = unqualified_namespace_lookup (name, flags); - - done: - if (val) - { - /* This should only warn about types used in qualified-ids. */ - if (from_obj && from_obj != val) - { - if (looking_for_typename && TREE_CODE (from_obj) == TYPE_DECL - && TREE_CODE (val) == TYPE_DECL - && TREE_TYPE (from_obj) != TREE_TYPE (val)) - { - cp_pedwarn ("lookup of `%D' in the scope of `%#T' (`%#T')", - name, got_object, TREE_TYPE (from_obj)); - cp_pedwarn (" does not match lookup in the current scope (`%#T')", - TREE_TYPE (val)); - } - - /* We don't change val to from_obj if got_object depends on - template parms because that breaks implicit typename for - destructor calls. */ - if (! uses_template_parms (got_object)) - val = from_obj; - } - - /* If we have a single function from a using decl, pull it out. */ - if (TREE_CODE (val) == OVERLOAD && ! really_overloaded_fn (val)) - val = OVL_FUNCTION (val); - } - else if (from_obj) - val = from_obj; - - return val; -} - -tree -lookup_name_nonclass (name) - tree name; -{ - return lookup_name_real (name, 0, 1, 0); -} - -tree -lookup_function_nonclass (name, args) - tree name; - tree args; -{ - return lookup_arg_dependent (name, lookup_name_nonclass (name), args); -} - -tree -lookup_name_namespace_only (name) - tree name; -{ - /* type-or-namespace, nonclass, namespace_only */ - return lookup_name_real (name, 1, 1, 1); -} - -tree -lookup_name (name, prefer_type) - tree name; - int prefer_type; -{ - return lookup_name_real (name, prefer_type, 0, 0); -} - -/* Similar to `lookup_name' but look only at current binding level. */ - -tree -lookup_name_current_level (name) - tree name; -{ - register tree t = NULL_TREE; - - if (current_binding_level->namespace_p) - { - t = IDENTIFIER_NAMESPACE_VALUE (name); - - /* extern "C" function() */ - if (t != NULL_TREE && TREE_CODE (t) == TREE_LIST) - t = TREE_VALUE (t); - } - else if (IDENTIFIER_BINDING (name) - && LOCAL_BINDING_P (IDENTIFIER_BINDING (name))) - { - struct binding_level *b = current_binding_level; - - while (1) - { - if (BINDING_LEVEL (IDENTIFIER_BINDING (name)) == b) - return IDENTIFIER_VALUE (name); - - if (b->keep == 2) - b = b->level_chain; - else - break; - } - } - - return t; -} - -/* Like lookup_name_current_level, but for types. */ - -tree -lookup_type_current_level (name) - tree name; -{ - register tree t = NULL_TREE; - - my_friendly_assert (! current_binding_level->namespace_p, 980716); - - if (REAL_IDENTIFIER_TYPE_VALUE (name) != NULL_TREE - && REAL_IDENTIFIER_TYPE_VALUE (name) != global_type_node) - { - struct binding_level *b = current_binding_level; - while (1) - { - if (purpose_member (name, b->type_shadowed)) - return REAL_IDENTIFIER_TYPE_VALUE (name); - if (b->keep == 2) - b = b->level_chain; - else - break; - } - } - - return t; -} - -void -begin_only_namespace_names () -{ - only_namespace_names = 1; -} - -void -end_only_namespace_names () -{ - only_namespace_names = 0; -} - -/* Arrange for the user to get a source line number, even when the - compiler is going down in flames, so that she at least has a - chance of working around problems in the compiler. We used to - call error(), but that let the segmentation fault continue - through; now, it's much more passive by asking them to send the - maintainers mail about the problem. */ - -static void -signal_catch (sig) - int sig ATTRIBUTE_UNUSED; -{ - signal (SIGSEGV, SIG_DFL); -#ifdef SIGIOT - signal (SIGIOT, SIG_DFL); -#endif -#ifdef SIGILL - signal (SIGILL, SIG_DFL); -#endif -#ifdef SIGABRT - signal (SIGABRT, SIG_DFL); -#endif -#ifdef SIGBUS - signal (SIGBUS, SIG_DFL); -#endif - my_friendly_abort (0); -} - -#if 0 -/* Unused -- brendan 970107 */ -/* Array for holding types considered "built-in". These types - are output in the module in which `main' is defined. */ -static tree *builtin_type_tdescs_arr; -static int builtin_type_tdescs_len, builtin_type_tdescs_max; -#endif - -/* Push the declarations of builtin types into the namespace. - RID_INDEX, if < RID_MAX is the index of the builtin type - in the array RID_POINTERS. NAME is the name used when looking - up the builtin type. TYPE is the _TYPE node for the builtin type. */ - -static void -record_builtin_type (rid_index, name, type) - enum rid rid_index; - char *name; - tree type; -{ - tree rname = NULL_TREE, tname = NULL_TREE; - tree tdecl = NULL_TREE; - - if ((int) rid_index < (int) RID_MAX) - rname = ridpointers[(int) rid_index]; - if (name) - tname = get_identifier (name); - - TYPE_BUILT_IN (type) = 1; - - if (tname) - { - tdecl = pushdecl (build_decl (TYPE_DECL, tname, type)); - set_identifier_type_value (tname, NULL_TREE); - if ((int) rid_index < (int) RID_MAX) - /* Built-in types live in the global namespace. */ - SET_IDENTIFIER_GLOBAL_VALUE (tname, tdecl); - } - if (rname != NULL_TREE) - { - if (tname != NULL_TREE) - { - set_identifier_type_value (rname, NULL_TREE); - SET_IDENTIFIER_GLOBAL_VALUE (rname, tdecl); - } - else - { - tdecl = pushdecl (build_decl (TYPE_DECL, rname, type)); - set_identifier_type_value (rname, NULL_TREE); - } - } -} - -/* Record one of the standard Java types. - * Declare it as having the given NAME. - * If SIZE > 0, it is the size of one of the integral types; - * otherwise it is the negative of the size of one of the other types. */ - -static tree -record_builtin_java_type (name, size) - char *name; - int size; -{ - tree type, decl; - if (size > 0) - type = make_signed_type (size); - else if (size > -32) - { /* "__java_char" or ""__java_boolean". */ - type = make_unsigned_type (-size); - /*if (size == -1) TREE_SET_CODE (type, BOOLEAN_TYPE);*/ - } - else - { /* "__java_float" or ""__java_double". */ - type = make_node (REAL_TYPE); - TYPE_PRECISION (type) = - size; - layout_type (type); - } - record_builtin_type (RID_MAX, name, type); - decl = TYPE_NAME (type); - DECL_IGNORED_P (decl) = 1; - TYPE_FOR_JAVA (type) = 1; - return type; -} - -/* Push a type into the namespace so that the back-ends ignore it. */ - -static void -record_unknown_type (type, name) - tree type; - char *name; -{ - tree decl = pushdecl (build_decl (TYPE_DECL, get_identifier (name), type)); - /* Make sure the "unknown type" typedecl gets ignored for debug info. */ - DECL_IGNORED_P (decl) = 1; - TYPE_DECL_SUPPRESS_DEBUG (decl) = 1; - TYPE_SIZE (type) = TYPE_SIZE (void_type_node); - TYPE_ALIGN (type) = 1; - TYPE_MODE (type) = TYPE_MODE (void_type_node); -} - -/* Push overloaded decl, in global scope, with one argument so it - can be used as a callback from define_function. */ - -static void -push_overloaded_decl_1 (x) - tree x; -{ - push_overloaded_decl (x, PUSH_GLOBAL); -} - -#ifdef __GNUC__ -__inline -#endif -tree -auto_function (name, type, code) - tree name, type; - enum built_in_function code; -{ - return define_function - (IDENTIFIER_POINTER (name), type, code, push_overloaded_decl_1, - IDENTIFIER_POINTER (build_decl_overload (name, TYPE_ARG_TYPES (type), - 0))); -} - -/* Create the predefined scalar types of C, - and some nodes representing standard constants (0, 1, (void *)0). - Initialize the global binding level. - Make definitions for built-in primitive functions. */ - -void -init_decl_processing () -{ - register tree endlink, int_endlink, double_endlink, unsigned_endlink; - tree fields[20]; - /* Data type of memcpy. */ - tree memcpy_ftype, strlen_ftype; - int wchar_type_size; - tree temp; - tree array_domain_type; - tree vb_off_identifier = NULL_TREE; - /* Function type `char *(char *, char *)' and similar ones */ - tree string_ftype_ptr_ptr, int_ftype_string_string; - tree sizetype_endlink; - tree ptr_ftype, ptr_ftype_unsigned, ptr_ftype_sizetype; - tree void_ftype, void_ftype_int, void_ftype_ptr; - - /* Have to make these distinct before we try using them. */ - lang_name_cplusplus = get_identifier ("C++"); - lang_name_c = get_identifier ("C"); - lang_name_java = get_identifier ("Java"); - - /* Enter the global namespace. */ - my_friendly_assert (global_namespace == NULL_TREE, 375); - my_friendly_assert (current_lang_name == NULL_TREE, 375); - current_lang_name = lang_name_cplusplus; - push_namespace (get_identifier ("::")); - global_namespace = current_namespace; - current_lang_name = NULL_TREE; - - if (flag_strict_prototype == 2) - flag_strict_prototype = pedantic; - if (! flag_permissive && ! pedantic) - flag_pedantic_errors = 1; - - strict_prototypes_lang_c = flag_strict_prototype; - - /* Initially, C. */ - current_lang_name = lang_name_c; - - current_function_decl = NULL_TREE; - named_labels = NULL_TREE; - named_label_uses = NULL; - current_binding_level = NULL_BINDING_LEVEL; - free_binding_level = NULL_BINDING_LEVEL; - - /* Because most segmentation signals can be traced back into user - code, catch them and at least give the user a chance of working - around compiler bugs. */ - signal (SIGSEGV, signal_catch); - - /* We will also catch aborts in the back-end through signal_catch and - give the user a chance to see where the error might be, and to defeat - aborts in the back-end when there have been errors previously in their - code. */ -#ifdef SIGIOT - signal (SIGIOT, signal_catch); -#endif -#ifdef SIGILL - signal (SIGILL, signal_catch); -#endif -#ifdef SIGABRT - signal (SIGABRT, signal_catch); -#endif -#ifdef SIGBUS - signal (SIGBUS, signal_catch); -#endif - - gcc_obstack_init (&decl_obstack); - - /* Must lay these out before anything else gets laid out. */ - error_mark_node = make_node (ERROR_MARK); - TREE_PERMANENT (error_mark_node) = 1; - TREE_TYPE (error_mark_node) = error_mark_node; - error_mark_list = build_tree_list (error_mark_node, error_mark_node); - TREE_TYPE (error_mark_list) = error_mark_node; - - /* Make the binding_level structure for global names. */ - pushlevel (0); - global_binding_level = current_binding_level; - /* The global level is the namespace level of ::. */ - NAMESPACE_LEVEL (global_namespace) = global_binding_level; - declare_namespace_level (); - - this_identifier = get_identifier (THIS_NAME); - in_charge_identifier = get_identifier (IN_CHARGE_NAME); - ctor_identifier = get_identifier (CTOR_NAME); - dtor_identifier = get_identifier (DTOR_NAME); - pfn_identifier = get_identifier (VTABLE_PFN_NAME); - index_identifier = get_identifier (VTABLE_INDEX_NAME); - delta_identifier = get_identifier (VTABLE_DELTA_NAME); - delta2_identifier = get_identifier (VTABLE_DELTA2_NAME); - pfn_or_delta2_identifier = get_identifier ("__pfn_or_delta2"); - if (flag_handle_signatures) - { - tag_identifier = get_identifier (SIGTABLE_TAG_NAME); - vb_off_identifier = get_identifier (SIGTABLE_VB_OFF_NAME); - vt_off_identifier = get_identifier (SIGTABLE_VT_OFF_NAME); - } - - /* Define `int' and `char' first so that dbx will output them first. */ - - integer_type_node = make_signed_type (INT_TYPE_SIZE); - record_builtin_type (RID_INT, NULL_PTR, integer_type_node); - - /* Define `char', which is like either `signed char' or `unsigned char' - but not the same as either. */ - - char_type_node - = (flag_signed_char - ? make_signed_type (CHAR_TYPE_SIZE) - : make_unsigned_type (CHAR_TYPE_SIZE)); - record_builtin_type (RID_CHAR, "char", char_type_node); - - long_integer_type_node = make_signed_type (LONG_TYPE_SIZE); - record_builtin_type (RID_LONG, "long int", long_integer_type_node); - - unsigned_type_node = make_unsigned_type (INT_TYPE_SIZE); - record_builtin_type (RID_UNSIGNED, "unsigned int", unsigned_type_node); - - long_unsigned_type_node = make_unsigned_type (LONG_TYPE_SIZE); - record_builtin_type (RID_MAX, "long unsigned int", long_unsigned_type_node); - record_builtin_type (RID_MAX, "unsigned long", long_unsigned_type_node); - - long_long_integer_type_node = make_signed_type (LONG_LONG_TYPE_SIZE); - record_builtin_type (RID_MAX, "long long int", long_long_integer_type_node); - - long_long_unsigned_type_node = make_unsigned_type (LONG_LONG_TYPE_SIZE); - record_builtin_type (RID_MAX, "long long unsigned int", - long_long_unsigned_type_node); - record_builtin_type (RID_MAX, "long long unsigned", - long_long_unsigned_type_node); - - short_integer_type_node = make_signed_type (SHORT_TYPE_SIZE); - record_builtin_type (RID_SHORT, "short int", short_integer_type_node); - short_unsigned_type_node = make_unsigned_type (SHORT_TYPE_SIZE); - record_builtin_type (RID_MAX, "short unsigned int", short_unsigned_type_node); - record_builtin_type (RID_MAX, "unsigned short", short_unsigned_type_node); - - /* `unsigned long' is the standard type for sizeof. - Note that stddef.h uses `unsigned long', - and this must agree, even if long and int are the same size. */ - set_sizetype - (TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (get_identifier (SIZE_TYPE)))); - - ptrdiff_type_node - = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (get_identifier (PTRDIFF_TYPE))); - - /* Define both `signed char' and `unsigned char'. */ - signed_char_type_node = make_signed_type (CHAR_TYPE_SIZE); - record_builtin_type (RID_MAX, "signed char", signed_char_type_node); - unsigned_char_type_node = make_unsigned_type (CHAR_TYPE_SIZE); - record_builtin_type (RID_MAX, "unsigned char", unsigned_char_type_node); - - /* These are types that type_for_size and type_for_mode use. */ - intQI_type_node = make_signed_type (GET_MODE_BITSIZE (QImode)); - pushdecl (build_decl (TYPE_DECL, NULL_TREE, intQI_type_node)); - intHI_type_node = make_signed_type (GET_MODE_BITSIZE (HImode)); - pushdecl (build_decl (TYPE_DECL, NULL_TREE, intHI_type_node)); - intSI_type_node = make_signed_type (GET_MODE_BITSIZE (SImode)); - pushdecl (build_decl (TYPE_DECL, NULL_TREE, intSI_type_node)); - intDI_type_node = make_signed_type (GET_MODE_BITSIZE (DImode)); - pushdecl (build_decl (TYPE_DECL, NULL_TREE, intDI_type_node)); -#if HOST_BITS_PER_WIDE_INT >= 64 - intTI_type_node = make_signed_type (GET_MODE_BITSIZE (TImode)); - pushdecl (build_decl (TYPE_DECL, get_identifier ("__int128_t"), intTI_type_node)); -#endif - unsigned_intQI_type_node = make_unsigned_type (GET_MODE_BITSIZE (QImode)); - pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intQI_type_node)); - unsigned_intHI_type_node = make_unsigned_type (GET_MODE_BITSIZE (HImode)); - pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intHI_type_node)); - unsigned_intSI_type_node = make_unsigned_type (GET_MODE_BITSIZE (SImode)); - pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intSI_type_node)); - unsigned_intDI_type_node = make_unsigned_type (GET_MODE_BITSIZE (DImode)); - pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intDI_type_node)); -#if HOST_BITS_PER_WIDE_INT >= 64 - unsigned_intTI_type_node = make_unsigned_type (GET_MODE_BITSIZE (TImode)); - pushdecl (build_decl (TYPE_DECL, get_identifier ("__uint128_t"), unsigned_intTI_type_node)); -#endif - - float_type_node = make_node (REAL_TYPE); - TYPE_PRECISION (float_type_node) = FLOAT_TYPE_SIZE; - record_builtin_type (RID_FLOAT, NULL_PTR, float_type_node); - layout_type (float_type_node); - - double_type_node = make_node (REAL_TYPE); - if (flag_short_double) - TYPE_PRECISION (double_type_node) = FLOAT_TYPE_SIZE; - else - TYPE_PRECISION (double_type_node) = DOUBLE_TYPE_SIZE; - record_builtin_type (RID_DOUBLE, NULL_PTR, double_type_node); - layout_type (double_type_node); - - long_double_type_node = make_node (REAL_TYPE); - TYPE_PRECISION (long_double_type_node) = LONG_DOUBLE_TYPE_SIZE; - record_builtin_type (RID_MAX, "long double", long_double_type_node); - layout_type (long_double_type_node); - - complex_integer_type_node = make_node (COMPLEX_TYPE); - pushdecl (build_decl (TYPE_DECL, get_identifier ("complex int"), - complex_integer_type_node)); - TREE_TYPE (complex_integer_type_node) = integer_type_node; - layout_type (complex_integer_type_node); - - complex_float_type_node = make_node (COMPLEX_TYPE); - pushdecl (build_decl (TYPE_DECL, get_identifier ("complex float"), - complex_float_type_node)); - TREE_TYPE (complex_float_type_node) = float_type_node; - layout_type (complex_float_type_node); - - complex_double_type_node = make_node (COMPLEX_TYPE); - pushdecl (build_decl (TYPE_DECL, get_identifier ("complex double"), - complex_double_type_node)); - TREE_TYPE (complex_double_type_node) = double_type_node; - layout_type (complex_double_type_node); - - complex_long_double_type_node = make_node (COMPLEX_TYPE); - pushdecl (build_decl (TYPE_DECL, get_identifier ("complex long double"), - complex_long_double_type_node)); - TREE_TYPE (complex_long_double_type_node) = long_double_type_node; - layout_type (complex_long_double_type_node); - - java_byte_type_node = record_builtin_java_type ("__java_byte", 8); - java_short_type_node = record_builtin_java_type ("__java_short", 16); - java_int_type_node = record_builtin_java_type ("__java_int", 32); - java_long_type_node = record_builtin_java_type ("__java_long", 64); - java_float_type_node = record_builtin_java_type ("__java_float", -32); - java_double_type_node = record_builtin_java_type ("__java_double", -64); - java_char_type_node = record_builtin_java_type ("__java_char", -16); - java_boolean_type_node = record_builtin_java_type ("__java_boolean", -1); - - integer_zero_node = build_int_2 (0, 0); - TREE_TYPE (integer_zero_node) = integer_type_node; - integer_one_node = build_int_2 (1, 0); - TREE_TYPE (integer_one_node) = integer_type_node; - integer_two_node = build_int_2 (2, 0); - TREE_TYPE (integer_two_node) = integer_type_node; - integer_three_node = build_int_2 (3, 0); - TREE_TYPE (integer_three_node) = integer_type_node; - - boolean_type_node = make_unsigned_type (BOOL_TYPE_SIZE); - TREE_SET_CODE (boolean_type_node, BOOLEAN_TYPE); - TYPE_MAX_VALUE (boolean_type_node) = build_int_2 (1, 0); - TREE_TYPE (TYPE_MAX_VALUE (boolean_type_node)) = boolean_type_node; - TYPE_PRECISION (boolean_type_node) = 1; - record_builtin_type (RID_BOOL, "bool", boolean_type_node); - boolean_false_node = build_int_2 (0, 0); - TREE_TYPE (boolean_false_node) = boolean_type_node; - boolean_true_node = build_int_2 (1, 0); - TREE_TYPE (boolean_true_node) = boolean_type_node; - - /* These are needed by stor-layout.c. */ - size_zero_node = size_int (0); - size_one_node = size_int (1); - - signed_size_zero_node = build_int_2 (0, 0); - TREE_TYPE (signed_size_zero_node) = make_signed_type (TYPE_PRECISION (sizetype)); - - void_type_node = make_node (VOID_TYPE); - record_builtin_type (RID_VOID, NULL_PTR, void_type_node); - layout_type (void_type_node); /* Uses integer_zero_node. */ - void_list_node = build_tree_list (NULL_TREE, void_type_node); - TREE_PARMLIST (void_list_node) = 1; - - null_pointer_node = build_int_2 (0, 0); - TREE_TYPE (null_pointer_node) = build_pointer_type (void_type_node); - layout_type (TREE_TYPE (null_pointer_node)); - - /* Used for expressions that do nothing, but are not errors. */ - void_zero_node = build_int_2 (0, 0); - TREE_TYPE (void_zero_node) = void_type_node; - - string_type_node = build_pointer_type (char_type_node); - const_string_type_node - = build_pointer_type (build_qualified_type (char_type_node, - TYPE_QUAL_CONST)); -#if 0 - record_builtin_type (RID_MAX, NULL_PTR, string_type_node); -#endif - - /* Make a type to be the domain of a few array types - whose domains don't really matter. - 200 is small enough that it always fits in size_t - and large enough that it can hold most function names for the - initializations of __FUNCTION__ and __PRETTY_FUNCTION__. */ - array_domain_type = build_index_type (build_int_2 (200, 0)); - - /* Make a type for arrays of characters. - With luck nothing will ever really depend on the length of this - array type. */ - char_array_type_node - = build_array_type (char_type_node, array_domain_type); - /* Likewise for arrays of ints. */ - int_array_type_node - = build_array_type (integer_type_node, array_domain_type); - - /* This is just some anonymous class type. Nobody should ever - need to look inside this envelope. */ - class_star_type_node = build_pointer_type (make_lang_type (RECORD_TYPE)); - - default_function_type - = build_function_type (integer_type_node, NULL_TREE); - - ptr_type_node = build_pointer_type (void_type_node); - const_ptr_type_node - = build_pointer_type (build_qualified_type (void_type_node, - TYPE_QUAL_CONST)); -#if 0 - record_builtin_type (RID_MAX, NULL_PTR, ptr_type_node); -#endif - 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); - sizetype_endlink = tree_cons (NULL_TREE, sizetype, endlink); - /* We realloc here because sizetype could be int or unsigned. S'ok. */ - ptr_ftype_sizetype = build_function_type (ptr_type_node, sizetype_endlink); - - 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)); - void_ftype_ptr - = build_exception_variant (void_ftype_ptr, - tree_cons (NULL_TREE, NULL_TREE, NULL_TREE)); - - 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)); - - 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)))); - - string_ftype_ptr_ptr /* strcpy prototype */ - = build_function_type (string_type_node, - tree_cons (NULL_TREE, string_type_node, - tree_cons (NULL_TREE, - const_string_type_node, - endlink))); - - int_ftype_string_string /* strcmp prototype */ - = build_function_type (integer_type_node, - tree_cons (NULL_TREE, const_string_type_node, - tree_cons (NULL_TREE, - const_string_type_node, - endlink))); - - strlen_ftype /* strlen prototype */ - = build_function_type (sizetype, - tree_cons (NULL_TREE, const_string_type_node, - endlink)); - - memcpy_ftype /* memcpy prototype */ - = build_function_type (ptr_type_node, - tree_cons (NULL_TREE, ptr_type_node, - tree_cons (NULL_TREE, const_ptr_type_node, - sizetype_endlink))); - - if (flag_huge_objects) - delta_type_node = long_integer_type_node; - else - delta_type_node = short_integer_type_node; - - builtin_function ("__builtin_constant_p", default_function_type, - BUILT_IN_CONSTANT_P, NULL_PTR); - - builtin_return_address_fndecl - = builtin_function ("__builtin_return_address", ptr_ftype_unsigned, - BUILT_IN_RETURN_ADDRESS, NULL_PTR); - - builtin_function ("__builtin_frame_address", ptr_ftype_unsigned, - BUILT_IN_FRAME_ADDRESS, NULL_PTR); - - builtin_function ("__builtin_alloca", ptr_ftype_sizetype, - BUILT_IN_ALLOCA, "alloca"); - builtin_function ("__builtin_ffs", int_ftype_int, BUILT_IN_FFS, NULL_PTR); - /* Define alloca, ffs as builtins. - Declare _exit just to mark it as volatile. */ - if (! flag_no_builtin && !flag_no_nonansi_builtin) - { - temp = builtin_function ("alloca", ptr_ftype_sizetype, - BUILT_IN_ALLOCA, NULL_PTR); - /* Suppress error if redefined as a non-function. */ - DECL_BUILT_IN_NONANSI (temp) = 1; - temp = builtin_function ("ffs", int_ftype_int, BUILT_IN_FFS, NULL_PTR); - /* Suppress error if redefined as a non-function. */ - DECL_BUILT_IN_NONANSI (temp) = 1; - temp = builtin_function ("_exit", void_ftype_int, - NOT_BUILT_IN, NULL_PTR); - TREE_THIS_VOLATILE (temp) = 1; - TREE_SIDE_EFFECTS (temp) = 1; - /* Suppress error if redefined as a non-function. */ - DECL_BUILT_IN_NONANSI (temp) = 1; - } - - builtin_function ("__builtin_abs", int_ftype_int, BUILT_IN_ABS, NULL_PTR); - builtin_function ("__builtin_fabsf", float_ftype_float, BUILT_IN_FABS, - NULL_PTR); - builtin_function ("__builtin_fabs", double_ftype_double, BUILT_IN_FABS, - NULL_PTR); - builtin_function ("__builtin_fabsl", ldouble_ftype_ldouble, BUILT_IN_FABS, - NULL_PTR); - builtin_function ("__builtin_labs", long_ftype_long, - BUILT_IN_LABS, NULL_PTR); - builtin_function ("__builtin_saveregs", ptr_ftype, - BUILT_IN_SAVEREGS, NULL_PTR); - builtin_function ("__builtin_classify_type", default_function_type, - BUILT_IN_CLASSIFY_TYPE, NULL_PTR); - builtin_function ("__builtin_next_arg", ptr_ftype, - BUILT_IN_NEXT_ARG, NULL_PTR); - builtin_function ("__builtin_args_info", int_ftype_int, - BUILT_IN_ARGS_INFO, NULL_PTR); - builtin_function ("__builtin_setjmp", - build_function_type (integer_type_node, - tree_cons (NULL_TREE, ptr_type_node, - endlink)), - BUILT_IN_SETJMP, NULL_PTR); - builtin_function ("__builtin_longjmp", - build_function_type (integer_type_node, - tree_cons (NULL_TREE, ptr_type_node, - tree_cons (NULL_TREE, - integer_type_node, - endlink))), - BUILT_IN_LONGJMP, NULL_PTR); - - /* Untyped call and return. */ - builtin_function ("__builtin_apply_args", ptr_ftype, - BUILT_IN_APPLY_ARGS, NULL_PTR); - - temp = tree_cons (NULL_TREE, - build_pointer_type (build_function_type (void_type_node, - NULL_TREE)), - tree_cons (NULL_TREE, ptr_ftype_sizetype, NULL_TREE)); - builtin_function ("__builtin_apply", - build_function_type (ptr_type_node, temp), - BUILT_IN_APPLY, NULL_PTR); - builtin_function ("__builtin_return", void_ftype_ptr, - BUILT_IN_RETURN, NULL_PTR); - - /* CYGNUS LOCAL -- branch prediction */ - builtin_function ("__builtin_expect", - build_function_type (integer_type_node, - tree_cons (NULL_TREE, integer_type_node, - int_endlink)), - BUILT_IN_EXPECT, NULL_PTR); - - /* END CYGNUS LOCAL -- branch prediction */ - - /* Currently under experimentation. */ - builtin_function ("__builtin_memcpy", memcpy_ftype, - BUILT_IN_MEMCPY, "memcpy"); - builtin_function ("__builtin_memcmp", int_ftype_cptr_cptr_sizet, - BUILT_IN_MEMCMP, "memcmp"); - builtin_function ("__builtin_strcmp", int_ftype_string_string, - BUILT_IN_STRCMP, "strcmp"); - builtin_function ("__builtin_strcpy", string_ftype_ptr_ptr, - BUILT_IN_STRCPY, "strcpy"); - builtin_function ("__builtin_strlen", strlen_ftype, - BUILT_IN_STRLEN, "strlen"); - builtin_function ("__builtin_sqrtf", float_ftype_float, - BUILT_IN_FSQRT, "sqrtf"); - builtin_function ("__builtin_fsqrt", double_ftype_double, - BUILT_IN_FSQRT, NULL_PTR); - builtin_function ("__builtin_sqrtl", ldouble_ftype_ldouble, - BUILT_IN_FSQRT, "sqrtl"); - builtin_function ("__builtin_sinf", float_ftype_float, - BUILT_IN_SIN, "sinf"); - builtin_function ("__builtin_sin", double_ftype_double, - BUILT_IN_SIN, "sin"); - builtin_function ("__builtin_sinl", ldouble_ftype_ldouble, - BUILT_IN_SIN, "sinl"); - builtin_function ("__builtin_cosf", float_ftype_float, - BUILT_IN_COS, "cosf"); - builtin_function ("__builtin_cos", double_ftype_double, - BUILT_IN_COS, "cos"); - builtin_function ("__builtin_cosl", ldouble_ftype_ldouble, - BUILT_IN_COS, "cosl"); - - if (!flag_no_builtin) - { - builtin_function ("abs", int_ftype_int, BUILT_IN_ABS, NULL_PTR); - builtin_function ("fabs", double_ftype_double, BUILT_IN_FABS, NULL_PTR); - builtin_function ("labs", long_ftype_long, BUILT_IN_LABS, NULL_PTR); - builtin_function ("fabsf", float_ftype_float, BUILT_IN_FABS, NULL_PTR); - builtin_function ("fabsl", ldouble_ftype_ldouble, BUILT_IN_FABS, - NULL_PTR); - builtin_function ("memcpy", memcpy_ftype, BUILT_IN_MEMCPY, NULL_PTR); - builtin_function ("memcmp", int_ftype_cptr_cptr_sizet, BUILT_IN_MEMCMP, - NULL_PTR); - builtin_function ("strcmp", int_ftype_string_string, BUILT_IN_STRCMP, - NULL_PTR); - builtin_function ("strcpy", string_ftype_ptr_ptr, BUILT_IN_STRCPY, - NULL_PTR); - builtin_function ("strlen", strlen_ftype, BUILT_IN_STRLEN, NULL_PTR); - builtin_function ("sqrtf", float_ftype_float, BUILT_IN_FSQRT, NULL_PTR); - builtin_function ("sqrt", double_ftype_double, BUILT_IN_FSQRT, NULL_PTR); - builtin_function ("sqrtl", ldouble_ftype_ldouble, BUILT_IN_FSQRT, - NULL_PTR); - builtin_function ("sinf", float_ftype_float, BUILT_IN_SIN, NULL_PTR); - builtin_function ("sin", double_ftype_double, BUILT_IN_SIN, NULL_PTR); - builtin_function ("sinl", ldouble_ftype_ldouble, BUILT_IN_SIN, NULL_PTR); - builtin_function ("cosf", float_ftype_float, BUILT_IN_COS, NULL_PTR); - builtin_function ("cos", double_ftype_double, BUILT_IN_COS, NULL_PTR); - builtin_function ("cosl", ldouble_ftype_ldouble, BUILT_IN_COS, NULL_PTR); - - /* Declare these functions volatile - to avoid spurious "control drops through" warnings. */ - temp = builtin_function ("abort", void_ftype, - NOT_BUILT_IN, NULL_PTR); - TREE_THIS_VOLATILE (temp) = 1; - TREE_SIDE_EFFECTS (temp) = 1; - /* Well, these are actually ANSI, but we can't set DECL_BUILT_IN on - them... */ - DECL_BUILT_IN_NONANSI (temp) = 1; - temp = builtin_function ("exit", void_ftype_int, - NOT_BUILT_IN, NULL_PTR); - TREE_THIS_VOLATILE (temp) = 1; - TREE_SIDE_EFFECTS (temp) = 1; - DECL_BUILT_IN_NONANSI (temp) = 1; - } - -#if 0 - /* Support for these has not been written in either expand_builtin - or build_function_call. */ - builtin_function ("__builtin_div", default_ftype, BUILT_IN_DIV, NULL_PTR); - builtin_function ("__builtin_ldiv", default_ftype, BUILT_IN_LDIV, NULL_PTR); - builtin_function ("__builtin_ffloor", double_ftype_double, BUILT_IN_FFLOOR, - NULL_PTR); - builtin_function ("__builtin_fceil", double_ftype_double, BUILT_IN_FCEIL, - NULL_PTR); - builtin_function ("__builtin_fmod", double_ftype_double_double, - BUILT_IN_FMOD, NULL_PTR); - builtin_function ("__builtin_frem", double_ftype_double_double, - BUILT_IN_FREM, NULL_PTR); - builtin_function ("__builtin_memset", ptr_ftype_ptr_int_int, - BUILT_IN_MEMSET, NULL_PTR); - builtin_function ("__builtin_getexp", double_ftype_double, BUILT_IN_GETEXP, - NULL_PTR); - builtin_function ("__builtin_getman", double_ftype_double, BUILT_IN_GETMAN, - NULL_PTR); -#endif - - /* C++ extensions */ - - unknown_type_node = make_node (UNKNOWN_TYPE); - record_unknown_type (unknown_type_node, "unknown type"); - - /* Indirecting an UNKNOWN_TYPE node yields an UNKNOWN_TYPE node. */ - TREE_TYPE (unknown_type_node) = unknown_type_node; - - TREE_TYPE (null_node) = type_for_size (POINTER_SIZE, 0); - - /* Looking up TYPE_POINTER_TO and TYPE_REFERENCE_TO yield the same - result. */ - TYPE_POINTER_TO (unknown_type_node) = unknown_type_node; - TYPE_REFERENCE_TO (unknown_type_node) = unknown_type_node; - - /* This is for handling opaque types in signatures. */ - opaque_type_node = copy_node (ptr_type_node); - TYPE_MAIN_VARIANT (opaque_type_node) = opaque_type_node; - record_builtin_type (RID_MAX, 0, opaque_type_node); - - /* This is special for C++ so functions can be overloaded. */ - wchar_type_node - = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (get_identifier (WCHAR_TYPE))); - wchar_type_size = TYPE_PRECISION (wchar_type_node); - signed_wchar_type_node = make_signed_type (wchar_type_size); - unsigned_wchar_type_node = make_unsigned_type (wchar_type_size); - wchar_type_node - = TREE_UNSIGNED (wchar_type_node) - ? unsigned_wchar_type_node - : signed_wchar_type_node; - record_builtin_type (RID_WCHAR, "__wchar_t", wchar_type_node); - - /* Artificial declaration of wchar_t -- can be bashed */ - wchar_decl_node = build_decl (TYPE_DECL, get_identifier ("wchar_t"), - wchar_type_node); - pushdecl (wchar_decl_node); - - /* This is for wide string constants. */ - wchar_array_type_node - = build_array_type (wchar_type_node, array_domain_type); - - if (flag_vtable_thunks) - { - /* Make sure we get a unique function type, so we can give - its pointer type a name. (This wins for gdb.) */ - tree vfunc_type = make_node (FUNCTION_TYPE); - TREE_TYPE (vfunc_type) = integer_type_node; - TYPE_ARG_TYPES (vfunc_type) = NULL_TREE; - layout_type (vfunc_type); - - vtable_entry_type = build_pointer_type (vfunc_type); - } - else - { - vtable_entry_type = make_lang_type (RECORD_TYPE); - fields[0] = build_lang_field_decl (FIELD_DECL, delta_identifier, - delta_type_node); - fields[1] = build_lang_field_decl (FIELD_DECL, index_identifier, - delta_type_node); - fields[2] = build_lang_field_decl (FIELD_DECL, pfn_identifier, - ptr_type_node); - finish_builtin_type (vtable_entry_type, VTBL_PTR_TYPE, fields, 2, - double_type_node); - - /* Make this part of an invisible union. */ - fields[3] = copy_node (fields[2]); - TREE_TYPE (fields[3]) = delta_type_node; - DECL_NAME (fields[3]) = delta2_identifier; - DECL_MODE (fields[3]) = TYPE_MODE (delta_type_node); - DECL_SIZE (fields[3]) = TYPE_SIZE (delta_type_node); - TREE_UNSIGNED (fields[3]) = 0; - TREE_CHAIN (fields[2]) = fields[3]; - vtable_entry_type = build_qualified_type (vtable_entry_type, - TYPE_QUAL_CONST); - } - record_builtin_type (RID_MAX, VTBL_PTR_TYPE, vtable_entry_type); - - vtbl_type_node - = build_cplus_array_type (vtable_entry_type, NULL_TREE); - layout_type (vtbl_type_node); - vtbl_type_node = build_qualified_type (vtbl_type_node, TYPE_QUAL_CONST); - record_builtin_type (RID_MAX, NULL_PTR, vtbl_type_node); - vtbl_ptr_type_node = build_pointer_type (vtable_entry_type); - layout_type (vtbl_ptr_type_node); - record_builtin_type (RID_MAX, NULL_PTR, vtbl_ptr_type_node); - - /* Simplify life by making a "sigtable_entry_type". Give its - fields names so that the debugger can use them. */ - - if (flag_handle_signatures) - { - sigtable_entry_type = make_lang_type (RECORD_TYPE); - fields[0] = build_lang_field_decl (FIELD_DECL, tag_identifier, - delta_type_node); - fields[1] = build_lang_field_decl (FIELD_DECL, vb_off_identifier, - delta_type_node); - fields[2] = build_lang_field_decl (FIELD_DECL, delta_identifier, - delta_type_node); - fields[3] = build_lang_field_decl (FIELD_DECL, index_identifier, - delta_type_node); - fields[4] = build_lang_field_decl (FIELD_DECL, pfn_identifier, - ptr_type_node); - - /* Set the alignment to the max of the alignment of ptr_type_node and - delta_type_node. Double alignment wastes a word on the Sparc. */ - finish_builtin_type (sigtable_entry_type, SIGTABLE_PTR_TYPE, fields, 4, - (TYPE_ALIGN (ptr_type_node) > TYPE_ALIGN (delta_type_node)) - ? ptr_type_node - : delta_type_node); - - /* Make this part of an invisible union. */ - fields[5] = copy_node (fields[4]); - TREE_TYPE (fields[5]) = delta_type_node; - DECL_NAME (fields[5]) = vt_off_identifier; - DECL_MODE (fields[5]) = TYPE_MODE (delta_type_node); - DECL_SIZE (fields[5]) = TYPE_SIZE (delta_type_node); - TREE_UNSIGNED (fields[5]) = 0; - TREE_CHAIN (fields[4]) = fields[5]; - - sigtable_entry_type = build_qualified_type (sigtable_entry_type, - TYPE_QUAL_CONST); - record_builtin_type (RID_MAX, SIGTABLE_PTR_TYPE, sigtable_entry_type); - } - - std_node = build_decl (NAMESPACE_DECL, - get_identifier (flag_honor_std ? "fake std":"std"), - void_type_node); - pushdecl (std_node); - - global_type_node = make_node (LANG_TYPE); - record_unknown_type (global_type_node, "global type"); - - /* Now, C++. */ - current_lang_name = lang_name_cplusplus; - - { - tree bad_alloc_type_node, newtype, deltype; - if (flag_honor_std) - push_namespace (get_identifier ("std")); - bad_alloc_type_node = xref_tag - (class_type_node, get_identifier ("bad_alloc"), 1); - if (flag_honor_std) - pop_namespace (); - newtype = build_exception_variant - (ptr_ftype_sizetype, build_tree_list (NULL_TREE, bad_alloc_type_node)); - deltype = build_exception_variant - (void_ftype_ptr, build_tree_list (NULL_TREE, NULL_TREE)); - auto_function (ansi_opname[(int) NEW_EXPR], newtype, NOT_BUILT_IN); - auto_function (ansi_opname[(int) VEC_NEW_EXPR], newtype, NOT_BUILT_IN); - global_delete_fndecl - = auto_function (ansi_opname[(int) DELETE_EXPR], deltype, NOT_BUILT_IN); - auto_function (ansi_opname[(int) VEC_DELETE_EXPR], deltype, NOT_BUILT_IN); - } - - abort_fndecl - = define_function ("__pure_virtual", void_ftype, - NOT_BUILT_IN, 0, 0); - - /* Perform other language dependent initializations. */ - init_class_processing (); - init_init_processing (); - init_search_processing (); - if (flag_rtti) - init_rtti_processing (); - - if (flag_exceptions) - init_exception_processing (); - if (flag_no_inline) - { - flag_inline_functions = 0; - } - - if (! supports_one_only ()) - flag_weak = 0; - - /* Create the global bindings for __FUNCTION__ and __PRETTY_FUNCTION__. */ - declare_function_name (); - - /* Prepare to check format strings against argument lists. */ - init_function_format_info (); - - /* Show we use EH for cleanups. */ - using_eh_for_cleanups (); - - print_error_function = lang_print_error_function; - lang_get_alias_set = &c_get_alias_set; - - /* Maintain consistency. Perhaps we should just complain if they - say -fwritable-strings? */ - if (flag_writable_strings) - flag_const_strings = 0; -} - -/* Function to print any language-specific context for an error message. */ - -static void -lang_print_error_function (file) - char *file; -{ - default_print_error_function (file); - maybe_print_template_context (); -} - -/* Make a definition for a builtin function named NAME and whose data type - is TYPE. TYPE should be a function type with argument types. - FUNCTION_CODE tells later passes how to compile calls to this function. - See tree.h for its possible values. - - If LIBRARY_NAME is nonzero, use that for DECL_ASSEMBLER_NAME, - the name to be called if we can't opencode the function. */ - -tree -define_function (name, type, function_code, pfn, library_name) - char *name; - tree type; - enum built_in_function function_code; - void (*pfn) PROTO((tree)); - char *library_name; -{ - tree decl = build_lang_decl (FUNCTION_DECL, get_identifier (name), type); - DECL_EXTERNAL (decl) = 1; - TREE_PUBLIC (decl) = 1; - DECL_ARTIFICIAL (decl) = 1; - - my_friendly_assert (DECL_CONTEXT (decl) == NULL_TREE, 392); - DECL_CONTEXT (decl) = FROB_CONTEXT (current_namespace); - - /* Since `pushdecl' relies on DECL_ASSEMBLER_NAME instead of DECL_NAME, - we cannot change DECL_ASSEMBLER_NAME until we have installed this - function in the namespace. */ - if (pfn) (*pfn) (decl); - if (library_name) - DECL_ASSEMBLER_NAME (decl) = get_identifier (library_name); - make_function_rtl (decl); - if (function_code != NOT_BUILT_IN) - { - DECL_BUILT_IN (decl) = 1; - DECL_FUNCTION_CODE (decl) = function_code; - } - return decl; -} - -/* When we call finish_struct for an anonymous union, we create - default copy constructors and such. But, an anonymous union - shouldn't have such things; this function undoes the damage to the - anonymous union type T. - - (The reason that we create the synthesized methods is that we don't - distinguish `union { int i; }' from `typedef union { int i; } U'. - The first is an anonymous union; the second is just an ordinary - union type.) */ - -void -fixup_anonymous_union (t) - tree t; -{ - tree *q; - - /* Wipe out memory of synthesized methods */ - TYPE_HAS_CONSTRUCTOR (t) = 0; - TYPE_HAS_DEFAULT_CONSTRUCTOR (t) = 0; - TYPE_HAS_INIT_REF (t) = 0; - TYPE_HAS_CONST_INIT_REF (t) = 0; - TYPE_HAS_ASSIGN_REF (t) = 0; - TYPE_HAS_ASSIGNMENT (t) = 0; - TYPE_HAS_CONST_ASSIGN_REF (t) = 0; - - /* Splice the implicitly generated functions out of the TYPE_METHODS - list. */ - q = &TYPE_METHODS (t); - while (*q) - { - if (DECL_ARTIFICIAL (*q)) - *q = TREE_CHAIN (*q); - else - q = &TREE_CHAIN (*q); - } - - /* ANSI C++ June 5 1992 WP 9.5.3. Anonymous unions may not have - function members. */ - if (TYPE_METHODS (t)) - error ("an anonymous union cannot have function members"); -} - -/* Make sure that a declaration with no declarator is well-formed, i.e. - just defines a tagged type or anonymous union. - - Returns the type defined, if any. */ - -tree -check_tag_decl (declspecs) - tree declspecs; -{ - int found_type = 0; - tree ob_modifier = NULL_TREE; - register tree link; - register tree t = NULL_TREE; - - for (link = declspecs; link; link = TREE_CHAIN (link)) - { - register tree value = TREE_VALUE (link); - - if (TYPE_P (value)) - { - ++found_type; - - if (IS_AGGR_TYPE (value) || TREE_CODE (value) == ENUMERAL_TYPE) - { - my_friendly_assert (TYPE_MAIN_DECL (value) != NULL_TREE, 261); - t = value; - } - } - else if (value == ridpointers[(int) RID_FRIEND]) - { - if (current_class_type == NULL_TREE - || current_scope () != current_class_type) - ob_modifier = value; - } - else if (value == ridpointers[(int) RID_STATIC] - || value == ridpointers[(int) RID_EXTERN] - || value == ridpointers[(int) RID_AUTO] - || value == ridpointers[(int) RID_REGISTER] - || value == ridpointers[(int) RID_INLINE] - || value == ridpointers[(int) RID_VIRTUAL] - || value == ridpointers[(int) RID_CONST] - || value == ridpointers[(int) RID_VOLATILE] - || value == ridpointers[(int) RID_EXPLICIT]) - ob_modifier = value; - } - - if (found_type > 1) - error ("multiple types in one declaration"); - - /* Inside a class, we might be in a friend or access declaration. - Until we have a good way of detecting the latter, don't warn. */ - if (t == NULL_TREE && ! current_class_type) - pedwarn ("declaration does not declare anything"); - else if (t && ANON_UNION_TYPE_P (t)) - /* Anonymous unions are objects, so they can have specifiers. */; - else if (ob_modifier) - { - if (ob_modifier == ridpointers[(int) RID_INLINE] - || ob_modifier == ridpointers[(int) RID_VIRTUAL]) - cp_error ("`%D' can only be specified for functions", ob_modifier); - else if (ob_modifier == ridpointers[(int) RID_FRIEND]) - cp_error ("`%D' can only be specified inside a class", ob_modifier); - else if (ob_modifier == ridpointers[(int) RID_EXPLICIT]) - cp_error ("`%D' can only be specified for constructors", - ob_modifier); - else - cp_error ("`%D' can only be specified for objects and functions", - ob_modifier); - } - - return t; -} - -/* Called when a declaration is seen that contains no names to declare. - If its type is a reference to a structure, union or enum inherited - from a containing scope, shadow that tag name for the current scope - with a forward reference. - If its type defines a new named structure or union - or defines an enum, it is valid but we need not do anything here. - Otherwise, it is an error. - - C++: may have to grok the declspecs to learn about static, - complain for anonymous unions. */ - -void -shadow_tag (declspecs) - tree declspecs; -{ - tree t = check_tag_decl (declspecs); - - if (t) - maybe_process_partial_specialization (t); - - /* This is where the variables in an anonymous union are - declared. An anonymous union declaration looks like: - union { ... } ; - because there is no declarator after the union, the parser - sends that declaration here. */ - if (t && ANON_UNION_TYPE_P (t)) - { - fixup_anonymous_union (t); - - if (TYPE_FIELDS (t)) - { - tree decl = grokdeclarator (NULL_TREE, declspecs, NORMAL, 0, - NULL_TREE); - finish_anon_union (decl); - } - } -} - -/* Decode a "typename", such as "int **", returning a ..._TYPE node. */ - -tree -groktypename (typename) - tree typename; -{ - if (TREE_CODE (typename) != TREE_LIST) - return typename; - return grokdeclarator (TREE_VALUE (typename), - TREE_PURPOSE (typename), - TYPENAME, 0, NULL_TREE); -} - -/* Decode a declarator in an ordinary declaration or data definition. - This is called as soon as the type information and variable name - have been parsed, before parsing the initializer if any. - Here we create the ..._DECL node, fill in its type, - and put it on the list of decls for the current context. - The ..._DECL node is returned as the value. - - Exception: for arrays where the length is not specified, - the type is left null, to be filled in by `cp_finish_decl'. - - Function definitions do not come here; they go to start_function - instead. However, external and forward declarations of functions - do go through here. Structure field declarations are done by - grokfield and not through here. */ - -/* Set this to zero to debug not using the temporary obstack - to parse initializers. */ -int debug_temp_inits = 1; - -tree -start_decl (declarator, declspecs, initialized, attributes, prefix_attributes) - tree declarator, declspecs; - int initialized; - tree attributes, prefix_attributes; -{ - register tree decl; - register tree type, tem; - tree context; - extern int have_extern_spec; - extern int used_extern_spec; - tree attrlist; - -#if 0 - /* See code below that used this. */ - int init_written = initialized; -#endif - - /* This should only be done once on the top most decl. */ - if (have_extern_spec && !used_extern_spec) - { - declspecs = decl_tree_cons (NULL_TREE, get_identifier ("extern"), - declspecs); - used_extern_spec = 1; - } - - if (attributes || prefix_attributes) - attrlist = build_scratch_list (attributes, prefix_attributes); - else - attrlist = NULL_TREE; - - decl = grokdeclarator (declarator, declspecs, NORMAL, initialized, - attrlist); - - if (decl == NULL_TREE || TREE_CODE (decl) == VOID_TYPE) - return NULL_TREE; - - type = TREE_TYPE (decl); - - /* Don't lose if destructors must be executed at file-level. */ - if (! processing_template_decl && TREE_STATIC (decl) - && TYPE_NEEDS_DESTRUCTOR (complete_type (type)) - && !TREE_PERMANENT (decl)) - { - push_obstacks (&permanent_obstack, &permanent_obstack); - decl = copy_node (decl); - if (TREE_CODE (type) == ARRAY_TYPE) - { - tree itype = TYPE_DOMAIN (type); - if (itype && ! TREE_PERMANENT (itype)) - { - itype = build_index_type (copy_to_permanent (TYPE_MAX_VALUE (itype))); - type = build_cplus_array_type (TREE_TYPE (type), itype); - TREE_TYPE (decl) = type; - } - } - pop_obstacks (); - } - - context - = (TREE_CODE (decl) == FUNCTION_DECL && DECL_VIRTUAL_P (decl)) - ? DECL_CLASS_CONTEXT (decl) - : DECL_CONTEXT (decl); - - if (initialized && context && TREE_CODE (context) == NAMESPACE_DECL - && context != current_namespace && TREE_CODE (decl) == VAR_DECL) - { - /* When parsing the initializer, lookup should use the object's - namespace. */ - push_decl_namespace (context); - } - - /* We are only interested in class contexts, later. */ - if (context && TREE_CODE (context) == NAMESPACE_DECL) - context = NULL_TREE; - - if (initialized) - /* Is it valid for this decl to have an initializer at all? - If not, set INITIALIZED to zero, which will indirectly - tell `cp_finish_decl' to ignore the initializer once it is parsed. */ - switch (TREE_CODE (decl)) - { - case TYPE_DECL: - /* typedef foo = bar means give foo the same type as bar. - We haven't parsed bar yet, so `cp_finish_decl' will fix that up. - Any other case of an initialization in a TYPE_DECL is an error. */ - if (pedantic || list_length (declspecs) > 1) - { - cp_error ("typedef `%D' is initialized", decl); - initialized = 0; - } - break; - - case FUNCTION_DECL: - cp_error ("function `%#D' is initialized like a variable", decl); - initialized = 0; - break; - - default: - if (! processing_template_decl) - { - if (type != error_mark_node) - { - if (TYPE_SIZE (type) != NULL_TREE - && ! TREE_CONSTANT (TYPE_SIZE (type))) - { - cp_error - ("variable-sized object `%D' may not be initialized", - decl); - initialized = 0; - } - - if (TREE_CODE (type) == ARRAY_TYPE - && TYPE_SIZE (complete_type (TREE_TYPE (type))) == NULL_TREE) - { - cp_error - ("elements of array `%#D' have incomplete type", decl); - initialized = 0; - } - } - } - } - - if (initialized) - { - if (! toplevel_bindings_p () - && DECL_EXTERNAL (decl)) - cp_warning ("declaration of `%#D' has `extern' and is initialized", - decl); - DECL_EXTERNAL (decl) = 0; - if (toplevel_bindings_p ()) - TREE_STATIC (decl) = 1; - - /* Tell `pushdecl' this is an initialized decl - even though we don't yet have the initializer expression. - Also tell `cp_finish_decl' it may store the real initializer. */ - DECL_INITIAL (decl) = error_mark_node; - } - - if (context && TYPE_SIZE (complete_type (context)) != NULL_TREE) - { - pushclass (context, 2); - - if (TREE_CODE (decl) == VAR_DECL) - { - tree field = lookup_field (context, DECL_NAME (decl), 0, 0); - if (field == NULL_TREE || TREE_CODE (field) != VAR_DECL) - cp_error ("`%#D' is not a static member of `%#T'", decl, context); - else - { - if (DECL_CONTEXT (field) != context) - { - cp_pedwarn ("ANSI C++ does not permit `%T::%D' to be defined as `%T::%D'", - DECL_CONTEXT (field), DECL_NAME (decl), - context, DECL_NAME (decl)); - DECL_CONTEXT (decl) = DECL_CONTEXT (field); - } - /* Static data member are tricky; an in-class initialization - still doesn't provide a definition, so the in-class - declaration will have DECL_EXTERNAL set, but will have an - initialization. Thus, duplicate_decls won't warn - about this situation, and so we check here. */ - if (DECL_INITIAL (decl) && DECL_INITIAL (field)) - cp_error ("duplicate initialization of %D", decl); - if (duplicate_decls (decl, field)) - decl = field; - } - } - else - { - tree field = check_classfn (context, decl); - if (field && duplicate_decls (decl, field)) - decl = field; - } - - /* cp_finish_decl sets DECL_EXTERNAL if DECL_IN_AGGR_P is set. */ - DECL_IN_AGGR_P (decl) = 0; - if ((DECL_LANG_SPECIFIC (decl) && DECL_USE_TEMPLATE (decl)) - || CLASSTYPE_USE_TEMPLATE (context)) - { - SET_DECL_TEMPLATE_SPECIALIZATION (decl); - /* [temp.expl.spec] An explicit specialization of a static data - member of a template is a definition if the declaration - includes an initializer; otherwise, it is a declaration. - - We check for processing_specialization so this only applies - to the new specialization syntax. */ - if (DECL_INITIAL (decl) == NULL_TREE && processing_specialization) - DECL_EXTERNAL (decl) = 1; - } - - if (DECL_EXTERNAL (decl) && ! DECL_TEMPLATE_SPECIALIZATION (decl)) - cp_pedwarn ("declaration of `%#D' outside of class is not definition", - decl); - } - -#ifdef SET_DEFAULT_DECL_ATTRIBUTES - SET_DEFAULT_DECL_ATTRIBUTES (decl, attributes); -#endif - - /* Set attributes here so if duplicate decl, will have proper attributes. */ - cplus_decl_attributes (decl, attributes, prefix_attributes); - - /* Add this decl to the current binding level, but not if it - comes from another scope, e.g. a static member variable. - TEM may equal DECL or it may be a previous decl of the same name. */ - - if ((TREE_CODE (decl) != PARM_DECL && DECL_CONTEXT (decl) != NULL_TREE - /* Definitions of namespace members outside their namespace are - possible. */ - && TREE_CODE (DECL_CONTEXT (decl)) != NAMESPACE_DECL) - || (TREE_CODE (decl) == TEMPLATE_DECL && !namespace_bindings_p ()) - || TREE_CODE (type) == LANG_TYPE - /* The declaration of template specializations does not affect - the functions available for overload resolution, so we do not - call pushdecl. */ - || (TREE_CODE (decl) == FUNCTION_DECL - && DECL_TEMPLATE_SPECIALIZATION (decl))) - tem = decl; - else - tem = pushdecl (decl); - - if (processing_template_decl) - { - if (! current_function_decl) - tem = push_template_decl (tem); - else if (minimal_parse_mode) - DECL_VINDEX (tem) - = build_min_nt (DECL_STMT, copy_to_permanent (declarator), - copy_to_permanent (declspecs), - NULL_TREE); - } - - -#if ! defined (ASM_OUTPUT_BSS) && ! defined (ASM_OUTPUT_ALIGNED_BSS) - /* Tell the back-end to use or not use .common as appropriate. If we say - -fconserve-space, we want this to save .data space, at the expense of - wrong semantics. If we say -fno-conserve-space, we want this to - produce errors about redefs; to do this we force variables into the - data segment. */ - DECL_COMMON (tem) = flag_conserve_space || ! TREE_PUBLIC (tem); -#endif - - if (! processing_template_decl) - start_decl_1 (tem); - - /* Corresponding pop_obstacks is done in `cp_finish_decl'. */ - push_obstacks_nochange (); - -#if 0 - /* We have no way of knowing whether the initializer will need to be - evaluated at run-time or not until we've parsed it, so let's just put - it in the permanent obstack. (jason) */ - if (init_written - && ! (TREE_CODE (tem) == PARM_DECL - || (TREE_READONLY (tem) - && (TREE_CODE (tem) == VAR_DECL - || TREE_CODE (tem) == FIELD_DECL)))) - { - /* When parsing and digesting the initializer, - use temporary storage. Do this even if we will ignore the value. */ - if (toplevel_bindings_p () && debug_temp_inits) - { - if (processing_template_decl - || TYPE_NEEDS_CONSTRUCTING (type) - || TREE_CODE (type) == REFERENCE_TYPE) - /* In this case, the initializer must lay down in permanent - storage, since it will be saved until `finish_file' is run. */ - ; - else - temporary_allocation (); - } - } -#endif - - return tem; -} - -void -start_decl_1 (decl) - tree decl; -{ - tree type = TREE_TYPE (decl); - int initialized = (DECL_INITIAL (decl) != NULL_TREE); - - /* If this type of object needs a cleanup, and control may - jump past it, make a new binding level so that it is cleaned - up only when it is initialized first. */ - if (TYPE_NEEDS_DESTRUCTOR (type) - && current_binding_level->more_cleanups_ok == 0) - pushlevel_temporary (1); - - if (initialized) - /* Is it valid for this decl to have an initializer at all? - If not, set INITIALIZED to zero, which will indirectly - tell `cp_finish_decl' to ignore the initializer once it is parsed. */ - { - /* Don't allow initializations for incomplete types except for - arrays which might be completed by the initialization. */ - if (type == error_mark_node) - ; /* Don't complain again. */ - else if (TYPE_SIZE (complete_type (type)) != NULL_TREE) - ; /* A complete type is ok. */ - else if (TREE_CODE (type) != ARRAY_TYPE) - { - cp_error ("variable `%#D' has initializer but incomplete type", - decl); - initialized = 0; - type = TREE_TYPE (decl) = error_mark_node; - } - else if (TYPE_SIZE (complete_type (TREE_TYPE (type))) == NULL_TREE) - { - if (DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl)) - cp_error ("elements of array `%#D' have incomplete type", decl); - /* else we already gave an error in start_decl. */ - initialized = 0; - } - } - - if (!initialized - && TREE_CODE (decl) != TYPE_DECL - && TREE_CODE (decl) != TEMPLATE_DECL - && IS_AGGR_TYPE (type) && ! DECL_EXTERNAL (decl)) - { - if ((! processing_template_decl || ! uses_template_parms (type)) - && TYPE_SIZE (complete_type (type)) == NULL_TREE) - { - cp_error ("aggregate `%#D' has incomplete type and cannot be initialized", - decl); - /* Change the type so that assemble_variable will give - DECL an rtl we can live with: (mem (const_int 0)). */ - type = TREE_TYPE (decl) = error_mark_node; - } - else - { - /* If any base type in the hierarchy of TYPE needs a constructor, - then we set initialized to 1. This way any nodes which are - created for the purposes of initializing this aggregate - will live as long as it does. This is necessary for global - aggregates which do not have their initializers processed until - the end of the file. */ - initialized = TYPE_NEEDS_CONSTRUCTING (type); - } - } - -#if 0 - /* We don't do this yet for GNU C++. */ - /* For a local variable, define the RTL now. */ - if (! toplevel_bindings_p () - /* But not if this is a duplicate decl - and we preserved the rtl from the previous one - (which may or may not happen). */ - && DECL_RTL (tem) == NULL_RTX) - { - if (TYPE_SIZE (TREE_TYPE (tem)) != NULL_TREE) - expand_decl (tem); - else if (TREE_CODE (TREE_TYPE (tem)) == ARRAY_TYPE - && DECL_INITIAL (tem) != NULL_TREE) - expand_decl (tem); - } -#endif - - if (! initialized) - DECL_INITIAL (decl) = NULL_TREE; -} - -/* Handle initialization of references. - These three arguments are from `cp_finish_decl', and have the - same meaning here that they do there. - - Quotes on semantics can be found in ARM 8.4.3. */ - -static void -grok_reference_init (decl, type, init) - tree decl, type, init; -{ - tree tmp; - - if (init == NULL_TREE) - { - if ((DECL_LANG_SPECIFIC (decl) == 0 - || DECL_IN_AGGR_P (decl) == 0) - && ! DECL_THIS_EXTERN (decl)) - { - cp_error ("`%D' declared as reference but not initialized", decl); - if (TREE_CODE (decl) == VAR_DECL) - SET_DECL_REFERENCE_SLOT (decl, error_mark_node); - } - return; - } - - if (init == error_mark_node) - return; - - if (TREE_CODE (type) == REFERENCE_TYPE - && TREE_CODE (init) == CONSTRUCTOR) - { - cp_error ("ANSI C++ forbids use of initializer list to initialize reference `%D'", decl); - return; - } - - if (TREE_CODE (init) == TREE_LIST) - init = build_compound_expr (init); - - if (TREE_CODE (TREE_TYPE (init)) == REFERENCE_TYPE) - init = convert_from_reference (init); - - if (TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE - && TREE_CODE (TREE_TYPE (init)) == ARRAY_TYPE) - { - /* Note: default conversion is only called in very special cases. */ - init = default_conversion (init); - } - - tmp = convert_to_reference - (type, init, CONV_IMPLICIT, - LOOKUP_SPECULATIVELY|LOOKUP_NORMAL|DIRECT_BIND, decl); - - if (tmp == error_mark_node) - goto fail; - else if (tmp != NULL_TREE) - { - init = tmp; - DECL_INITIAL (decl) = save_expr (init); - } - else - { - cp_error ("cannot initialize `%T' from `%T'", type, TREE_TYPE (init)); - goto fail; - } - - /* ?? Can this be optimized in some cases to - hand back the DECL_INITIAL slot?? */ - if (TYPE_SIZE (TREE_TYPE (type))) - { - init = convert_from_reference (decl); - if (TREE_PERMANENT (decl)) - init = copy_to_permanent (init); - SET_DECL_REFERENCE_SLOT (decl, init); - } - - if (TREE_STATIC (decl) && ! TREE_CONSTANT (DECL_INITIAL (decl))) - { - expand_static_init (decl, DECL_INITIAL (decl)); - DECL_INITIAL (decl) = NULL_TREE; - } - return; - - fail: - if (TREE_CODE (decl) == VAR_DECL) - SET_DECL_REFERENCE_SLOT (decl, error_mark_node); - return; -} - -/* Fill in DECL_INITIAL with some magical value to prevent expand_decl from - mucking with forces it does not comprehend (i.e. initialization with a - constructor). If we are at global scope and won't go into COMMON, fill - it in with a dummy CONSTRUCTOR to force the variable into .data; - otherwise we can use error_mark_node. */ - -static tree -obscure_complex_init (decl, init) - tree decl, init; -{ - if (! flag_no_inline && TREE_STATIC (decl)) - { - if (extract_init (decl, init)) - return NULL_TREE; - } - -#if ! defined (ASM_OUTPUT_BSS) && ! defined (ASM_OUTPUT_ALIGNED_BSS) - if (toplevel_bindings_p () && ! DECL_COMMON (decl)) - DECL_INITIAL (decl) = build (CONSTRUCTOR, TREE_TYPE (decl), NULL_TREE, - NULL_TREE); - else -#endif - DECL_INITIAL (decl) = error_mark_node; - - return init; -} - -/* Issue an error message if DECL is an uninitialized const variable. */ - -static void -check_for_uninitialized_const_var (decl) - tree decl; -{ - tree type = TREE_TYPE (decl); - - /* ``Unless explicitly declared extern, a const object does not have - external linkage and must be initialized. ($8.4; $12.1)'' ARM - 7.1.6 */ - if (TREE_CODE (decl) == VAR_DECL - && TREE_CODE (type) != REFERENCE_TYPE - && CP_TYPE_CONST_P (type) - && !TYPE_NEEDS_CONSTRUCTING (type) - && !DECL_INITIAL (decl)) - cp_error ("uninitialized const `%D'", decl); -} - -/* Finish processing of a declaration; - install its line number and initial value. - If the length of an array type is not known before, - it must be determined now, from the initial value, or it is an error. - - Call `pop_obstacks' iff NEED_POP is nonzero. - - For C++, `cp_finish_decl' must be fairly evasive: it must keep initializers - for aggregates that have constructors alive on the permanent obstack, - so that the global initializing functions can be written at the end. - - INIT0 holds the value of an initializer that should be allowed to escape - the normal rules. - - FLAGS is LOOKUP_ONLYCONVERTING is the = init syntax was used, else 0 - if the (init) syntax was used. - - For functions that take default parameters, DECL points to its - "maximal" instantiation. `cp_finish_decl' must then also declared its - subsequently lower and lower forms of instantiation, checking for - ambiguity as it goes. This can be sped up later. */ - -void -cp_finish_decl (decl, init, asmspec_tree, need_pop, flags) - tree decl, init; - tree asmspec_tree; - int need_pop; - int flags; -{ - register tree type; - tree cleanup = NULL_TREE, ttype = NULL_TREE; - int was_incomplete; - int temporary = allocation_temporary_p (); - char *asmspec = NULL; - int was_readonly = 0; - int already_used = 0; - - /* If this is 0, then we did not change obstacks. */ - if (! decl) - { - if (init) - error ("assignment (not initialization) in declaration"); - return; - } - - /* If a name was specified, get the string. */ - if (asmspec_tree) - asmspec = TREE_STRING_POINTER (asmspec_tree); - - if (init && TREE_CODE (init) == NAMESPACE_DECL) - { - cp_error ("Cannot initialize `%D' to namespace `%D'", - decl, init); - init = NULL_TREE; - } - - if (current_class_type - && DECL_REAL_CONTEXT (decl) == current_class_type - && TYPE_BEING_DEFINED (current_class_type) - && (DECL_INITIAL (decl) || init)) - DECL_DEFINED_IN_CLASS_P (decl) = 1; - - if (TREE_CODE (decl) == VAR_DECL - && DECL_CONTEXT (decl) - && TREE_CODE (DECL_CONTEXT (decl)) == NAMESPACE_DECL - && DECL_CONTEXT (decl) != current_namespace - && init) - { - /* Leave the namespace of the object. */ - pop_decl_namespace (); - } - - /* If the type of the thing we are declaring either has - a constructor, or has a virtual function table pointer, - AND its initialization was accepted by `start_decl', - then we stayed on the permanent obstack through the - declaration, otherwise, changed obstacks as GCC would. */ - - type = TREE_TYPE (decl); - - if (type == error_mark_node) - { - if (toplevel_bindings_p () && temporary) - end_temporary_allocation (); - - return; - } - - if (TYPE_HAS_MUTABLE_P (type)) - TREE_READONLY (decl) = 0; - - if (processing_template_decl) - { - if (init && DECL_INITIAL (decl)) - DECL_INITIAL (decl) = init; - if (minimal_parse_mode && ! DECL_ARTIFICIAL (decl)) - { - tree stmt = DECL_VINDEX (decl); - /* If the decl is declaring a member of a local class (in a - template function), the DECL_VINDEX will either be NULL, - or it will be an actual virtual function index, not a - DECL_STMT. */ - if (stmt != NULL_TREE && TREE_CODE (stmt) == DECL_STMT) - { - DECL_VINDEX (decl) = NULL_TREE; - TREE_OPERAND (stmt, 2) = copy_to_permanent (init); - add_tree (stmt); - } - } - - goto finish_end0; - } - /* Take care of TYPE_DECLs up front. */ - if (TREE_CODE (decl) == TYPE_DECL) - { - if (init && DECL_INITIAL (decl)) - { - /* typedef foo = bar; store the type of bar as the type of foo. */ - TREE_TYPE (decl) = type = TREE_TYPE (init); - DECL_INITIAL (decl) = init = NULL_TREE; - } - if (type != error_mark_node - && IS_AGGR_TYPE (type) && DECL_NAME (decl)) - { - if (TREE_TYPE (DECL_NAME (decl)) && TREE_TYPE (decl) != type) - cp_warning ("shadowing previous type declaration of `%#D'", decl); - set_identifier_type_value (DECL_NAME (decl), type); - CLASSTYPE_GOT_SEMICOLON (type) = 1; - } - GNU_xref_decl (current_function_decl, decl); - - /* If we have installed this as the canonical typedef for this - type, and that type has not been defined yet, delay emitting - the debug information for it, as we will emit it later. */ - if (TYPE_MAIN_DECL (TREE_TYPE (decl)) == decl - && TYPE_SIZE (TREE_TYPE (decl)) == NULL_TREE) - TYPE_DECL_SUPPRESS_DEBUG (decl) = 1; - - rest_of_decl_compilation (decl, NULL_PTR, - DECL_CONTEXT (decl) == NULL_TREE, at_eof); - goto finish_end; - } - if (TREE_CODE (decl) != FUNCTION_DECL) - { - ttype = target_type (type); - } - - if (! DECL_EXTERNAL (decl) && TREE_READONLY (decl) - && TYPE_NEEDS_CONSTRUCTING (type)) - { - - /* Currently, GNU C++ puts constants in text space, making them - impossible to initialize. In the future, one would hope for - an operating system which understood the difference between - initialization and the running of a program. */ - was_readonly = 1; - TREE_READONLY (decl) = 0; - } - - if (TREE_CODE (decl) == FIELD_DECL) - { - if (init && init != error_mark_node) - my_friendly_assert (TREE_PERMANENT (init), 147); - - if (asmspec) - { - /* This must override the asm specifier which was placed - by grokclassfn. Lay this out fresh. */ - DECL_RTL (TREE_TYPE (decl)) = NULL_RTX; - DECL_ASSEMBLER_NAME (decl) = get_identifier (asmspec); - make_decl_rtl (decl, asmspec, 0); - } - } - /* If `start_decl' didn't like having an initialization, ignore it now. */ - else if (init != NULL_TREE && DECL_INITIAL (decl) == NULL_TREE) - init = NULL_TREE; - else if (DECL_EXTERNAL (decl)) - ; - else if (TREE_CODE (type) == REFERENCE_TYPE - || (TYPE_LANG_SPECIFIC (type) && IS_SIGNATURE_REFERENCE (type))) - { - if (TREE_STATIC (decl)) - make_decl_rtl (decl, NULL_PTR, - toplevel_bindings_p () - || pseudo_global_level_p ()); - grok_reference_init (decl, type, init); - init = NULL_TREE; - } - - GNU_xref_decl (current_function_decl, decl); - - if (TREE_CODE (decl) == FIELD_DECL) - ; - else if (TREE_CODE (decl) == CONST_DECL) - { - my_friendly_assert (TREE_CODE (decl) != REFERENCE_TYPE, 148); - - DECL_INITIAL (decl) = init; - - /* This will keep us from needing to worry about our obstacks. */ - my_friendly_assert (init != NULL_TREE, 149); - init = NULL_TREE; - } - else if (init) - { - if (TYPE_HAS_CONSTRUCTOR (type) || TYPE_NEEDS_CONSTRUCTING (type)) - { - if (TREE_CODE (type) == ARRAY_TYPE) - init = digest_init (type, init, (tree *) 0); - else if (TREE_CODE (init) == CONSTRUCTOR - && TREE_HAS_CONSTRUCTOR (init)) - { - if (TYPE_NON_AGGREGATE_CLASS (type)) - { - cp_error ("`%D' must be initialized by constructor, not by `{...}'", - decl); - init = error_mark_node; - } - else - goto dont_use_constructor; - } - } - else - { - dont_use_constructor: - if (TREE_CODE (init) != TREE_VEC) - init = store_init_value (decl, init); - } - - if (init) - /* We must hide the initializer so that expand_decl - won't try to do something it does not understand. */ - init = obscure_complex_init (decl, init); - } - else if (DECL_EXTERNAL (decl)) - ; - else if (TREE_CODE_CLASS (TREE_CODE (type)) == 't' - && (IS_AGGR_TYPE (type) || TYPE_NEEDS_CONSTRUCTING (type))) - { - tree ctype = type; - while (TREE_CODE (ctype) == ARRAY_TYPE) - ctype = TREE_TYPE (ctype); - if (! TYPE_NEEDS_CONSTRUCTING (ctype)) - { - if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (ctype)) - cp_error ("structure `%D' with uninitialized const members", decl); - if (CLASSTYPE_REF_FIELDS_NEED_INIT (ctype)) - cp_error ("structure `%D' with uninitialized reference members", - decl); - } - - check_for_uninitialized_const_var (decl); - - if (TYPE_SIZE (type) != NULL_TREE - && TYPE_NEEDS_CONSTRUCTING (type)) - init = obscure_complex_init (decl, NULL_TREE); - - } - else - check_for_uninitialized_const_var (decl); - - /* For top-level declaration, the initial value was read in - the temporary obstack. MAXINDEX, rtl, etc. to be made below - must go in the permanent obstack; but don't discard the - temporary data yet. */ - - if (toplevel_bindings_p () && temporary) - end_temporary_allocation (); - - /* Deduce size of array from initialization, if not already known. */ - - if (TREE_CODE (type) == ARRAY_TYPE - && TYPE_DOMAIN (type) == NULL_TREE - && TREE_CODE (decl) != TYPE_DECL) - { - int do_default - = (TREE_STATIC (decl) - /* Even if pedantic, an external linkage array - may have incomplete type at first. */ - ? pedantic && ! DECL_EXTERNAL (decl) - : !DECL_EXTERNAL (decl)); - tree initializer = init ? init : DECL_INITIAL (decl); - int failure = complete_array_type (type, initializer, do_default); - - if (failure == 1) - cp_error ("initializer fails to determine size of `%D'", decl); - - if (failure == 2) - { - if (do_default) - cp_error ("array size missing in `%D'", decl); - /* If a `static' var's size isn't known, make it extern as - well as static, so it does not get allocated. If it's not - `static', then don't mark it extern; finish_incomplete_decl - will give it a default size and it will get allocated. */ - else if (!pedantic && TREE_STATIC (decl) && !TREE_PUBLIC (decl)) - DECL_EXTERNAL (decl) = 1; - } - - if (pedantic && TYPE_DOMAIN (type) != NULL_TREE - && tree_int_cst_lt (TYPE_MAX_VALUE (TYPE_DOMAIN (type)), - integer_zero_node)) - cp_error ("zero-size array `%D'", decl); - - layout_decl (decl, 0); - } - - if (TREE_CODE (decl) == VAR_DECL) - { - if (DECL_SIZE (decl) == NULL_TREE - && TYPE_SIZE (complete_type (TREE_TYPE (decl))) != NULL_TREE) - layout_decl (decl, 0); - - if (TREE_STATIC (decl) && DECL_SIZE (decl) == NULL_TREE) - { - /* A static variable with an incomplete type: - that is an error if it is initialized. - Otherwise, let it through, but if it is not `extern' - then it may cause an error message later. */ - if (DECL_INITIAL (decl) != NULL_TREE) - cp_error ("storage size of `%D' isn't known", decl); - init = NULL_TREE; - } - else if (!DECL_EXTERNAL (decl) && DECL_SIZE (decl) == NULL_TREE) - { - /* An automatic variable with an incomplete type: that is an error. - Don't talk about array types here, since we took care of that - message in grokdeclarator. */ - cp_error ("storage size of `%D' isn't known", decl); - TREE_TYPE (decl) = error_mark_node; - } - else if (!DECL_EXTERNAL (decl) && IS_AGGR_TYPE (ttype)) - /* Let debugger know it should output info for this type. */ - note_debug_info_needed (ttype); - - if (TREE_STATIC (decl) && DECL_CLASS_SCOPE_P (decl)) - note_debug_info_needed (DECL_CONTEXT (decl)); - - if ((DECL_EXTERNAL (decl) || TREE_STATIC (decl)) - && DECL_SIZE (decl) != NULL_TREE - && ! TREE_CONSTANT (DECL_SIZE (decl))) - { - if (TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST) - constant_expression_warning (DECL_SIZE (decl)); - else - cp_error ("storage size of `%D' isn't constant", decl); - } - - if (! DECL_EXTERNAL (decl) && TYPE_NEEDS_DESTRUCTOR (type) - /* Cleanups for static variables are handled by `finish_file'. */ - && ! TREE_STATIC (decl)) - { - int yes = suspend_momentary (); - cleanup = maybe_build_cleanup (decl); - resume_momentary (yes); - } - } - /* PARM_DECLs get cleanups, too. */ - else if (TREE_CODE (decl) == PARM_DECL && TYPE_NEEDS_DESTRUCTOR (type)) - { - if (temporary) - end_temporary_allocation (); - cleanup = maybe_build_cleanup (decl); - if (temporary) - resume_temporary_allocation (); - } - - /* Output the assembler code and/or RTL code for variables and functions, - unless the type is an undefined structure or union. - If not, it will get done when the type is completed. */ - - was_incomplete = (DECL_SIZE (decl) == NULL_TREE); - - if (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL - || TREE_CODE (decl) == RESULT_DECL) - { - /* ??? FIXME: What about nested classes? */ - int toplev = toplevel_bindings_p () || pseudo_global_level_p (); - int was_temp - = (TREE_STATIC (decl) && TYPE_NEEDS_DESTRUCTOR (type) - && allocation_temporary_p ()); - - if (was_temp) - end_temporary_allocation (); - - /* Static data in a function with comdat linkage also has comdat - linkage. */ - if (TREE_CODE (decl) == VAR_DECL - && TREE_STATIC (decl) - /* Don't mess with __FUNCTION__. */ - && ! TREE_ASM_WRITTEN (decl) - && current_function_decl - && DECL_CONTEXT (decl) == current_function_decl - && (DECL_THIS_INLINE (current_function_decl) - || DECL_TEMPLATE_INSTANTIATION (current_function_decl)) - && TREE_PUBLIC (current_function_decl)) - { - /* Rather than try to get this right with inlining, we suppress - inlining of such functions. */ - current_function_cannot_inline - = "function with static variable cannot be inline"; - - /* If flag_weak, we don't need to mess with this, as we can just - make the function weak, and let it refer to its unique local - copy. This works because we don't allow the function to be - inlined. */ - if (! flag_weak) - { - if (DECL_INTERFACE_KNOWN (current_function_decl)) - { - TREE_PUBLIC (decl) = 1; - DECL_EXTERNAL (decl) = DECL_EXTERNAL (current_function_decl); - } - else if (DECL_INITIAL (decl) == NULL_TREE - || DECL_INITIAL (decl) == error_mark_node) - { - TREE_PUBLIC (decl) = 1; - DECL_COMMON (decl) = 1; - } - /* else we lose. We can only do this if we can use common, - which we can't if it has been initialized. */ - - if (TREE_PUBLIC (decl)) - DECL_ASSEMBLER_NAME (decl) - = build_static_name (current_function_decl, DECL_NAME (decl)); - else if (! DECL_ARTIFICIAL (decl)) - { - cp_warning_at ("sorry: semantics of inline function static data `%#D' are wrong (you'll wind up with multiple copies)", decl); - cp_warning_at (" you can work around this by removing the initializer"), decl; - } - } - } - - else if (TREE_CODE (decl) == VAR_DECL - && DECL_LANG_SPECIFIC (decl) - && DECL_COMDAT (decl)) - { - /* Dynamically initialized vars go into common. */ - if (DECL_INITIAL (decl) == NULL_TREE - || DECL_INITIAL (decl) == error_mark_node) - DECL_COMMON (decl) = 1; - else if (EMPTY_CONSTRUCTOR_P (DECL_INITIAL (decl))) - { - DECL_COMMON (decl) = 1; - DECL_INITIAL (decl) = error_mark_node; - } - else - { - /* Statically initialized vars are weak or comdat, if - supported. */ - if (flag_weak) - make_decl_one_only (decl); - else - { - /* We can't do anything useful; leave vars for explicit - instantiation. */ - DECL_EXTERNAL (decl) = 1; - DECL_NOT_REALLY_EXTERN (decl) = 0; - } - } - } - - if (TREE_CODE (decl) == VAR_DECL && DECL_VIRTUAL_P (decl)) - make_decl_rtl (decl, NULL_PTR, toplev); - else if (TREE_CODE (decl) == VAR_DECL - && TREE_READONLY (decl) - && DECL_INITIAL (decl) != NULL_TREE - && DECL_INITIAL (decl) != error_mark_node - && ! EMPTY_CONSTRUCTOR_P (DECL_INITIAL (decl))) - { - DECL_INITIAL (decl) = save_expr (DECL_INITIAL (decl)); - - if (asmspec) - DECL_ASSEMBLER_NAME (decl) = get_identifier (asmspec); - - if (! toplev - && TREE_STATIC (decl) - && ! TREE_SIDE_EFFECTS (decl) - && ! TREE_PUBLIC (decl) - && ! DECL_EXTERNAL (decl) - && ! TYPE_NEEDS_DESTRUCTOR (type) - && DECL_MODE (decl) != BLKmode) - { - /* If this variable is really a constant, then fill its DECL_RTL - slot with something which won't take up storage. - If something later should take its address, we can always give - it legitimate RTL at that time. */ - DECL_RTL (decl) = gen_reg_rtx (DECL_MODE (decl)); - store_expr (DECL_INITIAL (decl), DECL_RTL (decl), 0); - TREE_ASM_WRITTEN (decl) = 1; - } - else if (toplev && ! TREE_PUBLIC (decl)) - { - /* If this is a static const, change its apparent linkage - if it belongs to a #pragma interface. */ - if (!interface_unknown) - { - TREE_PUBLIC (decl) = 1; - DECL_EXTERNAL (decl) = interface_only; - } - make_decl_rtl (decl, asmspec, toplev); - } - else - rest_of_decl_compilation (decl, asmspec, toplev, at_eof); - } - else if (TREE_CODE (decl) == VAR_DECL - && DECL_LANG_SPECIFIC (decl) - && DECL_IN_AGGR_P (decl)) - { - if (TREE_STATIC (decl)) - { - if (init == NULL_TREE -#ifdef DEFAULT_STATIC_DEFS - /* If this code is dead, then users must - explicitly declare static member variables - outside the class def'n as well. */ - && TYPE_NEEDS_CONSTRUCTING (type) -#endif - ) - { - DECL_EXTERNAL (decl) = 1; - make_decl_rtl (decl, asmspec, 1); - } - else - rest_of_decl_compilation (decl, asmspec, toplev, at_eof); - } - else - /* Just a constant field. Should not need any rtl. */ - goto finish_end0; - } - else - rest_of_decl_compilation (decl, asmspec, toplev, at_eof); - - if (was_temp) - resume_temporary_allocation (); - - if (type != error_mark_node - && TYPE_LANG_SPECIFIC (type) - && CLASSTYPE_ABSTRACT_VIRTUALS (type)) - abstract_virtuals_error (decl, type); - else if ((TREE_CODE (type) == FUNCTION_TYPE - || TREE_CODE (type) == METHOD_TYPE) - && TYPE_LANG_SPECIFIC (TREE_TYPE (type)) - && CLASSTYPE_ABSTRACT_VIRTUALS (TREE_TYPE (type))) - abstract_virtuals_error (decl, TREE_TYPE (type)); - - if (TYPE_LANG_SPECIFIC (type) && IS_SIGNATURE (type)) - signature_error (decl, type); - else if ((TREE_CODE (type) == FUNCTION_TYPE - || TREE_CODE (type) == METHOD_TYPE) - && TYPE_LANG_SPECIFIC (TREE_TYPE (type)) - && IS_SIGNATURE (TREE_TYPE (type))) - signature_error (decl, TREE_TYPE (type)); - - if (TREE_CODE (decl) == FUNCTION_DECL) - ; - else if (DECL_EXTERNAL (decl) - && ! (DECL_LANG_SPECIFIC (decl) - && DECL_NOT_REALLY_EXTERN (decl))) - { - if (init) - DECL_INITIAL (decl) = init; - } - else if (TREE_STATIC (decl) && type != error_mark_node) - { - /* Cleanups for static variables are handled by `finish_file'. */ - if (TYPE_NEEDS_CONSTRUCTING (type) || init != NULL_TREE - || TYPE_NEEDS_DESTRUCTOR (type)) - expand_static_init (decl, init); - } - else if (! toplev) - { - /* This is a declared decl which must live until the - end of the binding contour. It may need a cleanup. */ - - /* Recompute the RTL of a local array now - if it used to be an incomplete type. */ - if (was_incomplete && ! TREE_STATIC (decl)) - { - /* If we used it already as memory, it must stay in memory. */ - TREE_ADDRESSABLE (decl) = TREE_USED (decl); - /* If it's still incomplete now, no init will save it. */ - if (DECL_SIZE (decl) == NULL_TREE) - DECL_INITIAL (decl) = NULL_TREE; - expand_decl (decl); - } - else if (! TREE_ASM_WRITTEN (decl) - && (TYPE_SIZE (type) != NULL_TREE - || TREE_CODE (type) == ARRAY_TYPE)) - { - /* Do this here, because we did not expand this decl's - rtl in start_decl. */ - if (DECL_RTL (decl) == NULL_RTX) - expand_decl (decl); - else if (cleanup) - { - /* XXX: Why don't we use decl here? */ - /* Ans: Because it was already expanded? */ - if (! expand_decl_cleanup (NULL_TREE, cleanup)) - cp_error ("parser lost in parsing declaration of `%D'", - decl); - /* Cleanup used up here. */ - cleanup = NULL_TREE; - } - } - - if (current_binding_level->is_for_scope) - { - struct binding_level *outer - = current_binding_level->level_chain; - - /* Check to see if the same name is already bound at - the outer level, either because it was directly declared, - or because a dead for-decl got preserved. In either case, - the code would not have been valid under the ARM - scope rules, so clear is_for_scope for the - current_binding_level. - - Otherwise, we need to preserve the temp slot for decl - to last into the outer binding level. */ - - tree outer_binding - = TREE_CHAIN (IDENTIFIER_BINDING (DECL_NAME (decl))); - - if (outer_binding && BINDING_LEVEL (outer_binding) == outer - && (TREE_CODE (BINDING_VALUE (outer_binding)) - == VAR_DECL) - && DECL_DEAD_FOR_LOCAL (BINDING_VALUE (outer_binding))) - { - BINDING_VALUE (outer_binding) - = DECL_SHADOWED_FOR_VAR (BINDING_VALUE (outer_binding)); - current_binding_level->is_for_scope = 0; - } - else if (DECL_IN_MEMORY_P (decl)) - preserve_temp_slots (DECL_RTL (decl)); - } - - expand_start_target_temps (); - - if (DECL_SIZE (decl) && type != error_mark_node) - { - /* Compute and store the initial value. */ - expand_decl_init (decl); - already_used = TREE_USED (decl) || TREE_USED (type); - - if (init || TYPE_NEEDS_CONSTRUCTING (type)) - { - emit_line_note (DECL_SOURCE_FILE (decl), - DECL_SOURCE_LINE (decl)); - expand_aggr_init (decl, init, flags); - } - - /* Set this to 0 so we can tell whether an aggregate which - was initialized was ever used. Don't do this if it has a - destructor, so we don't complain about the 'resource - allocation is initialization' idiom. */ - /* Now set attribute((unused)) on types so decls of - that type will be marked used. (see TREE_USED, above.) - This avoids the warning problems this particular code - tried to work around. */ - - if (TYPE_NEEDS_CONSTRUCTING (type) - && ! already_used - && cleanup == NULL_TREE - && DECL_NAME (decl)) - TREE_USED (decl) = 0; - - if (already_used) - TREE_USED (decl) = 1; - } - - /* Cleanup any temporaries needed for the initial value. */ - expand_end_target_temps (); - - if (DECL_SIZE (decl) && type != error_mark_node) - { - /* Store the cleanup, if there was one. */ - if (cleanup) - { - if (! expand_decl_cleanup (decl, cleanup)) - cp_error ("parser lost in parsing declaration of `%D'", - decl); - } - } - } - finish_end0: - - /* Undo call to `pushclass' that was done in `start_decl' - due to initialization of qualified member variable. - I.e., Foo::x = 10; */ - { - tree context = DECL_REAL_CONTEXT (decl); - if (context - && TREE_CODE_CLASS (TREE_CODE (context)) == 't' - && (TREE_CODE (decl) == VAR_DECL - /* We also have a pushclass done that we need to undo here - if we're at top level and declare a method. */ - || TREE_CODE (decl) == FUNCTION_DECL) - /* If size hasn't been set, we're still defining it, - and therefore inside the class body; don't pop - the binding level.. */ - && TYPE_SIZE (context) != NULL_TREE - && context == current_class_type) - popclass (1); - } - } - - finish_end: - - /* If requested, warn about definitions of large data objects. */ - - if (warn_larger_than - && ! processing_template_decl - && (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == PARM_DECL) - && !DECL_EXTERNAL (decl)) - { - register tree decl_size = DECL_SIZE (decl); - - if (decl_size && TREE_CODE (decl_size) == INTEGER_CST) - { - unsigned units = TREE_INT_CST_LOW (decl_size) / BITS_PER_UNIT; - - if (units > larger_than_size) - warning_with_decl (decl, "size of `%s' is %u bytes", units); - } - } - - if (need_pop) - { - /* Resume permanent allocation, if not within a function. */ - /* The corresponding push_obstacks_nochange is in start_decl, - start_method, groktypename, and in grokfield. */ - pop_obstacks (); - } - - if (was_readonly) - TREE_READONLY (decl) = 1; -} - -/* This is here for a midend callback from c-common.c */ - -void -finish_decl (decl, init, asmspec_tree) - tree decl, init; - tree asmspec_tree; -{ - cp_finish_decl (decl, init, asmspec_tree, 1, 0); -} - -void -expand_static_init (decl, init) - tree decl; - tree init; -{ - tree oldstatic = value_member (decl, static_aggregates); - - if (oldstatic) - { - if (TREE_PURPOSE (oldstatic) && init != NULL_TREE) - cp_error ("multiple initializations given for `%D'", decl); - } - else if (! toplevel_bindings_p () && ! pseudo_global_level_p ()) - { - /* Emit code to perform this initialization but once. */ - tree temp; - - /* Remember this information until end of file. */ - push_obstacks (&permanent_obstack, &permanent_obstack); - - /* Emit code to perform this initialization but once. This code - looks like: - - static int temp = 0; - if (!temp) { - // Do initialization. - temp = 1; - // Register variable for destruction at end of program. - } - - Note that the `temp' variable is only set to 1 *after* the - initialization is complete. This ensures that an exception, - thrown during the construction, will cause the variable to - reinitialized when we pass through this code again, as per: - - [stmt.dcl] - - If the initialization exits by throwing an exception, the - initialization is not complete, so it will be tried again - the next time control enters the declaration. - - In theory, this process should be thread-safe, too; multiple - threads should not be able to initialize the variable more - than once. We don't yet attempt to ensure thread-safety. */ - temp = get_temp_name (integer_type_node, 1); - rest_of_decl_compilation (temp, NULL_PTR, 0, 0); - - /* Begin the conditional initialization. */ - expand_start_cond (build_binary_op (EQ_EXPR, temp, - integer_zero_node, 1), 0); - expand_start_target_temps (); - - /* Do the initialization itself. */ - if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)) - || (init && TREE_CODE (init) == TREE_LIST)) - { - expand_aggr_init (decl, init, 0); - do_pending_stack_adjust (); - } - else if (init) - expand_assignment (decl, init, 0, 0); - - /* Set TEMP to 1. */ - expand_assignment (temp, integer_one_node, 0, 0); - - /* Cleanup any temporaries needed for the initial value. If - destroying one of the temporaries causes an exception to be - thrown, then the object itself has still been fully - constructed. */ - expand_end_target_temps (); - - /* Use atexit to register a function for destroying this static - variable. */ - if (TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (decl))) - { - tree cleanup, fcall; - static tree Atexit = 0; - if (Atexit == 0) - { - tree atexit_fndecl, PFV, pfvlist; - /* Remember this information until end of file. */ - push_obstacks (&permanent_obstack, &permanent_obstack); - PFV = build_pointer_type (build_function_type - (void_type_node, void_list_node)); - - pfvlist = tree_cons (NULL_TREE, PFV, void_list_node); - - push_lang_context (lang_name_c); - atexit_fndecl - = builtin_function ("atexit", - build_function_type (void_type_node, - pfvlist), - NOT_BUILT_IN, NULL_PTR); - mark_used (atexit_fndecl); - Atexit = default_conversion (atexit_fndecl); - pop_lang_context (); - pop_obstacks (); - } - - /* Call build_cleanup before we enter the anonymous function - so that any access checks will be done relative to the - current scope, rather than the scope of the anonymous - function. */ - fcall = build_cleanup (decl); - cleanup = start_anon_func (); - expand_expr_stmt (fcall); - end_anon_func (); - mark_addressable (cleanup); - cleanup = build_unary_op (ADDR_EXPR, cleanup, 0); - fcall = build_function_call (Atexit, expr_tree_cons (NULL_TREE, cleanup, NULL_TREE)); - expand_expr_stmt (fcall); - } - - expand_end_cond (); - if (TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (decl))) - { - static_aggregates = perm_tree_cons (temp, decl, static_aggregates); - TREE_STATIC (static_aggregates) = 1; - } - - /* Resume old (possibly temporary) allocation. */ - pop_obstacks (); - } - else - { - /* This code takes into account memory allocation - policy of `start_decl'. Namely, if TYPE_NEEDS_CONSTRUCTING - does not hold for this object, then we must make permanent - the storage currently in the temporary obstack. */ - if (! TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl))) - preserve_initializer (); - static_aggregates = perm_tree_cons (init, decl, static_aggregates); - } -} - -/* Make TYPE a complete type based on INITIAL_VALUE. - Return 0 if successful, 1 if INITIAL_VALUE can't be deciphered, - 2 if there was no information (in which case assume 1 if DO_DEFAULT). */ - -int -complete_array_type (type, initial_value, do_default) - tree type, initial_value; - int do_default; -{ - register tree maxindex = NULL_TREE; - int value = 0; - - if (initial_value) - { - /* Note MAXINDEX is really the maximum index, - one less than the size. */ - if (TREE_CODE (initial_value) == STRING_CST) - { - int eltsize - = int_size_in_bytes (TREE_TYPE (TREE_TYPE (initial_value))); - maxindex = build_int_2 ((TREE_STRING_LENGTH (initial_value) - / eltsize) - 1, 0); - } - else if (TREE_CODE (initial_value) == CONSTRUCTOR) - { - tree elts = CONSTRUCTOR_ELTS (initial_value); - maxindex = size_binop (MINUS_EXPR, integer_zero_node, size_one_node); - for (; elts; elts = TREE_CHAIN (elts)) - { - if (TREE_PURPOSE (elts)) - maxindex = TREE_PURPOSE (elts); - else - maxindex = size_binop (PLUS_EXPR, maxindex, size_one_node); - } - maxindex = copy_node (maxindex); - } - else - { - /* Make an error message unless that happened already. */ - if (initial_value != error_mark_node) - value = 1; - - /* Prevent further error messages. */ - maxindex = build_int_2 (0, 0); - } - } - - if (!maxindex) - { - if (do_default) - maxindex = build_int_2 (0, 0); - value = 2; - } - - if (maxindex) - { - tree itype; - - TYPE_DOMAIN (type) = build_index_type (maxindex); - if (! TREE_TYPE (maxindex)) - TREE_TYPE (maxindex) = TYPE_DOMAIN (type); - if (initial_value) - itype = TREE_TYPE (initial_value); - else - itype = NULL; - if (itype && !TYPE_DOMAIN (itype)) - TYPE_DOMAIN (itype) = TYPE_DOMAIN (type); - /* The type of the main variant should never be used for arrays - of different sizes. It should only ever be completed with the - size of the array. */ - if (! TYPE_DOMAIN (TYPE_MAIN_VARIANT (type))) - TYPE_DOMAIN (TYPE_MAIN_VARIANT (type)) = TYPE_DOMAIN (type); - } - - /* Lay out the type now that we can get the real answer. */ - - layout_type (type); - - return value; -} - -/* Return zero if something is declared to be a member of type - CTYPE when in the context of CUR_TYPE. STRING is the error - message to print in that case. Otherwise, quietly return 1. */ - -static int -member_function_or_else (ctype, cur_type, string) - tree ctype, cur_type; - char *string; -{ - if (ctype && ctype != cur_type) - { - error (string, TYPE_NAME_STRING (ctype)); - return 0; - } - return 1; -} - -/* Subroutine of `grokdeclarator'. */ - -/* Generate errors possibly applicable for a given set of specifiers. - This is for ARM $7.1.2. */ - -static void -bad_specifiers (object, type, virtualp, quals, inlinep, friendp, raises) - tree object; - char *type; - int virtualp, quals, friendp, raises, inlinep; -{ - if (virtualp) - cp_error ("`%D' declared as a `virtual' %s", object, type); - if (inlinep) - cp_error ("`%D' declared as an `inline' %s", object, type); - if (quals) - cp_error ("`const' and `volatile' function specifiers on `%D' invalid in %s declaration", - object, type); - if (friendp) - cp_error_at ("invalid friend declaration", object); - if (raises) - cp_error_at ("invalid exception specifications", object); -} - -/* CTYPE is class type, or null if non-class. - TYPE is type this FUNCTION_DECL should have, either FUNCTION_TYPE - or METHOD_TYPE. - DECLARATOR is the function's name. - VIRTUALP is truthvalue of whether the function is virtual or not. - FLAGS are to be passed through to `grokclassfn'. - QUALS are qualifiers indicating whether the function is `const' - or `volatile'. - RAISES is a list of exceptions that this function can raise. - CHECK is 1 if we must find this method in CTYPE, 0 if we should - not look, and -1 if we should not call `grokclassfn' at all. - - Returns `error_mark_node' if something goes wrong, after issuing - applicable error messages. */ - -static tree -grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals, - raises, attrlist, check, friendp, publicp, inlinep, funcdef_flag, - template_count, in_namespace) - tree ctype, type; - tree declarator; - tree orig_declarator; - int virtualp; - enum overload_flags flags; - tree quals, raises, attrlist; - int check, friendp, publicp, inlinep, funcdef_flag, template_count; - tree in_namespace; -{ - tree cname, decl; - int staticp = ctype && TREE_CODE (type) == FUNCTION_TYPE; - tree t; - - if (ctype) - cname = TREE_CODE (TYPE_NAME (ctype)) == TYPE_DECL - ? TYPE_IDENTIFIER (ctype) : TYPE_NAME (ctype); - else - cname = NULL_TREE; - - if (raises) - { - type = build_exception_variant (type, raises); - } - - decl = build_lang_decl (FUNCTION_DECL, declarator, type); - /* Propagate volatile out from type to decl. */ - if (TYPE_VOLATILE (type)) - TREE_THIS_VOLATILE (decl) = 1; - - /* If this decl has namespace scope, set that up. */ - if (in_namespace) - set_decl_namespace (decl, in_namespace); - else if (publicp && ! ctype) - DECL_CONTEXT (decl) = FROB_CONTEXT (current_namespace); - - /* `main' and builtins have implicit 'C' linkage. */ - if ((MAIN_NAME_P (declarator) - || (IDENTIFIER_LENGTH (declarator) > 10 - && IDENTIFIER_POINTER (declarator)[0] == '_' - && IDENTIFIER_POINTER (declarator)[1] == '_' - && strncmp (IDENTIFIER_POINTER (declarator)+2, "builtin_", 8) == 0)) - && current_lang_name == lang_name_cplusplus - && ctype == NULL_TREE - /* NULL_TREE means global namespace. */ - && DECL_CONTEXT (decl) == NULL_TREE) - DECL_LANGUAGE (decl) = lang_c; - - /* Should probably propagate const out from type to decl I bet (mrs). */ - if (staticp) - { - DECL_STATIC_FUNCTION_P (decl) = 1; - DECL_CONTEXT (decl) = ctype; - } - - if (ctype) - DECL_CLASS_CONTEXT (decl) = ctype; - - if (ctype == NULL_TREE && DECL_MAIN_P (decl)) - { - if (processing_template_decl) - error ("cannot declare `main' to be a template"); - if (inlinep) - error ("cannot declare `main' to be inline"); - else if (! publicp) - error ("cannot declare `main' to be static"); - inlinep = 0; - publicp = 1; - } - - /* Members of anonymous types and local classes have no linkage; make - them internal. */ - if (ctype && (ANON_AGGRNAME_P (TYPE_IDENTIFIER (ctype)) - || hack_decl_function_context (TYPE_MAIN_DECL (ctype)))) - publicp = 0; - - if (publicp) - { - /* [basic.link]: A name with no linkage (notably, the name of a class - or enumeration declared in a local scope) shall not be used to - declare an entity with linkage. - - Only check this for public decls for now. */ - t = no_linkage_check (TREE_TYPE (decl)); - if (t) - { - if (ANON_AGGRNAME_P (TYPE_IDENTIFIER (t))) - { - if (DECL_LANGUAGE (decl) == lang_c) - /* Allow this; it's pretty common in C. */; - else - cp_pedwarn ("non-local function `%#D' uses anonymous type", - decl); - } - else - cp_pedwarn ("non-local function `%#D' uses local type `%T'", - decl, t); - } - } - - TREE_PUBLIC (decl) = publicp; - if (! publicp) - { - DECL_INTERFACE_KNOWN (decl) = 1; - DECL_NOT_REALLY_EXTERN (decl) = 1; - } - - if (inlinep) - DECL_THIS_INLINE (decl) = DECL_INLINE (decl) = 1; - - DECL_EXTERNAL (decl) = 1; - if (quals != NULL_TREE && TREE_CODE (type) == FUNCTION_TYPE) - { - cp_error ("%smember function `%D' cannot have `%T' method qualifier", - (ctype ? "static " : "non-"), decl, TREE_VALUE (quals)); - quals = NULL_TREE; - } - - if (IDENTIFIER_OPNAME_P (DECL_NAME (decl))) - grok_op_properties (decl, virtualp, check < 0); - - if (ctype && hack_decl_function_context (decl)) - DECL_NO_STATIC_CHAIN (decl) = 1; - - for (t = TYPE_ARG_TYPES (TREE_TYPE (decl)); t; t = TREE_CHAIN (t)) - if (TREE_PURPOSE (t) - && TREE_CODE (TREE_PURPOSE (t)) == DEFAULT_ARG) - { - add_defarg_fn (decl); - break; - } - - if (friendp - && TREE_CODE (orig_declarator) == TEMPLATE_ID_EXPR) - { - if (funcdef_flag) - cp_error - ("defining explicit specialization `%D' in friend declaration", - orig_declarator); - else - { - if (PROCESSING_REAL_TEMPLATE_DECL_P ()) - { - /* Something like `template friend void f()'. */ - cp_error ("template-id `%D' in declaration of primary template", - orig_declarator); - return error_mark_node; - } - - /* A friend declaration of the form friend void f<>(). Record - the information in the TEMPLATE_ID_EXPR. */ - SET_DECL_IMPLICIT_INSTANTIATION (decl); - DECL_TEMPLATE_INFO (decl) - = perm_tree_cons (TREE_OPERAND (orig_declarator, 0), - TREE_OPERAND (orig_declarator, 1), - NULL_TREE); - } - } - - /* Plain overloading: will not be grok'd by grokclassfn. */ - if (! ctype && ! processing_template_decl - && DECL_LANGUAGE (decl) != lang_c - && (! DECL_USE_TEMPLATE (decl) || name_mangling_version < 1)) - set_mangled_name_for_decl (decl); - - if (funcdef_flag) - /* Make the init_value nonzero so pushdecl knows this is not - tentative. error_mark_node is replaced later with the BLOCK. */ - DECL_INITIAL (decl) = error_mark_node; - - /* Caller will do the rest of this. */ - if (check < 0) - return decl; - - if (check && funcdef_flag) - DECL_INITIAL (decl) = error_mark_node; - - if (flags == NO_SPECIAL && ctype && constructor_name (cname) == declarator) - { - tree tmp; - /* Just handle constructors here. We could do this - inside the following if stmt, but I think - that the code is more legible by breaking this - case out. See comments below for what each of - the following calls is supposed to do. */ - DECL_CONSTRUCTOR_P (decl) = 1; - - grokclassfn (ctype, decl, flags, quals); - - decl = check_explicit_specialization (orig_declarator, decl, - template_count, - 2 * (funcdef_flag != 0) + - 4 * (friendp != 0)); - if (decl == error_mark_node) - return error_mark_node; - - if ((! TYPE_FOR_JAVA (ctype) || check_java_method (decl)) - && check) - { - tmp = check_classfn (ctype, decl); - - if (tmp && TREE_CODE (tmp) == TEMPLATE_DECL) - tmp = DECL_TEMPLATE_RESULT(tmp); - - if (tmp && DECL_ARTIFICIAL (tmp)) - cp_error ("definition of implicitly-declared `%D'", tmp); - if (tmp && duplicate_decls (decl, tmp)) - return tmp; - } - if (! grok_ctor_properties (ctype, decl)) - return error_mark_node; - } - else - { - tree tmp; - - /* Function gets the ugly name, field gets the nice one. - This call may change the type of the function (because - of default parameters)! */ - if (ctype != NULL_TREE) - grokclassfn (ctype, decl, flags, quals); - - decl = check_explicit_specialization (orig_declarator, decl, - template_count, - 2 * (funcdef_flag != 0) + - 4 * (friendp != 0)); - if (decl == error_mark_node) - return error_mark_node; - - if (ctype != NULL_TREE - && (! TYPE_FOR_JAVA (ctype) || check_java_method (decl)) - && check) - { - tmp = check_classfn (ctype, decl); - - if (tmp && TREE_CODE (tmp) == TEMPLATE_DECL) - tmp = DECL_TEMPLATE_RESULT (tmp); - - if (tmp && DECL_STATIC_FUNCTION_P (tmp) - && TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE) - { - /* Remove the `this' parm added by grokclassfn. - XXX Isn't this done in start_function, too? */ - revert_static_member_fn (&decl, NULL, NULL); - last_function_parms = TREE_CHAIN (last_function_parms); - } - if (tmp && DECL_ARTIFICIAL (tmp)) - cp_error ("definition of implicitly-declared `%D'", tmp); - if (tmp) - { - if (!duplicate_decls (decl, tmp)) - my_friendly_abort (892); - return tmp; - } - } - - if (ctype == NULL_TREE || check) - return decl; - - if (attrlist) - cplus_decl_attributes (decl, TREE_PURPOSE (attrlist), - TREE_VALUE (attrlist)); - make_decl_rtl (decl, NULL_PTR, 1); - - if (virtualp) - { - DECL_VIRTUAL_P (decl) = 1; - if (DECL_VINDEX (decl) == NULL_TREE) - DECL_VINDEX (decl) = error_mark_node; - IDENTIFIER_VIRTUAL_P (DECL_NAME (decl)) = 1; - } - } - return decl; -} - -static tree -grokvardecl (type, declarator, specbits_in, initialized, constp, in_namespace) - tree type; - tree declarator; - RID_BIT_TYPE *specbits_in; - int initialized; - int constp; - tree in_namespace; -{ - tree decl; - RID_BIT_TYPE specbits; - - specbits = *specbits_in; - - if (TREE_CODE (type) == OFFSET_TYPE) - { - /* If you declare a static member so that it - can be initialized, the code will reach here. */ - tree basetype = TYPE_OFFSET_BASETYPE (type); - type = TREE_TYPE (type); - decl = build_lang_field_decl (VAR_DECL, declarator, type); - DECL_CONTEXT (decl) = basetype; - DECL_CLASS_CONTEXT (decl) = basetype; - DECL_ASSEMBLER_NAME (decl) = build_static_name (basetype, declarator); - } - else - { - tree context; - - if (in_namespace) - context = in_namespace; - else if (namespace_bindings_p () || RIDBIT_SETP (RID_EXTERN, specbits)) - context = current_namespace; - else - context = NULL_TREE; - - decl = build_decl (VAR_DECL, declarator, complete_type (type)); - - if (context) - set_decl_namespace (decl, context); - - context = DECL_CONTEXT (decl); - if (declarator && context && current_lang_name != lang_name_c) - DECL_ASSEMBLER_NAME (decl) = build_static_name (context, declarator); - } - - if (in_namespace) - set_decl_namespace (decl, in_namespace); - - if (RIDBIT_SETP (RID_EXTERN, specbits)) - { - DECL_THIS_EXTERN (decl) = 1; - DECL_EXTERNAL (decl) = !initialized; - } - - /* In class context, static means one per class, - public access, and static storage. */ - if (DECL_CLASS_SCOPE_P (decl)) - { - TREE_PUBLIC (decl) = 1; - TREE_STATIC (decl) = 1; - DECL_EXTERNAL (decl) = 0; - } - /* At top level, either `static' or no s.c. makes a definition - (perhaps tentative), and absence of `static' makes it public. */ - else if (toplevel_bindings_p ()) - { - TREE_PUBLIC (decl) = (RIDBIT_NOTSETP (RID_STATIC, specbits) - && (DECL_THIS_EXTERN (decl) || ! constp)); - TREE_STATIC (decl) = ! DECL_EXTERNAL (decl); - } - /* Not at top level, only `static' makes a static definition. */ - else - { - TREE_STATIC (decl) = !! RIDBIT_SETP (RID_STATIC, specbits); - TREE_PUBLIC (decl) = DECL_EXTERNAL (decl); - } - - if (TREE_PUBLIC (decl)) - { - /* [basic.link]: A name with no linkage (notably, the name of a class - or enumeration declared in a local scope) shall not be used to - declare an entity with linkage. - - Only check this for public decls for now. */ - tree t = no_linkage_check (TREE_TYPE (decl)); - if (t) - { - if (ANON_AGGRNAME_P (TYPE_IDENTIFIER (t))) - /* Ignore for now; `enum { foo } e' is pretty common. */; - else - cp_pedwarn ("non-local variable `%#D' uses local type `%T'", - decl, t); - } - } - - return decl; -} - -/* Create and return a canonical pointer to member function type, for - TYPE, which is a POINTER_TYPE to a METHOD_TYPE. */ - -tree -build_ptrmemfunc_type (type) - tree type; -{ - tree fields[4]; - tree t; - tree u; - - /* If a canonical type already exists for this type, use it. We use - this method instead of type_hash_canon, because it only does a - simple equality check on the list of field members. */ - - if ((t = TYPE_GET_PTRMEMFUNC_TYPE (type))) - return t; - - push_obstacks (TYPE_OBSTACK (type), TYPE_OBSTACK (type)); - - u = make_lang_type (UNION_TYPE); - SET_IS_AGGR_TYPE (u, 0); - fields[0] = build_lang_field_decl (FIELD_DECL, pfn_identifier, type); - fields[1] = build_lang_field_decl (FIELD_DECL, delta2_identifier, - delta_type_node); - finish_builtin_type (u, "__ptrmemfunc_type", fields, 1, ptr_type_node); - TYPE_NAME (u) = NULL_TREE; - - t = make_lang_type (RECORD_TYPE); - - /* Let the front-end know this is a pointer to member function... */ - TYPE_PTRMEMFUNC_FLAG (t) = 1; - /* ... and not really an aggregate. */ - SET_IS_AGGR_TYPE (t, 0); - - fields[0] = build_lang_field_decl (FIELD_DECL, delta_identifier, - delta_type_node); - fields[1] = build_lang_field_decl (FIELD_DECL, index_identifier, - delta_type_node); - fields[2] = build_lang_field_decl (FIELD_DECL, pfn_or_delta2_identifier, u); - finish_builtin_type (t, "__ptrmemfunc_type", fields, 2, ptr_type_node); - - pop_obstacks (); - - /* Zap out the name so that the back-end will give us the debugging - information for this anonymous RECORD_TYPE. */ - TYPE_NAME (t) = NULL_TREE; - - TYPE_SET_PTRMEMFUNC_TYPE (type, t); - - /* Seems to be wanted. */ - CLASSTYPE_GOT_SEMICOLON (t) = 1; - return t; -} - -/* Given declspecs and a declarator, - determine the name and type of the object declared - and construct a ..._DECL node for it. - (In one case we can return a ..._TYPE node instead. - For invalid input we sometimes return 0.) - - DECLSPECS is a chain of tree_list nodes whose value fields - are the storage classes and type specifiers. - - DECL_CONTEXT says which syntactic context this declaration is in: - NORMAL for most contexts. Make a VAR_DECL or FUNCTION_DECL or TYPE_DECL. - FUNCDEF for a function definition. Like NORMAL but a few different - error messages in each case. Return value may be zero meaning - this definition is too screwy to try to parse. - MEMFUNCDEF for a function definition. Like FUNCDEF but prepares to - handle member functions (which have FIELD context). - Return value may be zero meaning this definition is too screwy to - try to parse. - PARM for a parameter declaration (either within a function prototype - or before a function body). Make a PARM_DECL, or return void_type_node. - CATCHPARM for a parameter declaration before a catch clause. - TYPENAME if for a typename (in a cast or sizeof). - Don't make a DECL node; just return the ..._TYPE node. - FIELD for a struct or union field; make a FIELD_DECL. - BITFIELD for a field with specified width. - INITIALIZED is 1 if the decl has an initializer. - - ATTRLIST is a TREE_LIST node with prefix attributes in TREE_VALUE and - normal attributes in TREE_PURPOSE, or NULL_TREE. - - In the TYPENAME case, DECLARATOR is really an absolute declarator. - It may also be so in the PARM case, for a prototype where the - argument type is specified but not the name. - - This function is where the complicated C meanings of `static' - and `extern' are interpreted. - - For C++, if there is any monkey business to do, the function which - calls this one must do it, i.e., prepending instance variables, - renaming overloaded function names, etc. - - Note that for this C++, it is an error to define a method within a class - which does not belong to that class. - - Except in the case where SCOPE_REFs are implicitly known (such as - methods within a class being redundantly qualified), - declarations which involve SCOPE_REFs are returned as SCOPE_REFs - (class_name::decl_name). The caller must also deal with this. - - If a constructor or destructor is seen, and the context is FIELD, - then the type gains the attribute TREE_HAS_x. If such a declaration - is erroneous, NULL_TREE is returned. - - QUALS is used only for FUNCDEF and MEMFUNCDEF cases. For a member - function, these are the qualifiers to give to the `this' pointer. - - May return void_type_node if the declarator turned out to be a friend. - See grokfield for details. */ - -enum return_types { return_normal, return_ctor, return_dtor, return_conversion }; - -/* DECL is a VAR_DECL defined in-class, whose TYPE is also given. - Check to see that the definition is valid. Issue appropriate error - messages. Return 1 if the definition is particularly bad, or 0 - otherwise. */ - -int -check_static_variable_definition (decl, type) - tree decl; - tree type; -{ - /* Motion 10 at San Diego: If a static const integral data member is - initialized with an integral constant expression, the initializer - may appear either in the declaration (within the class), or in - the definition, but not both. If it appears in the class, the - member is a member constant. The file-scope definition is always - required. */ - if (CLASS_TYPE_P (type) || TREE_CODE (type) == REFERENCE_TYPE) - { - cp_error ("in-class initialization of static data member of non-integral type `%T'", - type); - /* If we just return the declaration, crashes will sometimes - occur. We therefore return void_type_node, as if this was a - friend declaration, to cause callers to completely ignore - this declaration. */ - return 1; - } - else if (!CP_TYPE_CONST_P (type)) - cp_error ("ANSI C++ forbids in-class initialization of non-const static member `%D'", - decl); - else if (pedantic && !INTEGRAL_TYPE_P (type)) - cp_pedwarn ("ANSI C++ forbids initialization of member constant `%D' of non-integral type `%T'", decl, type); - - return 0; -} - -tree -grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) - tree declspecs; - tree declarator; - enum decl_context decl_context; - int initialized; - tree attrlist; -{ - RID_BIT_TYPE specbits; - int nclasses = 0; - tree spec; - tree type = NULL_TREE; - int longlong = 0; - int constp; - int restrictp; - int volatilep; - int type_quals; - int virtualp, explicitp, friendp, inlinep, staticp; - int explicit_int = 0; - int explicit_char = 0; - int defaulted_int = 0; - int opaque_typedef = 0; - tree typedef_decl = NULL_TREE; - char *name; - tree typedef_type = NULL_TREE; - int funcdef_flag = 0; - enum tree_code innermost_code = ERROR_MARK; - int bitfield = 0; -#if 0 - /* See the code below that used this. */ - tree decl_machine_attr = NULL_TREE; -#endif - /* Set this to error_mark_node for FIELD_DECLs we could not handle properly. - All FIELD_DECLs we build here have `init' put into their DECL_INITIAL. */ - tree init = NULL_TREE; - - /* Keep track of what sort of function is being processed - so that we can warn about default return values, or explicit - return values which do not match prescribed defaults. */ - enum return_types return_type = return_normal; - - tree dname = NULL_TREE; - tree ctype = current_class_type; - tree ctor_return_type = NULL_TREE; - enum overload_flags flags = NO_SPECIAL; - tree quals = NULL_TREE; - tree raises = NULL_TREE; - int template_count = 0; - tree in_namespace = NULL_TREE; - tree inner_attrs; - int ignore_attrs; - - RIDBIT_RESET_ALL (specbits); - if (decl_context == FUNCDEF) - funcdef_flag = 1, decl_context = NORMAL; - else if (decl_context == MEMFUNCDEF) - funcdef_flag = -1, decl_context = FIELD; - else if (decl_context == BITFIELD) - bitfield = 1, decl_context = FIELD; - - /* Look inside a declarator for the name being declared - and get it as a string, for an error message. */ - { - tree *next = &declarator; - register tree decl; - name = NULL; - - while (next && *next) - { - decl = *next; - switch (TREE_CODE (decl)) - { - case TREE_LIST: - /* For attributes. */ - next = &TREE_VALUE (decl); - break; - - case COND_EXPR: - ctype = NULL_TREE; - next = &TREE_OPERAND (decl, 0); - break; - - case BIT_NOT_EXPR: /* For C++ destructors! */ - { - tree name = TREE_OPERAND (decl, 0); - tree rename = NULL_TREE; - - my_friendly_assert (flags == NO_SPECIAL, 152); - flags = DTOR_FLAG; - return_type = return_dtor; - if (TREE_CODE (name) == TYPE_DECL) - TREE_OPERAND (decl, 0) = name = constructor_name (name); - my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 153); - if (ctype == NULL_TREE) - { - if (current_class_type == NULL_TREE) - { - error ("destructors must be member functions"); - flags = NO_SPECIAL; - } - else - { - tree t = constructor_name (current_class_name); - if (t != name) - rename = t; - } - } - else - { - tree t = constructor_name (ctype); - if (t != name) - rename = t; - } - - if (rename) - { - cp_error ("destructor `%T' must match class name `%T'", - name, rename); - TREE_OPERAND (decl, 0) = rename; - } - next = &name; - } - break; - - case ADDR_EXPR: /* C++ reference declaration */ - /* Fall through. */ - case ARRAY_REF: - case INDIRECT_REF: - ctype = NULL_TREE; - innermost_code = TREE_CODE (decl); - next = &TREE_OPERAND (decl, 0); - break; - - case CALL_EXPR: - if (parmlist_is_exprlist (TREE_OPERAND (decl, 1))) - { - /* This is actually a variable declaration using - constructor syntax. We need to call start_decl and - cp_finish_decl so we can get the variable - initialized... */ - - tree attributes, prefix_attributes; - - *next = TREE_OPERAND (decl, 0); - init = TREE_OPERAND (decl, 1); - - if (attrlist) - { - attributes = TREE_PURPOSE (attrlist); - prefix_attributes = TREE_VALUE (attrlist); - } - else - { - attributes = NULL_TREE; - prefix_attributes = NULL_TREE; - } - - decl = start_decl (declarator, declspecs, 1, - attributes, prefix_attributes); - if (decl) - { - /* Look for __unused__ attribute */ - if (TREE_USED (TREE_TYPE (decl))) - TREE_USED (decl) = 1; - finish_decl (decl, init, NULL_TREE); - } - else - cp_error ("invalid declarator"); - return 0; - } - innermost_code = TREE_CODE (decl); - if (decl_context == FIELD && ctype == NULL_TREE) - ctype = current_class_type; - if (ctype - && TREE_OPERAND (decl, 0) - && (TREE_CODE (TREE_OPERAND (decl, 0)) == TYPE_DECL - && ((DECL_NAME (TREE_OPERAND (decl, 0)) - == constructor_name_full (ctype)) - || (DECL_NAME (TREE_OPERAND (decl, 0)) - == constructor_name (ctype))))) - TREE_OPERAND (decl, 0) = constructor_name (ctype); - next = &TREE_OPERAND (decl, 0); - decl = *next; - if (ctype != NULL_TREE - && decl != NULL_TREE && flags != DTOR_FLAG - && decl == constructor_name (ctype)) - { - return_type = return_ctor; - ctor_return_type = ctype; - } - ctype = NULL_TREE; - break; - - case TEMPLATE_ID_EXPR: - { - tree fns = TREE_OPERAND (decl, 0); - - if (TREE_CODE (fns) == LOOKUP_EXPR) - fns = TREE_OPERAND (fns, 0); - - if (TREE_CODE (fns) == IDENTIFIER_NODE) - dname = fns; - else if (is_overloaded_fn (fns)) - dname = DECL_NAME (get_first_fn (fns)); - else - my_friendly_abort (0); - } - /* Fall through. */ - - case IDENTIFIER_NODE: - if (TREE_CODE (decl) == IDENTIFIER_NODE) - dname = decl; - - next = 0; - - if (is_rid (dname)) - { - cp_error ("declarator-id missing; using reserved word `%D'", - dname); - name = IDENTIFIER_POINTER (dname); - } - if (! IDENTIFIER_OPNAME_P (dname) - /* GNU/Linux headers use '__op'. Arrgh. */ - || (IDENTIFIER_TYPENAME_P (dname) && ! TREE_TYPE (dname))) - name = IDENTIFIER_POINTER (dname); - else - { - if (IDENTIFIER_TYPENAME_P (dname)) - { - my_friendly_assert (flags == NO_SPECIAL, 154); - flags = TYPENAME_FLAG; - ctor_return_type = TREE_TYPE (dname); - return_type = return_conversion; - } - name = operator_name_string (dname); - } - break; - - /* C++ extension */ - case SCOPE_REF: - { - /* Perform error checking, and decide on a ctype. */ - tree cname = TREE_OPERAND (decl, 0); - if (cname == NULL_TREE) - ctype = NULL_TREE; - else if (TREE_CODE (cname) == NAMESPACE_DECL) - { - ctype = NULL_TREE; - in_namespace = TREE_OPERAND (decl, 0); - TREE_OPERAND (decl, 0) = NULL_TREE; - } - else if (! is_aggr_type (cname, 1)) - TREE_OPERAND (decl, 0) = NULL_TREE; - /* Must test TREE_OPERAND (decl, 1), in case user gives - us `typedef (class::memfunc)(int); memfunc *memfuncptr;' */ - else if (TREE_OPERAND (decl, 1) - && TREE_CODE (TREE_OPERAND (decl, 1)) == INDIRECT_REF) - ctype = cname; - else if (TREE_CODE (cname) == TEMPLATE_TYPE_PARM - || TREE_CODE (cname) == TEMPLATE_TEMPLATE_PARM) - { - cp_error ("`%T::%D' is not a valid declarator", cname, - TREE_OPERAND (decl, 1)); - cp_error (" perhaps you want `typename %T::%D' to make it a type", - cname, TREE_OPERAND (decl, 1)); - return void_type_node; - } - else if (ctype == NULL_TREE) - ctype = cname; - else if (TREE_COMPLEXITY (decl) == current_class_depth) - TREE_OPERAND (decl, 0) = ctype; - else - { - if (! UNIQUELY_DERIVED_FROM_P (cname, ctype)) - { - cp_error ("type `%T' is not derived from type `%T'", - cname, ctype); - TREE_OPERAND (decl, 0) = NULL_TREE; - } - else - ctype = cname; - } - - if (ctype && TREE_CODE (TREE_OPERAND (decl, 1)) == TYPE_DECL - && ((DECL_NAME (TREE_OPERAND (decl, 1)) - == constructor_name_full (ctype)) - || (DECL_NAME (TREE_OPERAND (decl, 1)) - == constructor_name (ctype)))) - TREE_OPERAND (decl, 1) = constructor_name (ctype); - next = &TREE_OPERAND (decl, 1); - decl = *next; - if (ctype) - { - if (TREE_CODE (decl) == IDENTIFIER_NODE - && constructor_name (ctype) == decl) - { - return_type = return_ctor; - ctor_return_type = ctype; - } - else if (TREE_CODE (decl) == BIT_NOT_EXPR - && TREE_CODE (TREE_OPERAND (decl, 0)) == IDENTIFIER_NODE - && (constructor_name (ctype) == TREE_OPERAND (decl, 0) - || constructor_name_full (ctype) == TREE_OPERAND (decl, 0))) - { - return_type = return_dtor; - ctor_return_type = ctype; - flags = DTOR_FLAG; - TREE_OPERAND (decl, 0) = constructor_name (ctype); - next = &TREE_OPERAND (decl, 0); - } - } - } - break; - - case ERROR_MARK: - next = 0; - break; - - case TYPE_DECL: - /* Parse error puts this typespec where - a declarator should go. */ - cp_error ("`%T' specified as declarator-id", DECL_NAME (decl)); - if (TREE_TYPE (decl) == current_class_type) - cp_error (" perhaps you want `%T' for a constructor", - current_class_name); - dname = DECL_NAME (decl); - name = IDENTIFIER_POINTER (dname); - - /* Avoid giving two errors for this. */ - IDENTIFIER_CLASS_VALUE (dname) = NULL_TREE; - - declspecs = temp_tree_cons (NULL_TREE, integer_type_node, - declspecs); - *next = dname; - next = 0; - break; - - default: - cp_compiler_error ("`%D' as declarator", decl); - return 0; /* We used to do a 155 abort here. */ - } - } - if (name == NULL) - name = "type name"; - } - - /* A function definition's declarator must have the form of - a function declarator. */ - - if (funcdef_flag && innermost_code != CALL_EXPR) - return 0; - - if (((dname && IDENTIFIER_OPNAME_P (dname)) || flags == TYPENAME_FLAG) - && innermost_code != CALL_EXPR - && ! (ctype && declspecs == NULL_TREE)) - { - cp_error ("declaration of `%D' as non-function", dname); - return void_type_node; - } - - /* Anything declared one level down from the top level - must be one of the parameters of a function - (because the body is at least two levels down). */ - - /* This heuristic cannot be applied to C++ nodes! Fixed, however, - by not allowing C++ class definitions to specify their parameters - with xdecls (must be spec.d in the parmlist). - - Since we now wait to push a class scope until we are sure that - we are in a legitimate method context, we must set oldcname - explicitly (since current_class_name is not yet alive). - - We also want to avoid calling this a PARM if it is in a namespace. */ - - if (decl_context == NORMAL && ! namespace_bindings_p () - && ! pseudo_global_level_p ()) - { - struct binding_level *b = current_binding_level; - current_binding_level = b->level_chain; - if (current_binding_level != 0 && toplevel_bindings_p ()) - decl_context = PARM; - current_binding_level = b; - } - - /* Look through the decl specs and record which ones appear. - Some typespecs are defined as built-in typenames. - Others, the ones that are modifiers of other types, - are represented by bits in SPECBITS: set the bits for - the modifiers that appear. Storage class keywords are also in SPECBITS. - - If there is a typedef name or a type, store the type in TYPE. - This includes builtin typedefs such as `int'. - - Set EXPLICIT_INT if the type is `int' or `char' and did not - come from a user typedef. - - Set LONGLONG if `long' is mentioned twice. - - For C++, constructors and destructors have their own fast treatment. */ - - for (spec = declspecs; spec; spec = TREE_CHAIN (spec)) - { - register int i; - register tree id; - - /* Certain parse errors slip through. For example, - `int class;' is not caught by the parser. Try - weakly to recover here. */ - if (TREE_CODE (spec) != TREE_LIST) - return 0; - - id = TREE_VALUE (spec); - - if (TREE_CODE (id) == IDENTIFIER_NODE) - { - if (id == ridpointers[(int) RID_INT] - || id == ridpointers[(int) RID_CHAR] - || id == ridpointers[(int) RID_BOOL] - || id == ridpointers[(int) RID_WCHAR]) - { - if (type) - { - if (id == ridpointers[(int) RID_BOOL]) - error ("`bool' is now a keyword"); - else - cp_error ("extraneous `%T' ignored", id); - } - else - { - if (id == ridpointers[(int) RID_INT]) - explicit_int = 1; - else if (id == ridpointers[(int) RID_CHAR]) - explicit_char = 1; - type = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (id)); - } - goto found; - } - /* C++ aggregate types. */ - if (IDENTIFIER_HAS_TYPE_VALUE (id)) - { - if (type) - cp_error ("multiple declarations `%T' and `%T'", type, id); - else - type = IDENTIFIER_TYPE_VALUE (id); - goto found; - } - - for (i = (int) RID_FIRST_MODIFIER; i <= (int) RID_LAST_MODIFIER; i++) - { - if (ridpointers[i] == id) - { - if (i == (int) RID_LONG && RIDBIT_SETP (i, specbits)) - { - if (pedantic && ! in_system_header && warn_long_long) - pedwarn ("ANSI C++ does not support `long long'"); - if (longlong) - error ("`long long long' is too long for GCC"); - else - longlong = 1; - } - else if (RIDBIT_SETP (i, specbits)) - pedwarn ("duplicate `%s'", IDENTIFIER_POINTER (id)); - RIDBIT_SET (i, specbits); - goto found; - } - } - } - /* C++ aggregate types. */ - else if (TREE_CODE (id) == TYPE_DECL || TREE_CODE (id) == TEMPLATE_DECL) - { - if (type) - cp_error ("multiple declarations `%T' and `%T'", type, - TREE_TYPE (id)); - else - { - type = TREE_TYPE (id); - TREE_VALUE (spec) = type; - } - goto found; - } - if (type) - error ("two or more data types in declaration of `%s'", name); - else if (TREE_CODE (id) == IDENTIFIER_NODE) - { - register tree t = lookup_name (id, 1); - if (!t || TREE_CODE (t) != TYPE_DECL) - error ("`%s' fails to be a typedef or built in type", - IDENTIFIER_POINTER (id)); - else - { - type = TREE_TYPE (t); -#if 0 - /* See the code below that used this. */ - decl_machine_attr = DECL_MACHINE_ATTRIBUTES (id); -#endif - typedef_decl = t; - } - } - else if (id != error_mark_node) - /* Can't change CLASS nodes into RECORD nodes here! */ - type = id; - - found: ; - } - - typedef_type = type; - - /* No type at all: default to `int', and set DEFAULTED_INT - because it was not a user-defined typedef. - Except when we have a `typedef' inside a signature, in - which case the type defaults to `unknown type' and is - instantiated when assigning to a signature pointer or ref. */ - - if (type == NULL_TREE - && (RIDBIT_SETP (RID_SIGNED, specbits) - || RIDBIT_SETP (RID_UNSIGNED, specbits) - || RIDBIT_SETP (RID_LONG, specbits) - || RIDBIT_SETP (RID_SHORT, specbits))) - { - /* These imply 'int'. */ - type = integer_type_node; - defaulted_int = 1; - } - - if (type == NULL_TREE) - { - explicit_int = -1; - if (return_type == return_dtor) - type = void_type_node; - else if (return_type == return_ctor) - type = build_pointer_type (ctor_return_type); - else if (return_type == return_conversion) - type = ctor_return_type; - else if (current_class_type - && IS_SIGNATURE (current_class_type) - && RIDBIT_SETP (RID_TYPEDEF, specbits) - && (decl_context == FIELD || decl_context == NORMAL)) - { - explicit_int = 0; - opaque_typedef = 1; - type = copy_node (opaque_type_node); - } - else - { - /* We handle `main' specially here, because 'main () { }' is so - common. With no options, it is allowed. With -Wreturn-type, - it is a warning. It is only an error with -pedantic-errors. */ - int is_main = (funcdef_flag - && MAIN_NAME_P (dname) - && ctype == NULL_TREE - && in_namespace == NULL_TREE - && current_namespace == global_namespace); - - if (in_system_header) - /* Allow it, sigh. */; - else if (pedantic || ! is_main) - cp_pedwarn ("ANSI C++ forbids declaration `%D' with no type", - dname); - else if (warn_return_type) - cp_warning ("ANSI C++ forbids declaration `%D' with no type", - dname); - - type = integer_type_node; - } - } - else if (return_type == return_dtor) - { - error ("return type specification for destructor invalid"); - type = void_type_node; - } - else if (return_type == return_ctor) - { - error ("return type specification for constructor invalid"); - type = build_pointer_type (ctor_return_type); - } - else if (return_type == return_conversion) - { - if (!same_type_p (type, ctor_return_type)) - cp_error ("operator `%T' declared to return `%T'", - ctor_return_type, type); - else - cp_pedwarn ("return type specified for `operator %T'", - ctor_return_type); - - type = ctor_return_type; - } - - ctype = NULL_TREE; - - /* Now process the modifiers that were specified - and check for invalid combinations. */ - - /* Long double is a special combination. */ - - if (RIDBIT_SETP (RID_LONG, specbits) - && TYPE_MAIN_VARIANT (type) == double_type_node) - { - RIDBIT_RESET (RID_LONG, specbits); - type = build_qualified_type (long_double_type_node, - CP_TYPE_QUALS (type)); - } - - /* Check all other uses of type modifiers. */ - - if (RIDBIT_SETP (RID_UNSIGNED, specbits) - || RIDBIT_SETP (RID_SIGNED, specbits) - || RIDBIT_SETP (RID_LONG, specbits) - || RIDBIT_SETP (RID_SHORT, specbits)) - { - int ok = 0; - - if (TREE_CODE (type) == REAL_TYPE) - error ("short, signed or unsigned invalid for `%s'", name); - else if (TREE_CODE (type) != INTEGER_TYPE) - error ("long, short, signed or unsigned invalid for `%s'", name); - else if (RIDBIT_SETP (RID_LONG, specbits) - && RIDBIT_SETP (RID_SHORT, specbits)) - error ("long and short specified together for `%s'", name); - else if ((RIDBIT_SETP (RID_LONG, specbits) - || RIDBIT_SETP (RID_SHORT, specbits)) - && explicit_char) - error ("long or short specified with char for `%s'", name); - else if ((RIDBIT_SETP (RID_LONG, specbits) - || RIDBIT_SETP (RID_SHORT, specbits)) - && TREE_CODE (type) == REAL_TYPE) - error ("long or short specified with floating type for `%s'", name); - else if (RIDBIT_SETP (RID_SIGNED, specbits) - && RIDBIT_SETP (RID_UNSIGNED, specbits)) - error ("signed and unsigned given together for `%s'", name); - else - { - ok = 1; - if (!explicit_int && !defaulted_int && !explicit_char && pedantic) - { - pedwarn ("long, short, signed or unsigned used invalidly for `%s'", - name); - if (flag_pedantic_errors) - ok = 0; - } - } - - /* Discard the type modifiers if they are invalid. */ - if (! ok) - { - RIDBIT_RESET (RID_UNSIGNED, specbits); - RIDBIT_RESET (RID_SIGNED, specbits); - RIDBIT_RESET (RID_LONG, specbits); - RIDBIT_RESET (RID_SHORT, specbits); - longlong = 0; - } - } - - if (RIDBIT_SETP (RID_COMPLEX, specbits) - && TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE) - { - error ("complex invalid for `%s'", name); - RIDBIT_RESET (RID_COMPLEX, specbits); - } - - /* Decide whether an integer type is signed or not. - Optionally treat bitfields as signed by default. */ - if (RIDBIT_SETP (RID_UNSIGNED, specbits) - || (bitfield && ! flag_signed_bitfields - && (explicit_int || defaulted_int || explicit_char - /* A typedef for plain `int' without `signed' - can be controlled just like plain `int'. */ - || ! (typedef_decl != NULL_TREE - && C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl))) - && TREE_CODE (type) != ENUMERAL_TYPE - && RIDBIT_NOTSETP (RID_SIGNED, specbits))) - { - if (longlong) - type = long_long_unsigned_type_node; - else if (RIDBIT_SETP (RID_LONG, specbits)) - type = long_unsigned_type_node; - else if (RIDBIT_SETP (RID_SHORT, specbits)) - type = short_unsigned_type_node; - else if (type == char_type_node) - type = unsigned_char_type_node; - else if (typedef_decl) - type = unsigned_type (type); - else - type = unsigned_type_node; - } - else if (RIDBIT_SETP (RID_SIGNED, specbits) - && type == char_type_node) - type = signed_char_type_node; - else if (longlong) - type = long_long_integer_type_node; - else if (RIDBIT_SETP (RID_LONG, specbits)) - type = long_integer_type_node; - else if (RIDBIT_SETP (RID_SHORT, specbits)) - type = short_integer_type_node; - - if (RIDBIT_SETP (RID_COMPLEX, specbits)) - { - /* If we just have "complex", it is equivalent to - "complex double", but if any modifiers at all are specified it is - the complex form of TYPE. E.g, "complex short" is - "complex short int". */ - - if (defaulted_int && ! longlong - && ! (RIDBIT_SETP (RID_LONG, specbits) - || RIDBIT_SETP (RID_SHORT, specbits) - || RIDBIT_SETP (RID_SIGNED, specbits) - || RIDBIT_SETP (RID_UNSIGNED, specbits))) - type = complex_double_type_node; - else if (type == integer_type_node) - type = complex_integer_type_node; - else if (type == float_type_node) - type = complex_float_type_node; - else if (type == double_type_node) - type = complex_double_type_node; - else if (type == long_double_type_node) - type = complex_long_double_type_node; - else - type = build_complex_type (type); - } - - if (return_type == return_conversion - && (RIDBIT_SETP (RID_CONST, specbits) - || RIDBIT_SETP (RID_VOLATILE, specbits) - || RIDBIT_SETP (RID_RESTRICT, specbits))) - cp_error ("qualifiers are not allowed on declaration of `operator %T'", - ctor_return_type); - - /* Set CONSTP if this declaration is `const', whether by - explicit specification or via a typedef. - Likewise for VOLATILEP. */ - - constp = !! RIDBIT_SETP (RID_CONST, specbits) + CP_TYPE_CONST_P (type); - restrictp = - !! RIDBIT_SETP (RID_RESTRICT, specbits) + CP_TYPE_RESTRICT_P (type); - volatilep = - !! RIDBIT_SETP (RID_VOLATILE, specbits) + CP_TYPE_VOLATILE_P (type); - type_quals = ((constp ? TYPE_QUAL_CONST : 0) - | (restrictp ? TYPE_QUAL_RESTRICT : 0) - | (volatilep ? TYPE_QUAL_VOLATILE : 0)); - type = cp_build_qualified_type (type, type_quals); - staticp = 0; - inlinep = !! RIDBIT_SETP (RID_INLINE, specbits); - virtualp = RIDBIT_SETP (RID_VIRTUAL, specbits); - RIDBIT_RESET (RID_VIRTUAL, specbits); - explicitp = RIDBIT_SETP (RID_EXPLICIT, specbits) != 0; - RIDBIT_RESET (RID_EXPLICIT, specbits); - - if (RIDBIT_SETP (RID_STATIC, specbits)) - staticp = 1 + (decl_context == FIELD); - - if (virtualp && staticp == 2) - { - cp_error ("member `%D' cannot be declared both virtual and static", - dname); - staticp = 0; - } - friendp = RIDBIT_SETP (RID_FRIEND, specbits); - RIDBIT_RESET (RID_FRIEND, specbits); - - /* $7.1.2, Function specifiers */ - if (friendp && explicitp) - error ("only declarations of constructors can be `explicit'"); - - if (RIDBIT_SETP (RID_MUTABLE, specbits)) - { -/* CYGNUS LOCAL Embedded C++ */ - if (flag_embedded_cxx) - pedwarn ("Embedded C++ prohibits use of mutable"); -/* END CYGNUS LOCAL Embedded C++ */ - if (decl_context == PARM) - { - error ("non-member `%s' cannot be declared `mutable'", name); - RIDBIT_RESET (RID_MUTABLE, specbits); - } - else if (friendp || decl_context == TYPENAME) - { - error ("non-object member `%s' cannot be declared `mutable'", name); - RIDBIT_RESET (RID_MUTABLE, specbits); - } - } - - /* Warn if two storage classes are given. Default to `auto'. */ - - if (RIDBIT_ANY_SET (specbits)) - { - if (RIDBIT_SETP (RID_STATIC, specbits)) nclasses++; - if (RIDBIT_SETP (RID_EXTERN, specbits)) nclasses++; - if (decl_context == PARM && nclasses > 0) - error ("storage class specifiers invalid in parameter declarations"); - if (RIDBIT_SETP (RID_TYPEDEF, specbits)) - { - if (decl_context == PARM) - error ("typedef declaration invalid in parameter declaration"); - nclasses++; - } - if (RIDBIT_SETP (RID_AUTO, specbits)) nclasses++; - if (RIDBIT_SETP (RID_REGISTER, specbits)) nclasses++; - } - - /* Give error if `virtual' is used outside of class declaration. */ - if (virtualp - && (current_class_name == NULL_TREE || decl_context != FIELD)) - { - error ("virtual outside class declaration"); - virtualp = 0; - } - if (current_class_name == NULL_TREE && RIDBIT_SETP (RID_MUTABLE, specbits)) - { - error ("only members can be declared mutable"); - RIDBIT_RESET (RID_MUTABLE, specbits); - } - - /* Static anonymous unions are dealt with here. */ - if (staticp && decl_context == TYPENAME - && TREE_CODE (declspecs) == TREE_LIST - && ANON_UNION_TYPE_P (TREE_VALUE (declspecs))) - decl_context = FIELD; - - /* Give error if `const,' `volatile,' `inline,' `friend,' or `virtual' - is used in a signature member function declaration. */ - if (decl_context == FIELD - && IS_SIGNATURE (current_class_type) - && RIDBIT_NOTSETP (RID_TYPEDEF, specbits)) - { - if (type_quals != TYPE_UNQUALIFIED) - { - error ("type qualifiers specified for signature member function `%s'", name); - type_quals = TYPE_UNQUALIFIED; - } - if (inlinep) - { - error ("`inline' specified for signature member function `%s'", name); - /* Later, we'll make signature member functions inline. */ - inlinep = 0; - } - if (friendp) - { - error ("`friend' declaration in signature definition"); - friendp = 0; - } - if (virtualp) - { - error ("`virtual' specified for signature member function `%s'", - name); - /* Later, we'll make signature member functions virtual. */ - virtualp = 0; - } - } - - /* Warn about storage classes that are invalid for certain - kinds of declarations (parameters, typenames, etc.). */ - - if (nclasses > 1) - error ("multiple storage classes in declaration of `%s'", name); - else if (decl_context != NORMAL && nclasses > 0) - { - if ((decl_context == PARM || decl_context == CATCHPARM) - && (RIDBIT_SETP (RID_REGISTER, specbits) - || RIDBIT_SETP (RID_AUTO, specbits))) - ; - else if (RIDBIT_SETP (RID_TYPEDEF, specbits)) - ; - else if (decl_context == FIELD - && ! IS_SIGNATURE (current_class_type) - /* C++ allows static class elements */ - && RIDBIT_SETP (RID_STATIC, specbits)) - /* C++ also allows inlines and signed and unsigned elements, - but in those cases we don't come in here. */ - ; - else - { - if (decl_context == FIELD) - { - tree tmp = NULL_TREE; - register int op = 0; - - if (declarator) - { - /* Avoid trying to get an operand off an identifier node. */ - if (TREE_CODE (declarator) == IDENTIFIER_NODE) - tmp = declarator; - else - tmp = TREE_OPERAND (declarator, 0); - op = IDENTIFIER_OPNAME_P (tmp); - } - error ("storage class specified for %s `%s'", - IS_SIGNATURE (current_class_type) - ? (op - ? "signature member operator" - : "signature member function") - : (op ? "member operator" : "field"), - op ? operator_name_string (tmp) : name); - } - else - error (((decl_context == PARM || decl_context == CATCHPARM) - ? "storage class specified for parameter `%s'" - : "storage class specified for typename"), name); - RIDBIT_RESET (RID_REGISTER, specbits); - RIDBIT_RESET (RID_AUTO, specbits); - RIDBIT_RESET (RID_EXTERN, specbits); - - if (decl_context == FIELD && IS_SIGNATURE (current_class_type)) - { - RIDBIT_RESET (RID_STATIC, specbits); - staticp = 0; - } - } - } - else if (RIDBIT_SETP (RID_EXTERN, specbits) && initialized && !funcdef_flag) - { - if (toplevel_bindings_p ()) - { - /* It's common practice (and completely valid) to have a const - be initialized and declared extern. */ - if (!(type_quals & TYPE_QUAL_CONST)) - warning ("`%s' initialized and declared `extern'", name); - } - else - error ("`%s' has both `extern' and initializer", name); - } - else if (RIDBIT_SETP (RID_EXTERN, specbits) && funcdef_flag - && ! toplevel_bindings_p ()) - error ("nested function `%s' declared `extern'", name); - else if (toplevel_bindings_p ()) - { - if (RIDBIT_SETP (RID_AUTO, specbits)) - error ("top-level declaration of `%s' specifies `auto'", name); - } - - if (nclasses > 0 && friendp) - error ("storage class specifiers invalid in friend function declarations"); - - /* Now figure out the structure of the declarator proper. - Descend through it, creating more complex types, until we reach - the declared identifier (or NULL_TREE, in an absolute declarator). */ - - inner_attrs = NULL_TREE; - ignore_attrs = 0; - - while (declarator && TREE_CODE (declarator) != IDENTIFIER_NODE - && TREE_CODE (declarator) != TEMPLATE_ID_EXPR) - { - /* Each level of DECLARATOR is either an ARRAY_REF (for ...[..]), - an INDIRECT_REF (for *...), - a CALL_EXPR (for ...(...)), - an identifier (for the name being declared) - or a null pointer (for the place in an absolute declarator - where the name was omitted). - For the last two cases, we have just exited the loop. - - For C++ it could also be - a SCOPE_REF (for class :: ...). In this case, we have converted - sensible names to types, and those are the values we use to - qualify the member name. - an ADDR_EXPR (for &...), - a BIT_NOT_EXPR (for destructors) - - At this point, TYPE is the type of elements of an array, - or for a function to return, or for a pointer to point to. - After this sequence of ifs, TYPE is the type of the - array or function or pointer, and DECLARATOR has had its - outermost layer removed. */ - - if (type == error_mark_node) - { - if (TREE_CODE (declarator) == SCOPE_REF) - declarator = TREE_OPERAND (declarator, 1); - else - declarator = TREE_OPERAND (declarator, 0); - continue; - } - if (quals != NULL_TREE - && (declarator == NULL_TREE - || TREE_CODE (declarator) != SCOPE_REF)) - { - if (ctype == NULL_TREE && TREE_CODE (type) == METHOD_TYPE) - ctype = TYPE_METHOD_BASETYPE (type); - if (ctype != NULL_TREE) - { - tree dummy = build_decl (TYPE_DECL, NULL_TREE, type); - ctype = grok_method_quals (ctype, dummy, quals); - type = TREE_TYPE (dummy); - quals = NULL_TREE; - } - } - - /* See the comment for the TREE_LIST case, below. */ - if (ignore_attrs) - ignore_attrs = 0; - else if (inner_attrs) - { - decl_attributes (type, inner_attrs, NULL_TREE); - inner_attrs = NULL_TREE; - } - - switch (TREE_CODE (declarator)) - { - case TREE_LIST: - { - /* We encode a declarator with embedded attributes using - a TREE_LIST. The attributes apply to the declarator - directly inside them, so we have to skip an iteration - before applying them to the type. If the declarator just - inside is the declarator-id, we apply the attrs to the - decl itself. */ - inner_attrs = TREE_PURPOSE (declarator); - ignore_attrs = 1; - declarator = TREE_VALUE (declarator); - } - break; - - case ARRAY_REF: - { - register tree itype = NULL_TREE; - register tree size = TREE_OPERAND (declarator, 1); - /* The index is a signed object `sizetype' bits wide. */ - tree index_type = signed_type (sizetype); - - declarator = TREE_OPERAND (declarator, 0); - - /* Check for some types that there cannot be arrays of. */ - - if (TREE_CODE (type) == VOID_TYPE) - { - cp_error ("declaration of `%D' as array of voids", dname); - type = error_mark_node; - } - - if (TREE_CODE (type) == FUNCTION_TYPE) - { - cp_error ("declaration of `%D' as array of functions", dname); - type = error_mark_node; - } - - /* ARM $8.4.3: Since you can't have a pointer to a reference, - you can't have arrays of references. If we allowed them, - then we'd be saying x[i] is valid for an array x, but - then you'd have to ask: what does `*(x + i)' mean? */ - if (TREE_CODE (type) == REFERENCE_TYPE) - { - if (decl_context == TYPENAME) - cp_error ("cannot make arrays of references"); - else - cp_error ("declaration of `%D' as array of references", - dname); - type = error_mark_node; - } - - if (TREE_CODE (type) == OFFSET_TYPE) - { - cp_error ("declaration of `%D' as array of data members", - dname); - type = error_mark_node; - } - - if (TREE_CODE (type) == METHOD_TYPE) - { - cp_error ("declaration of `%D' as array of function members", - dname); - type = error_mark_node; - } - - if (size == error_mark_node) - type = error_mark_node; - else if (TREE_CODE (type) == ARRAY_TYPE && !TYPE_DOMAIN (type)) - { - /* [dcl.array] - - the constant expressions that specify the bounds of - the arrays can be omitted only for the first member - of the sequence. */ - cp_error ("declaration of `%D' as multidimensional array", - dname); - cp_error ("must have bounds for all dimensions except the first"); - type = error_mark_node; - } - - if (type == error_mark_node) - continue; - - if (size) - { - /* Must suspend_momentary here because the index - type may need to live until the end of the function. - For example, it is used in the declaration of a - variable which requires destructing at the end of - the function; then build_vec_delete will need this - value. */ - int yes = suspend_momentary (); - /* Might be a cast. */ - if (TREE_CODE (size) == NOP_EXPR - && TREE_TYPE (size) == TREE_TYPE (TREE_OPERAND (size, 0))) - size = TREE_OPERAND (size, 0); - - /* If this involves a template parameter, it will be a - constant at instantiation time, but we don't know - what the value is yet. Even if no template - parameters are involved, we may an expression that - is not a constant; we don't even simplify `1 + 2' - when processing a template. */ - if (processing_template_decl) - { - /* Resolve a qualified reference to an enumerator or - static const data member of ours. */ - if (TREE_CODE (size) == SCOPE_REF - && TREE_OPERAND (size, 0) == current_class_type) - { - tree t = lookup_field (current_class_type, - TREE_OPERAND (size, 1), 0, 0); - if (t) - size = t; - } - - itype = make_node (INTEGER_TYPE); - TYPE_MIN_VALUE (itype) = size_zero_node; - TYPE_MAX_VALUE (itype) = build_min - (MINUS_EXPR, sizetype, size, integer_one_node); - goto dont_grok_size; - } - - if (TREE_CODE (TREE_TYPE (size)) != INTEGER_TYPE - && TREE_CODE (TREE_TYPE (size)) != ENUMERAL_TYPE - && TREE_CODE (TREE_TYPE (size)) != BOOLEAN_TYPE) - { - cp_error ("size of array `%D' has non-integer type", - dname); - size = integer_one_node; - } - if (TREE_READONLY_DECL_P (size)) - size = decl_constant_value (size); - if (pedantic && integer_zerop (size)) - cp_pedwarn ("ANSI C++ forbids zero-size array `%D'", dname); - if (TREE_CONSTANT (size)) - { - int old_flag_pedantic_errors = flag_pedantic_errors; - int old_pedantic = pedantic; - pedantic = flag_pedantic_errors = 1; - /* Always give overflow errors on array subscripts. */ - constant_expression_warning (size); - pedantic = old_pedantic; - flag_pedantic_errors = old_flag_pedantic_errors; - if (INT_CST_LT (size, integer_zero_node)) - { - cp_error ("size of array `%D' is negative", dname); - size = integer_one_node; - } - } - else - { - if (pedantic) - { - if (dname) - cp_pedwarn ("ANSI C++ forbids variable-size array `%D'", - dname); - else - cp_pedwarn ("ANSI C++ forbids variable-size array"); - } - } - - itype - = fold (build_binary_op (MINUS_EXPR, - cp_convert (index_type, size), - cp_convert (index_type, - integer_one_node), 1)); - if (! TREE_CONSTANT (itype)) - itype = variable_size (itype); - else if (TREE_OVERFLOW (itype)) - { - error ("overflow in array dimension"); - TREE_OVERFLOW (itype) = 0; - } - - /* If we're a parm, we need to have a permanent type so - mangling checks for re-use will work right. If both the - element and index types are permanent, the array type - will be, too. */ - if (decl_context == PARM - && allocation_temporary_p () && TREE_PERMANENT (type)) - { - push_obstacks (&permanent_obstack, &permanent_obstack); - itype = build_index_type (itype); - pop_obstacks (); - } - else - itype = build_index_type (itype); - - dont_grok_size: - resume_momentary (yes); - } - - type = build_cplus_array_type (type, itype); - ctype = NULL_TREE; - } - break; - - case CALL_EXPR: - { - tree arg_types; - int funcdecl_p; - tree inner_parms = TREE_OPERAND (declarator, 1); - tree inner_decl = TREE_OPERAND (declarator, 0); - - /* Declaring a function type. - Make sure we have a valid type for the function to return. */ - - /* We now know that the TYPE_QUALS don't apply to the - decl, but to its return type. */ - type_quals = TYPE_UNQUALIFIED; - - /* Warn about some types functions can't return. */ - - if (TREE_CODE (type) == FUNCTION_TYPE) - { - error ("`%s' declared as function returning a function", name); - type = integer_type_node; - } - if (TREE_CODE (type) == ARRAY_TYPE) - { - error ("`%s' declared as function returning an array", name); - type = integer_type_node; - } - - if (inner_decl && TREE_CODE (inner_decl) == SCOPE_REF) - inner_decl = TREE_OPERAND (inner_decl, 1); - - if (inner_decl && TREE_CODE (inner_decl) == TEMPLATE_ID_EXPR) - inner_decl = dname; - - /* Pick up type qualifiers which should be applied to `this'. */ - quals = TREE_OPERAND (declarator, 2); - - /* Pick up the exception specifications. */ - raises = TREE_TYPE (declarator); - - /* Say it's a definition only for the CALL_EXPR - closest to the identifier. */ - funcdecl_p - = inner_decl - && (TREE_CODE (inner_decl) == IDENTIFIER_NODE - || TREE_CODE (inner_decl) == TEMPLATE_ID_EXPR - || TREE_CODE (inner_decl) == BIT_NOT_EXPR); - - if (ctype == NULL_TREE - && decl_context == FIELD - && funcdecl_p - && (friendp == 0 || dname == current_class_name)) - ctype = current_class_type; - - if (ctype && return_type == return_conversion) - TYPE_HAS_CONVERSION (ctype) = 1; - if (ctype && constructor_name (ctype) == dname) - { - /* We are within a class's scope. If our declarator name - is the same as the class name, and we are defining - a function, then it is a constructor/destructor, and - therefore returns a void type. */ - - if (flags == DTOR_FLAG) - { - /* ANSI C++ June 5 1992 WP 12.4.1. A destructor may - not be declared const or volatile. A destructor - may not be static. */ - if (staticp == 2) - error ("destructor cannot be static member function"); - if (quals) - { - cp_error ("destructors may not be `%s'", - IDENTIFIER_POINTER (TREE_VALUE (quals))); - quals = NULL_TREE; - } - if (decl_context == FIELD) - { - if (! member_function_or_else (ctype, current_class_type, - "destructor for alien class `%s' cannot be a member")) - return void_type_node; - } - } - else /* It's a constructor. */ - { - if (explicitp == 1) - explicitp = 2; - /* ANSI C++ June 5 1992 WP 12.1.2. A constructor may - not be declared const or volatile. A constructor may - not be virtual. A constructor may not be static. */ - if (staticp == 2) - error ("constructor cannot be static member function"); - if (virtualp) - { - pedwarn ("constructors cannot be declared virtual"); - virtualp = 0; - } - if (quals) - { - cp_error ("constructors may not be `%s'", - IDENTIFIER_POINTER (TREE_VALUE (quals))); - quals = NULL_TREE; - } - { - RID_BIT_TYPE tmp_bits; - bcopy ((void*)&specbits, (void*)&tmp_bits, sizeof (RID_BIT_TYPE)); - RIDBIT_RESET (RID_INLINE, tmp_bits); - RIDBIT_RESET (RID_STATIC, tmp_bits); - if (RIDBIT_ANY_SET (tmp_bits)) - error ("return value type specifier for constructor ignored"); - } - type = build_pointer_type (ctype); - if (decl_context == FIELD - && IS_SIGNATURE (current_class_type)) - { - error ("constructor not allowed in signature"); - return void_type_node; - } - else if (decl_context == FIELD) - { - if (! member_function_or_else (ctype, current_class_type, - "constructor for alien class `%s' cannot be member")) - return void_type_node; - TYPE_HAS_CONSTRUCTOR (ctype) = 1; - if (return_type != return_ctor) - return NULL_TREE; - } - } - if (decl_context == FIELD) - staticp = 0; - } - else if (friendp) - { - if (initialized) - error ("can't initialize friend function `%s'", name); - if (virtualp) - { - /* Cannot be both friend and virtual. */ - error ("virtual functions cannot be friends"); - RIDBIT_RESET (RID_FRIEND, specbits); - friendp = 0; - } - if (decl_context == NORMAL) - error ("friend declaration not in class definition"); - if (current_function_decl && funcdef_flag) - cp_error ("can't define friend function `%s' in a local class definition", - name); - } - - /* Construct the function type and go to the next - inner layer of declarator. */ - - declarator = TREE_OPERAND (declarator, 0); - - /* FIXME: This is where default args should be fully - processed. */ - - arg_types = grokparms (inner_parms, funcdecl_p ? funcdef_flag : 0); - - if (declarator && flags == DTOR_FLAG) - { - /* A destructor declared in the body of a class will - be represented as a BIT_NOT_EXPR. But, we just - want the underlying IDENTIFIER. */ - if (TREE_CODE (declarator) == BIT_NOT_EXPR) - declarator = TREE_OPERAND (declarator, 0); - - if (strict_prototype == 0 && arg_types == NULL_TREE) - arg_types = void_list_node; - else if (arg_types == NULL_TREE - || arg_types != void_list_node) - { - cp_error ("destructors may not have parameters"); - arg_types = void_list_node; - last_function_parms = NULL_TREE; - } - } - - /* ANSI says that `const int foo ();' - does not make the function foo const. */ - type = build_function_type (type, arg_types); - - { - tree t; - for (t = arg_types; t; t = TREE_CHAIN (t)) - if (TREE_PURPOSE (t) - && TREE_CODE (TREE_PURPOSE (t)) == DEFAULT_ARG) - { - add_defarg_fn (type); - break; - } - } - } - break; - - case ADDR_EXPR: - case INDIRECT_REF: - /* Filter out pointers-to-references and references-to-references. - We can get these if a TYPE_DECL is used. */ - - if (TREE_CODE (type) == REFERENCE_TYPE) - { - error ("cannot declare %s to references", - TREE_CODE (declarator) == ADDR_EXPR - ? "references" : "pointers"); - declarator = TREE_OPERAND (declarator, 0); - continue; - } - - if (TREE_CODE (type) == OFFSET_TYPE - && (TREE_CODE (TREE_TYPE (type)) == VOID_TYPE - || TREE_CODE (TREE_TYPE (type)) == REFERENCE_TYPE)) - { - cp_error ("cannot declare pointer to `%#T' member", - TREE_TYPE (type)); - type = TREE_TYPE (type); - } - - /* Merge any constancy or volatility into the target type - for the pointer. */ - - /* We now know that the TYPE_QUALS don't apply to the decl, - but to the target of the pointer. */ - type_quals = TYPE_UNQUALIFIED; - - if (IS_SIGNATURE (type)) - { - if (TREE_CODE (declarator) == ADDR_EXPR) - { - if (CLASSTYPE_METHOD_VEC (type) == NULL_TREE - && TYPE_SIZE (type)) - cp_warning ("empty signature `%T' used in signature reference declaration", - type); -#if 0 - type = build_signature_reference_type (type); -#else - sorry ("signature reference"); - return NULL_TREE; -#endif - } - else - { - if (CLASSTYPE_METHOD_VEC (type) == NULL_TREE - && TYPE_SIZE (type)) - cp_warning ("empty signature `%T' used in signature pointer declaration", - type); - type = build_signature_pointer_type (type); - } - } - else if (TREE_CODE (declarator) == ADDR_EXPR) - { - if (TREE_CODE (type) == VOID_TYPE) - error ("invalid type: `void &'"); - else - type = build_reference_type (type); - } - else if (TREE_CODE (type) == METHOD_TYPE) - type = build_ptrmemfunc_type (build_pointer_type (type)); - else - type = build_pointer_type (type); - - /* Process a list of type modifier keywords (such as - const or volatile) that were given inside the `*' or `&'. */ - - if (TREE_TYPE (declarator)) - { - register tree typemodlist; - int erred = 0; - - constp = 0; - volatilep = 0; - restrictp = 0; - for (typemodlist = TREE_TYPE (declarator); typemodlist; - typemodlist = TREE_CHAIN (typemodlist)) - { - tree qualifier = TREE_VALUE (typemodlist); - - if (qualifier == ridpointers[(int) RID_CONST]) - constp++; - else if (qualifier == ridpointers[(int) RID_VOLATILE]) - volatilep++; - else if (qualifier == ridpointers[(int) RID_RESTRICT]) - restrictp++; - else if (!erred) - { - erred = 1; - error ("invalid type modifier within pointer declarator"); - } - } - if (constp > 1) - pedwarn ("duplicate `const'"); - if (volatilep > 1) - pedwarn ("duplicate `volatile'"); - if (restrictp > 1) - pedwarn ("duplicate `restrict'"); - - type_quals = ((constp ? TYPE_QUAL_CONST : 0) - | (restrictp ? TYPE_QUAL_RESTRICT : 0) - | (volatilep ? TYPE_QUAL_VOLATILE : 0)); - if (TREE_CODE (declarator) == ADDR_EXPR - && (constp || volatilep)) - { - if (constp) - pedwarn ("discarding `const' applied to a reference"); - if (volatilep) - pedwarn ("discarding `volatile' applied to a reference"); - type_quals &= ~(TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE); - } - type = cp_build_qualified_type (type, type_quals); - } - declarator = TREE_OPERAND (declarator, 0); - ctype = NULL_TREE; - break; - - case SCOPE_REF: - { - /* We have converted type names to NULL_TREE if the - name was bogus, or to a _TYPE node, if not. - - The variable CTYPE holds the type we will ultimately - resolve to. The code here just needs to build - up appropriate member types. */ - tree sname = TREE_OPERAND (declarator, 1); - tree t; - - /* Destructors can have their visibilities changed as well. */ - if (TREE_CODE (sname) == BIT_NOT_EXPR) - sname = TREE_OPERAND (sname, 0); - - if (TREE_COMPLEXITY (declarator) == 0) - /* This needs to be here, in case we are called - multiple times. */ ; - else if (TREE_COMPLEXITY (declarator) == -1) - /* Namespace member. */ - pop_decl_namespace (); - else if (friendp && (TREE_COMPLEXITY (declarator) < 2)) - /* Don't fall out into global scope. Hides real bug? --eichin */ ; - else if (! IS_AGGR_TYPE_CODE - (TREE_CODE (TREE_OPERAND (declarator, 0)))) - ; - else if (TREE_COMPLEXITY (declarator) == current_class_depth) - { - /* Resolve any TYPENAME_TYPEs from the decl-specifier-seq - that refer to ctype. They couldn't be resolved earlier - because we hadn't pushed into the class yet. - Example: resolve 'B::type' in - 'B::type> B::f () { }'. */ - if (current_template_parms - && uses_template_parms (type) - && uses_template_parms (current_class_type)) - { - tree args = current_template_args (); - type = tsubst (type, args, NULL_TREE); - } - - /* This pop_nested_class corresponds to the - push_nested_class used to push into class scope for - parsing the argument list of a function decl, in - qualified_id. */ - pop_nested_class (1); - TREE_COMPLEXITY (declarator) = current_class_depth; - } - else - my_friendly_abort (16); - - if (TREE_OPERAND (declarator, 0) == NULL_TREE) - { - /* We had a reference to a global decl, or - perhaps we were given a non-aggregate typedef, - in which case we cleared this out, and should just - keep going as though it wasn't there. */ - declarator = sname; - continue; - } - ctype = TREE_OPERAND (declarator, 0); - - t = ctype; - while (t != NULL_TREE && CLASS_TYPE_P (t)) - { - if (CLASSTYPE_TEMPLATE_INFO (t) && - !CLASSTYPE_TEMPLATE_SPECIALIZATION (t)) - template_count += 1; - t = TYPE_MAIN_DECL (t); - if (DECL_LANG_SPECIFIC (t)) - t = DECL_CLASS_CONTEXT (t); - else - t = NULL_TREE; - } - - if (sname == NULL_TREE) - goto done_scoping; - - if (TREE_CODE (sname) == IDENTIFIER_NODE) - { - /* This is the `standard' use of the scoping operator: - basetype :: member . */ - - if (ctype == current_class_type) - { - /* class A { - void A::f (); - }; - - Is this ill-formed? */ - - if (pedantic) - cp_pedwarn ("extra qualification `%T::' on member `%s' ignored", - ctype, name); - } - else if (TREE_CODE (type) == FUNCTION_TYPE) - { - if (current_class_type == NULL_TREE - || friendp) - type = build_cplus_method_type (ctype, TREE_TYPE (type), - TYPE_ARG_TYPES (type)); - else - { - cp_error ("cannot declare member function `%T::%s' within `%T'", - ctype, name, current_class_type); - return void_type_node; - } - } - else if (RIDBIT_SETP (RID_TYPEDEF, specbits) - || TYPE_SIZE (complete_type (ctype)) != NULL_TREE) - { - /* Have to move this code elsewhere in this function. - this code is used for i.e., typedef int A::M; M *pm; - - It is? How? jason 10/2/94 */ - - if (current_class_type) - { - cp_error ("cannot declare member `%T::%s' within `%T'", - ctype, name, current_class_type); - return void_type_node; - } - type = build_offset_type (ctype, type); - } - else if (uses_template_parms (ctype)) - { - if (TREE_CODE (type) == FUNCTION_TYPE) - type - = build_cplus_method_type (ctype, TREE_TYPE (type), - TYPE_ARG_TYPES (type)); - } - else - { - cp_error ("structure `%T' not yet defined", ctype); - return error_mark_node; - } - - declarator = sname; - } - else if (TREE_CODE (sname) == SCOPE_REF) - my_friendly_abort (17); - else - { - done_scoping: - declarator = TREE_OPERAND (declarator, 1); - if (declarator && TREE_CODE (declarator) == CALL_EXPR) - /* In this case, we will deal with it later. */ - ; - else - { - if (TREE_CODE (type) == FUNCTION_TYPE) - type = build_cplus_method_type (ctype, TREE_TYPE (type), - TYPE_ARG_TYPES (type)); - else - type = build_offset_type (ctype, type); - } - } - } - break; - - case BIT_NOT_EXPR: - declarator = TREE_OPERAND (declarator, 0); - break; - - case RECORD_TYPE: - case UNION_TYPE: - case ENUMERAL_TYPE: - declarator = NULL_TREE; - break; - - case ERROR_MARK: - declarator = NULL_TREE; - break; - - default: - my_friendly_abort (158); - } - } - - /* See the comment for the TREE_LIST case, above. */ - if (inner_attrs) - { - if (! ignore_attrs) - decl_attributes (type, inner_attrs, NULL_TREE); - else if (attrlist) - TREE_VALUE (attrlist) = chainon (inner_attrs, TREE_VALUE (attrlist)); - else - attrlist = build_decl_list (NULL_TREE, inner_attrs); - } - - if (explicitp == 1) - { - error ("only constructors can be declared `explicit'"); - explicitp = 0; - } - - /* Now TYPE has the actual type. */ - - /* If this is declaring a typedef name, return a TYPE_DECL. */ - - if (RIDBIT_SETP (RID_MUTABLE, specbits)) - { - if (type_quals & TYPE_QUAL_CONST) - { - error ("const `%s' cannot be declared `mutable'", name); - RIDBIT_RESET (RID_MUTABLE, specbits); - } - else if (staticp) - { - error ("static `%s' cannot be declared `mutable'", name); - RIDBIT_RESET (RID_MUTABLE, specbits); - } - } - - if (RIDBIT_SETP (RID_TYPEDEF, specbits) && decl_context != TYPENAME) - { - tree decl; - - /* Note that the grammar rejects storage classes - in typenames, fields or parameters. */ - if (current_lang_name == lang_name_java) - TYPE_FOR_JAVA (type) = 1; - - if (decl_context == FIELD) - { - if (declarator == constructor_name (current_class_type)) - cp_pedwarn ("ANSI C++ forbids nested type `%D' with same name as enclosing class", - declarator); - decl = build_lang_decl (TYPE_DECL, declarator, type); - if (IS_SIGNATURE (current_class_type) && opaque_typedef) - SIGNATURE_HAS_OPAQUE_TYPEDECLS (current_class_type) = 1; - } - else - { - /* Make sure this typedef lives as long as its type, - since it might be used as a template parameter. */ - if (type != error_mark_node) - push_obstacks (TYPE_OBSTACK (type), TYPE_OBSTACK (type)); - decl = build_decl (TYPE_DECL, declarator, type); - if (type != error_mark_node) - pop_obstacks (); - } - - /* If the user declares "struct {...} foo" then `foo' will have - an anonymous name. Fill that name in now. Nothing can - refer to it, so nothing needs know about the name change. - The TYPE_NAME field was filled in by build_struct_xref. */ - if (type != error_mark_node - && TYPE_NAME (type) - && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL - && ANON_AGGRNAME_P (TYPE_IDENTIFIER (type))) - { - /* FIXME: This is bogus; we should not be doing this for - cv-qualified types. */ - - /* For anonymous structs that are cv-qualified, need to use - TYPE_MAIN_VARIANT so that name will mangle correctly. As - type not referenced after this block, don't bother - resetting type to original type, ie. TREE_TYPE (decl). */ - type = TYPE_MAIN_VARIANT (type); - - /* Replace the anonymous name with the real name everywhere. */ - lookup_tag_reverse (type, declarator); - TYPE_NAME (type) = decl; - - if (TYPE_LANG_SPECIFIC (type)) - TYPE_WAS_ANONYMOUS (type) = 1; - - /* If this is a typedef within a template class, the nested - type is a (non-primary) template. The name for the - template needs updating as well. */ - if (TYPE_LANG_SPECIFIC (type) && CLASSTYPE_TEMPLATE_INFO (type)) - DECL_NAME (CLASSTYPE_TI_TEMPLATE (type)) - = TYPE_IDENTIFIER (type); - - /* XXX Temporarily set the scope. - When returning, start_decl expects it as NULL_TREE, - and will then then set it using pushdecl. */ - my_friendly_assert (DECL_CONTEXT (decl) == NULL_TREE, 980404); - if (current_class_type) - DECL_CONTEXT (decl) = current_class_type; - else - DECL_CONTEXT (decl) = FROB_CONTEXT (current_namespace); - - DECL_ASSEMBLER_NAME (decl) = DECL_NAME (decl); - DECL_ASSEMBLER_NAME (decl) - = get_identifier (build_overload_name (type, 1, 1)); - DECL_CONTEXT (decl) = NULL_TREE; - - /* FIXME remangle member functions; member functions of a - type with external linkage have external linkage. */ - } - - if (TREE_CODE (type) == OFFSET_TYPE || TREE_CODE (type) == METHOD_TYPE) - { - cp_error_at ("typedef name may not be class-qualified", decl); - return NULL_TREE; - } - else if (quals) - { - if (ctype == NULL_TREE) - { - if (TREE_CODE (type) != METHOD_TYPE) - cp_error_at ("invalid type qualifier for non-method type", decl); - else - ctype = TYPE_METHOD_BASETYPE (type); - } - if (ctype != NULL_TREE) - grok_method_quals (ctype, decl, quals); - } - - if (RIDBIT_SETP (RID_SIGNED, specbits) - || (typedef_decl && C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl))) - C_TYPEDEF_EXPLICITLY_SIGNED (decl) = 1; - - if (RIDBIT_SETP (RID_MUTABLE, specbits)) - error ("non-object member `%s' cannot be declared mutable", name); - - bad_specifiers (decl, "type", virtualp, quals != NULL_TREE, - inlinep, friendp, raises != NULL_TREE); - - if (initialized) - error ("typedef declaration includes an initializer"); - - return decl; - } - - /* Detect the case of an array type of unspecified size - which came, as such, direct from a typedef name. - We must copy the type, so that each identifier gets - a distinct type, so that each identifier's size can be - controlled separately by its own initializer. */ - - if (type == typedef_type && TREE_CODE (type) == ARRAY_TYPE - && TYPE_DOMAIN (type) == NULL_TREE) - { - type = build_cplus_array_type (TREE_TYPE (type), TYPE_DOMAIN (type)); - } - - /* If this is a type name (such as, in a cast or sizeof), - compute the type and return it now. */ - - if (decl_context == TYPENAME) - { - /* Note that the grammar rejects storage classes - in typenames, fields or parameters. */ - if (type_quals != TYPE_UNQUALIFIED) - { - if (IS_SIGNATURE (type)) - error ("type qualifiers specified for signature type"); - type_quals = TYPE_UNQUALIFIED; - } - - /* Special case: "friend class foo" looks like a TYPENAME context. */ - if (friendp) - { - if (type_quals != TYPE_UNQUALIFIED) - { - cp_error ("type qualifiers specified for friend class declaration"); - type_quals = TYPE_UNQUALIFIED; - } - if (inlinep) - { - cp_error ("`inline' specified for friend class declaration"); - inlinep = 0; - } - - /* Only try to do this stuff if we didn't already give up. */ - if (type != integer_type_node) - { - /* A friendly class? */ - if (current_class_type) - make_friend_class (current_class_type, TYPE_MAIN_VARIANT (type)); - else - error ("trying to make class `%s' a friend of global scope", - TYPE_NAME_STRING (type)); - type = void_type_node; - } - } - else if (quals) - { - tree dummy = build_decl (TYPE_DECL, declarator, type); - if (ctype == NULL_TREE) - { - my_friendly_assert (TREE_CODE (type) == METHOD_TYPE, 159); - ctype = TYPE_METHOD_BASETYPE (type); - } - grok_method_quals (ctype, dummy, quals); - type = TREE_TYPE (dummy); - } - - return type; - } - else if (declarator == NULL_TREE && decl_context != PARM - && decl_context != CATCHPARM - && TREE_CODE (type) != UNION_TYPE - && ! bitfield) - { - cp_error ("abstract declarator `%T' used as declaration", type); - declarator = make_anon_name (); - } - - /* `void' at top level (not within pointer) - is allowed only in typedefs or type names. - We don't complain about parms either, but that is because - a better error message can be made later. */ - - if (TREE_CODE (type) == VOID_TYPE && decl_context != PARM) - { - if (! declarator) - error ("unnamed variable or field declared void"); - else if (TREE_CODE (declarator) == IDENTIFIER_NODE) - { - if (IDENTIFIER_OPNAME_P (declarator)) - my_friendly_abort (356); - else - error ("variable or field `%s' declared void", name); - } - else - error ("variable or field declared void"); - type = integer_type_node; - } - - /* Now create the decl, which may be a VAR_DECL, a PARM_DECL - or a FUNCTION_DECL, depending on DECL_CONTEXT and TYPE. */ - - if (decl_context == PARM || decl_context == CATCHPARM) - { - if (ctype || in_namespace) - error ("cannot use `::' in parameter declaration"); - - /* A parameter declared as an array of T is really a pointer to T. - One declared as a function is really a pointer to a function. - One declared as a member is really a pointer to member. */ - - if (TREE_CODE (type) == ARRAY_TYPE) - { - /* Transfer const-ness of array into that of type pointed to. */ - type = build_pointer_type (TREE_TYPE (type)); - type_quals = TYPE_UNQUALIFIED; - } - else if (TREE_CODE (type) == FUNCTION_TYPE) - type = build_pointer_type (type); - else if (TREE_CODE (type) == OFFSET_TYPE) - type = build_pointer_type (type); - else if (TREE_CODE (type) == VOID_TYPE && declarator) - { - error ("declaration of `%s' as void", name); - return NULL_TREE; - } - } - - { - register tree decl; - - if (decl_context == PARM) - { - decl = build_decl (PARM_DECL, declarator, type); - - bad_specifiers (decl, "parameter", virtualp, quals != NULL_TREE, - inlinep, friendp, raises != NULL_TREE); - if (current_class_type - && IS_SIGNATURE (current_class_type)) - { - if (inlinep) - error ("parameter of signature member function declared `inline'"); - if (RIDBIT_SETP (RID_AUTO, specbits)) - error ("parameter of signature member function declared `auto'"); - if (RIDBIT_SETP (RID_REGISTER, specbits)) - error ("parameter of signature member function declared `register'"); - } - - /* Compute the type actually passed in the parmlist, - for the case where there is no prototype. - (For example, shorts and chars are passed as ints.) - When there is a prototype, this is overridden later. */ - - DECL_ARG_TYPE (decl) = type_promotes_to (type); - } - else if (decl_context == FIELD) - { - if (type == error_mark_node) - { - /* Happens when declaring arrays of sizes which - are error_mark_node, for example. */ - decl = NULL_TREE; - } - else if (in_namespace && !friendp) - { - /* Something like struct S { int N::j; }; */ - cp_error ("invalid use of `::'"); - decl = NULL_TREE; - } - else if (TREE_CODE (type) == FUNCTION_TYPE) - { - int publicp = 0; - tree function_context; - - /* We catch the others as conflicts with the builtin - typedefs. */ - if (friendp && declarator == ridpointers[(int) RID_SIGNED]) - { - cp_error ("function `%D' cannot be declared friend", - declarator); - friendp = 0; - } - - if (friendp == 0) - { - if (ctype == NULL_TREE) - ctype = current_class_type; - - if (ctype == NULL_TREE) - { - cp_error ("can't make `%D' into a method -- not in a class", - declarator); - return void_type_node; - } - - /* ``A union may [ ... ] not [ have ] virtual functions.'' - ARM 9.5 */ - if (virtualp && TREE_CODE (ctype) == UNION_TYPE) - { - cp_error ("function `%D' declared virtual inside a union", - declarator); - return void_type_node; - } - - if (declarator == ansi_opname[(int) NEW_EXPR] - || declarator == ansi_opname[(int) VEC_NEW_EXPR] - || declarator == ansi_opname[(int) DELETE_EXPR] - || declarator == ansi_opname[(int) VEC_DELETE_EXPR]) - { - if (virtualp) - { - cp_error ("`%D' cannot be declared virtual, since it is always static", - declarator); - virtualp = 0; - } - } - else if (staticp < 2) - type = build_cplus_method_type (ctype, TREE_TYPE (type), - TYPE_ARG_TYPES (type)); - } - - /* Tell grokfndecl if it needs to set TREE_PUBLIC on the node. */ - function_context = (ctype != NULL_TREE) ? - hack_decl_function_context (TYPE_MAIN_DECL (ctype)) : NULL_TREE; - publicp = (! friendp || ! staticp) - && function_context == NULL_TREE; - decl = grokfndecl (ctype, type, - TREE_CODE (declarator) != TEMPLATE_ID_EXPR - ? declarator : dname, - declarator, - virtualp, flags, quals, raises, attrlist, - friendp ? -1 : 0, friendp, publicp, inlinep, - funcdef_flag, template_count, in_namespace); - if (decl == NULL_TREE || decl == error_mark_node) - return decl; -#if 0 - /* This clobbers the attrs stored in `decl' from `attrlist'. */ - /* The decl and setting of decl_machine_attr is also turned off. */ - decl = build_decl_attribute_variant (decl, decl_machine_attr); -#endif - - /* [class.conv.ctor] - - A constructor declared without the function-specifier - explicit that can be called with a single parameter - specifies a conversion from the type of its first - parameter to the type of its class. Such a constructor - is called a converting constructor. */ - if (explicitp == 2) - DECL_NONCONVERTING_P (decl) = 1; - else if (DECL_CONSTRUCTOR_P (decl)) - { - /* The constructor can be called with exactly one - parameter if there is at least one parameter, and - any subsequent parameters have default arguments. - We don't look at the first parameter, which is - really just the `this' parameter for the new - object. */ - tree arg_types = - TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (decl))); - - /* Skip the `in_chrg' argument too, if present. */ - if (TYPE_USES_VIRTUAL_BASECLASSES (DECL_CONTEXT (decl))) - arg_types = TREE_CHAIN (arg_types); - - if (arg_types == void_list_node - || (arg_types - && TREE_CHAIN (arg_types) - && TREE_CHAIN (arg_types) != void_list_node - && !TREE_PURPOSE (TREE_CHAIN (arg_types)))) - DECL_NONCONVERTING_P (decl) = 1; - } - } - else if (TREE_CODE (type) == METHOD_TYPE) - { - /* We only get here for friend declarations of - members of other classes. */ - /* All method decls are public, so tell grokfndecl to set - TREE_PUBLIC, also. */ - decl = grokfndecl (ctype, type, declarator, declarator, - virtualp, flags, quals, raises, attrlist, - friendp ? -1 : 0, friendp, 1, 0, funcdef_flag, - template_count, in_namespace); - if (decl == NULL_TREE) - return NULL_TREE; - } - else if (!staticp && ! processing_template_decl - && TYPE_SIZE (complete_type (type)) == NULL_TREE - && (TREE_CODE (type) != ARRAY_TYPE || initialized == 0)) - { - if (declarator) - cp_error ("field `%D' has incomplete type", declarator); - else - cp_error ("name `%T' has incomplete type", type); - - /* If we're instantiating a template, tell them which - instantiation made the field's type be incomplete. */ - if (current_class_type - && TYPE_NAME (current_class_type) - && IDENTIFIER_TEMPLATE (TYPE_IDENTIFIER (current_class_type)) - && declspecs && TREE_VALUE (declspecs) - && TREE_TYPE (TREE_VALUE (declspecs)) == type) - cp_error (" in instantiation of template `%T'", - current_class_type); - - type = error_mark_node; - decl = NULL_TREE; - } - else - { - if (friendp) - { - error ("`%s' is neither function nor method; cannot be declared friend", - IDENTIFIER_POINTER (declarator)); - friendp = 0; - } - decl = NULL_TREE; - } - - if (friendp) - { - /* Friends are treated specially. */ - if (ctype == current_class_type) - warning ("member functions are implicitly friends of their class"); - else - { - tree t = NULL_TREE; - if (decl && DECL_NAME (decl)) - { - if (template_class_depth (current_class_type) == 0) - { - decl - = check_explicit_specialization - (declarator, decl, - template_count, 2 * (funcdef_flag != 0) + 4); - if (decl == error_mark_node) - return error_mark_node; - } - - t = do_friend (ctype, declarator, decl, - last_function_parms, flags, quals, - funcdef_flag); - } - if (t && funcdef_flag) - return t; - - return void_type_node; - } - } - - /* Structure field. It may not be a function, except for C++ */ - - if (decl == NULL_TREE) - { - if (initialized) - { - if (!staticp) - { - /* An attempt is being made to initialize a non-static - member. But, from [class.mem]: - - 4 A member-declarator can contain a - constant-initializer only if it declares a static - member (_class.static_) of integral or enumeration - type, see _class.static.data_. - - This used to be relatively common practice, but - the rest of the compiler does not correctly - handle the initialization unless the member is - static so we make it static below. */ - cp_pedwarn ("ANSI C++ forbids initialization of member `%D'", - declarator); - cp_pedwarn ("making `%D' static", declarator); - staticp = 1; - } - - if (uses_template_parms (type)) - /* We'll check at instantiation time. */ - ; - else if (check_static_variable_definition (declarator, - type)) - /* If we just return the declaration, crashes - will sometimes occur. We therefore return - void_type_node, as if this was a friend - declaration, to cause callers to completely - ignore this declaration. */ - return void_type_node; - } - - /* 9.2p13 [class.mem] */ - if (declarator == constructor_name (current_class_type) - /* Divergence from the standard: In extern "C", we - allow non-static data members here, because C does - and /usr/include/netinet/in.h uses that. */ - && (staticp || ! in_system_header)) - cp_pedwarn ("ANSI C++ forbids data member `%D' with same name as enclosing class", - declarator); - - if (staticp) - { - /* C++ allows static class members. - All other work for this is done by grokfield. - This VAR_DCL is built by build_lang_field_decl. - All other VAR_DECLs are built by build_decl. */ - decl = build_lang_field_decl (VAR_DECL, declarator, type); - TREE_STATIC (decl) = 1; - /* In class context, 'static' means public access. */ - TREE_PUBLIC (decl) = DECL_EXTERNAL (decl) = 1; - } - else - { - decl = build_lang_field_decl (FIELD_DECL, declarator, type); - if (RIDBIT_SETP (RID_MUTABLE, specbits)) - { - DECL_MUTABLE_P (decl) = 1; - RIDBIT_RESET (RID_MUTABLE, specbits); - } - } - - bad_specifiers (decl, "field", virtualp, quals != NULL_TREE, - inlinep, friendp, raises != NULL_TREE); - } - } - else if (TREE_CODE (type) == FUNCTION_TYPE || TREE_CODE (type) == METHOD_TYPE) - { - tree original_name; - int publicp = 0; - - if (! declarator) - return NULL_TREE; - - if (TREE_CODE (declarator) == TEMPLATE_ID_EXPR) - original_name = dname; - else - original_name = declarator; - - if (RIDBIT_SETP (RID_AUTO, specbits)) - error ("storage class `auto' invalid for function `%s'", name); - else if (RIDBIT_SETP (RID_REGISTER, specbits)) - error ("storage class `register' invalid for function `%s'", name); - - /* Function declaration not at top level. - Storage classes other than `extern' are not allowed - and `extern' makes no difference. */ - if (! toplevel_bindings_p () - && (RIDBIT_SETP (RID_STATIC, specbits) - || RIDBIT_SETP (RID_INLINE, specbits)) - && pedantic) - { - if (RIDBIT_SETP (RID_STATIC, specbits)) - pedwarn ("storage class `static' invalid for function `%s' declared out of global scope", name); - else - pedwarn ("storage class `inline' invalid for function `%s' declared out of global scope", name); - } - - if (ctype == NULL_TREE) - { - if (virtualp) - { - error ("virtual non-class function `%s'", name); - virtualp = 0; - } - } - else if (TREE_CODE (type) == FUNCTION_TYPE && staticp < 2) - type = build_cplus_method_type (ctype, TREE_TYPE (type), - TYPE_ARG_TYPES (type)); - - /* Record presence of `static'. */ - publicp = (ctype != NULL_TREE - || RIDBIT_SETP (RID_EXTERN, specbits) - || !RIDBIT_SETP (RID_STATIC, specbits)); - - decl = grokfndecl (ctype, type, original_name, declarator, - virtualp, flags, quals, raises, attrlist, - 1, friendp, - publicp, inlinep, funcdef_flag, - template_count, in_namespace); - if (decl == NULL_TREE) - return NULL_TREE; - - /* Among other times, could occur from check_explicit_specialization - returning an error_mark_node. */ - if (decl == error_mark_node) - return error_mark_node; - - if (staticp == 1) - { - int illegal_static = 0; - - /* Don't allow a static member function in a class, and forbid - declaring main to be static. */ - if (TREE_CODE (type) == METHOD_TYPE) - { - cp_pedwarn ("cannot declare member function `%D' to have static linkage", decl); - illegal_static = 1; - } - else if (current_function_decl) - { - /* FIXME need arm citation */ - error ("cannot declare static function inside another function"); - illegal_static = 1; - } - - if (illegal_static) - { - staticp = 0; - RIDBIT_RESET (RID_STATIC, specbits); - } - } - } - else - { - /* It's a variable. */ - - /* An uninitialized decl with `extern' is a reference. */ - decl = grokvardecl (type, declarator, &specbits, - initialized, - (type_quals & TYPE_QUAL_CONST) != 0, - in_namespace); - bad_specifiers (decl, "variable", virtualp, quals != NULL_TREE, - inlinep, friendp, raises != NULL_TREE); - - if (ctype) - { - DECL_CONTEXT (decl) = ctype; - if (staticp == 1) - { - cp_pedwarn ("static member `%D' re-declared as static", decl); - staticp = 0; - RIDBIT_RESET (RID_STATIC, specbits); - } - if (RIDBIT_SETP (RID_REGISTER, specbits) && TREE_STATIC (decl)) - { - cp_error ("static member `%D' declared `register'", decl); - RIDBIT_RESET (RID_REGISTER, specbits); - } - if (RIDBIT_SETP (RID_EXTERN, specbits) && pedantic) - { - cp_pedwarn ("cannot explicitly declare member `%#D' to have extern linkage", - decl); - RIDBIT_RESET (RID_EXTERN, specbits); - } - } - } - - if (RIDBIT_SETP (RID_MUTABLE, specbits)) - { - error ("`%s' cannot be declared mutable", name); - } - - /* Record `register' declaration for warnings on & - and in case doing stupid register allocation. */ - - if (RIDBIT_SETP (RID_REGISTER, specbits)) - DECL_REGISTER (decl) = 1; - - if (RIDBIT_SETP (RID_EXTERN, specbits)) - DECL_THIS_EXTERN (decl) = 1; - - if (RIDBIT_SETP (RID_STATIC, specbits)) - DECL_THIS_STATIC (decl) = 1; - - /* Record constancy and volatility. */ - /* FIXME: Disallow `restrict' pointer-to-member declarations. */ - c_apply_type_quals_to_decl (type_quals, decl); - - return decl; - } -} - -/* Tell if a parmlist/exprlist looks like an exprlist or a parmlist. - An empty exprlist is a parmlist. An exprlist which - contains only identifiers at the global level - is a parmlist. Otherwise, it is an exprlist. */ - -int -parmlist_is_exprlist (exprs) - tree exprs; -{ - if (exprs == NULL_TREE || TREE_PARMLIST (exprs)) - return 0; - - if (toplevel_bindings_p ()) - { - /* At the global level, if these are all identifiers, - then it is a parmlist. */ - while (exprs) - { - if (TREE_CODE (TREE_VALUE (exprs)) != IDENTIFIER_NODE) - return 1; - exprs = TREE_CHAIN (exprs); - } - return 0; - } - return 1; -} - -/* Subroutine of start_function. Ensure that each of the parameter - types (as listed in PARMS) is complete, as is required for a - function definition. */ - -static void -require_complete_types_for_parms (parms) - tree parms; -{ - while (parms) - { - tree type = TREE_TYPE (parms); - if (TYPE_SIZE (complete_type (type)) == NULL_TREE) - { - if (DECL_NAME (parms)) - error ("parameter `%s' has incomplete type", - IDENTIFIER_POINTER (DECL_NAME (parms))); - else - error ("parameter has incomplete type"); - TREE_TYPE (parms) = error_mark_node; - } - else - layout_decl (parms, 0); - - parms = TREE_CHAIN (parms); - } -} - -/* Returns DECL if DECL is a local variable (or parameter). Returns - NULL_TREE otherwise. */ - -static tree -local_variable_p (t) - tree t; -{ - if ((TREE_CODE (t) == VAR_DECL - /* A VAR_DECL with a context that is a _TYPE is a static data - member. */ - && !TYPE_P (CP_DECL_CONTEXT (t)) - /* Any other non-local variable must be at namespace scope. */ - && TREE_CODE (CP_DECL_CONTEXT (t)) != NAMESPACE_DECL) - || (TREE_CODE (t) == PARM_DECL)) - return t; - - return NULL_TREE; -} - -/* Check that ARG, which is a default-argument expression for a - parameter DECL, is legal. Returns ARG, or ERROR_MARK_NODE, if - something goes wrong. DECL may also be a _TYPE node, rather than a - DECL, if there is no DECL available. */ - -tree -check_default_argument (decl, arg) - tree decl; - tree arg; -{ - tree var; - tree decl_type; - - if (TREE_CODE (arg) == DEFAULT_ARG) - /* We get a DEFAULT_ARG when looking at an in-class declaration - with a default argument. Ignore the argument for now; we'll - deal with it after the class is complete. */ - return arg; - - if (processing_template_decl || uses_template_parms (arg)) - /* We don't do anything checking until instantiation-time. Note - that there may be uninstantiated arguments even for an - instantiated function, since default arguments are not - instantiated until they are needed. */ - return arg; - - if (TYPE_P (decl)) - { - decl_type = decl; - decl = NULL_TREE; - } - else - decl_type = TREE_TYPE (decl); - - if (arg == error_mark_node - || decl == error_mark_node - || TREE_TYPE (arg) == error_mark_node - || decl_type == error_mark_node) - /* Something already went wrong. There's no need to check - further. */ - return error_mark_node; - - /* [dcl.fct.default] - - A default argument expression is implicitly converted to the - parameter type. */ - if (!TREE_TYPE (arg) - || !can_convert_arg (decl_type, TREE_TYPE (arg), arg)) - { - if (decl) - cp_error ("default argument for `%#D' has type `%T'", - decl, TREE_TYPE (arg)); - else - cp_error ("default argument for paramter of type `%T' has type `%T'", - decl_type, TREE_TYPE (arg)); - - return error_mark_node; - } - - /* [dcl.fct.default] - - Local variables shall not be used in default argument - expressions. - - The keyword `this' shall not be used in a default argument of a - member function. */ - var = search_tree (arg, local_variable_p); - if (var) - { - cp_error ("default argument `%E' uses local variable `%D'", - arg, var); - return error_mark_node; - } - - /* All is well. */ - return arg; -} - -/* Decode the list of parameter types for a function type. - Given the list of things declared inside the parens, - return a list of types. - - The list we receive can have three kinds of elements: - an IDENTIFIER_NODE for names given without types, - a TREE_LIST node for arguments given as typespecs or names with typespecs, - or void_type_node, to mark the end of an argument list - when additional arguments are not permitted (... was not used). - - FUNCDEF_FLAG is nonzero for a function definition, 0 for - a mere declaration. A nonempty identifier-list gets an error message - when FUNCDEF_FLAG is zero. - If FUNCDEF_FLAG is 1, then parameter types must be complete. - If FUNCDEF_FLAG is -1, then parameter types may be incomplete. - - If all elements of the input list contain types, - we return a list of the types. - If all elements contain no type (except perhaps a void_type_node - at the end), we return a null list. - If some have types and some do not, it is an error, and we - return a null list. - - Also set last_function_parms to either - a list of names (IDENTIFIER_NODEs) or a chain of PARM_DECLs. - A list of names is converted to a chain of PARM_DECLs - by store_parm_decls so that ultimately it is always a chain of decls. - - Note that in C++, parameters can take default values. These default - values are in the TREE_PURPOSE field of the TREE_LIST. It is - an error to specify default values which are followed by parameters - that have no default values, or an ELLIPSES. For simplicities sake, - only parameters which are specified with their types can take on - default values. */ - -static tree -grokparms (first_parm, funcdef_flag) - tree first_parm; - int funcdef_flag; -{ - tree result = NULL_TREE; - tree decls = NULL_TREE; - - if (first_parm != NULL_TREE - && TREE_CODE (TREE_VALUE (first_parm)) == IDENTIFIER_NODE) - { - if (! funcdef_flag) - pedwarn ("parameter names (without types) in function declaration"); - last_function_parms = first_parm; - return NULL_TREE; - } - else if (first_parm != NULL_TREE - && TREE_CODE (TREE_VALUE (first_parm)) != TREE_LIST - && TREE_CODE (TREE_VALUE (first_parm)) != VOID_TYPE) - my_friendly_abort (145); - else - { - /* Types were specified. This is a list of declarators - each represented as a TREE_LIST node. */ - register tree parm, chain; - int any_init = 0, any_error = 0; - - if (first_parm != NULL_TREE) - { - tree last_result = NULL_TREE; - tree last_decl = NULL_TREE; - - for (parm = first_parm; parm != NULL_TREE; parm = chain) - { - tree type = NULL_TREE, list_node = parm; - register tree decl = TREE_VALUE (parm); - tree init = TREE_PURPOSE (parm); - - chain = TREE_CHAIN (parm); - /* @@ weak defense against parse errors. */ - if (TREE_CODE (decl) != VOID_TYPE - && TREE_CODE (decl) != TREE_LIST) - { - /* Give various messages as the need arises. */ - if (TREE_CODE (decl) == STRING_CST) - cp_error ("invalid string constant `%E'", decl); - else if (TREE_CODE (decl) == INTEGER_CST) - error ("invalid integer constant in parameter list, did you forget to give parameter name?"); - continue; - } - - if (TREE_CODE (decl) != VOID_TYPE) - { - decl = grokdeclarator (TREE_VALUE (decl), - TREE_PURPOSE (decl), - PARM, init != NULL_TREE, - NULL_TREE); - if (! decl || TREE_TYPE (decl) == error_mark_node) - continue; - - /* Top-level qualifiers on the parameters are - ignored for function types. */ - type = TYPE_MAIN_VARIANT (TREE_TYPE (decl)); - - if (TREE_CODE (type) == VOID_TYPE) - decl = void_type_node; - else if (TREE_CODE (type) == METHOD_TYPE) - { - if (DECL_NAME (decl)) - /* Cannot use the decl here because - we don't have DECL_CONTEXT set up yet. */ - cp_error ("parameter `%D' invalidly declared method type", - DECL_NAME (decl)); - else - error ("parameter invalidly declared method type"); - type = build_pointer_type (type); - TREE_TYPE (decl) = type; - } - else if (TREE_CODE (type) == OFFSET_TYPE) - { - if (DECL_NAME (decl)) - cp_error ("parameter `%D' invalidly declared offset type", - DECL_NAME (decl)); - else - error ("parameter invalidly declared offset type"); - type = build_pointer_type (type); - TREE_TYPE (decl) = type; - } - else if (TREE_CODE (type) == RECORD_TYPE - && TYPE_LANG_SPECIFIC (type) - && CLASSTYPE_ABSTRACT_VIRTUALS (type)) - { - abstract_virtuals_error (decl, type); - any_error = 1; /* Seems like a good idea. */ - } - else if (TREE_CODE (type) == RECORD_TYPE - && TYPE_LANG_SPECIFIC (type) - && IS_SIGNATURE (type)) - { - signature_error (decl, type); - any_error = 1; /* Seems like a good idea. */ - } - else if (POINTER_TYPE_P (type)) - { - tree t = type; - while (POINTER_TYPE_P (t) - || (TREE_CODE (t) == ARRAY_TYPE - && TYPE_DOMAIN (t) != NULL_TREE)) - t = TREE_TYPE (t); - if (TREE_CODE (t) == ARRAY_TYPE) - cp_error ("parameter type `%T' includes %s to array of unknown bound", - type, - TYPE_PTR_P (type) ? "pointer" : "reference"); - } - } - - if (TREE_CODE (decl) == VOID_TYPE) - { - if (result == NULL_TREE) - { - result = void_list_node; - last_result = result; - } - else - { - TREE_CHAIN (last_result) = void_list_node; - last_result = void_list_node; - } - if (chain - && (chain != void_list_node || TREE_CHAIN (chain))) - error ("`void' in parameter list must be entire list"); - break; - } - - /* Since there is a prototype, args are passed in their own types. */ - DECL_ARG_TYPE (decl) = TREE_TYPE (decl); -#ifdef PROMOTE_PROTOTYPES - if ((TREE_CODE (type) == INTEGER_TYPE - || TREE_CODE (type) == ENUMERAL_TYPE) - && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)) - DECL_ARG_TYPE (decl) = integer_type_node; -#endif - if (!any_error && init) - { - any_init++; - init = check_default_argument (decl, init); - } - else - init = NULL_TREE; - - if (decls == NULL_TREE) - { - decls = decl; - last_decl = decls; - } - else - { - TREE_CHAIN (last_decl) = decl; - last_decl = decl; - } - if (! current_function_decl && TREE_PERMANENT (list_node)) - { - TREE_PURPOSE (list_node) = init; - TREE_VALUE (list_node) = type; - TREE_CHAIN (list_node) = NULL_TREE; - } - else - list_node = saveable_tree_cons (init, type, NULL_TREE); - if (result == NULL_TREE) - { - result = list_node; - last_result = result; - } - else - { - TREE_CHAIN (last_result) = list_node; - last_result = list_node; - } - } - if (last_result) - TREE_CHAIN (last_result) = NULL_TREE; - /* If there are no parameters, and the function does not end - with `...', then last_decl will be NULL_TREE. */ - if (last_decl != NULL_TREE) - TREE_CHAIN (last_decl) = NULL_TREE; - } - } - - last_function_parms = decls; - - return result; -} - -/* Called from the parser to update an element of TYPE_ARG_TYPES for some - FUNCTION_TYPE with the newly parsed version of its default argument, which - was previously digested as text. See snarf_defarg et al in lex.c. */ - -void -replace_defarg (arg, init) - tree arg, init; -{ - if (! processing_template_decl - && ! can_convert_arg (TREE_VALUE (arg), TREE_TYPE (init), init)) - cp_pedwarn ("invalid type `%T' for default argument to `%T'", - TREE_TYPE (init), TREE_VALUE (arg)); - TREE_PURPOSE (arg) = init; -} - -int -copy_args_p (d) - tree d; -{ - tree t = FUNCTION_ARG_CHAIN (d); - if (DECL_CONSTRUCTOR_P (d) - && TYPE_USES_VIRTUAL_BASECLASSES (DECL_CONTEXT (d))) - t = TREE_CHAIN (t); - if (t && TREE_CODE (TREE_VALUE (t)) == REFERENCE_TYPE - && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_VALUE (t))) - == DECL_CLASS_CONTEXT (d)) - && (TREE_CHAIN (t) == NULL_TREE - || TREE_CHAIN (t) == void_list_node - || TREE_PURPOSE (TREE_CHAIN (t)))) - return 1; - return 0; -} - -/* These memoizing functions keep track of special properties which - a class may have. `grok_ctor_properties' notices whether a class - has a constructor of the form X(X&), and also complains - if the class has a constructor of the form X(X). - `grok_op_properties' takes notice of the various forms of - operator= which are defined, as well as what sorts of type conversion - may apply. Both functions take a FUNCTION_DECL as an argument. */ - -int -grok_ctor_properties (ctype, decl) - tree ctype, decl; -{ - tree parmtypes = FUNCTION_ARG_CHAIN (decl); - tree parmtype = parmtypes ? TREE_VALUE (parmtypes) : void_type_node; - - /* When a type has virtual baseclasses, a magical first int argument is - added to any ctor so we can tell if the class has been initialized - yet. This could screw things up in this function, so we deliberately - ignore the leading int if we're in that situation. */ - if (TYPE_USES_VIRTUAL_BASECLASSES (ctype)) - { - my_friendly_assert (parmtypes - && TREE_VALUE (parmtypes) == integer_type_node, - 980529); - parmtypes = TREE_CHAIN (parmtypes); - parmtype = TREE_VALUE (parmtypes); - } - - /* [class.copy] - - A non-template constructor for class X is a copy constructor if - its first parameter is of type X&, const X&, volatile X& or const - volatile X&, and either there are no other parameters or else all - other parameters have default arguments. */ - if (TREE_CODE (parmtype) == REFERENCE_TYPE - && TYPE_MAIN_VARIANT (TREE_TYPE (parmtype)) == ctype - && (TREE_CHAIN (parmtypes) == NULL_TREE - || TREE_CHAIN (parmtypes) == void_list_node - || TREE_PURPOSE (TREE_CHAIN (parmtypes))) - && !(DECL_TEMPLATE_INSTANTIATION (decl) - && is_member_template (DECL_TI_TEMPLATE (decl)))) - { - TYPE_HAS_INIT_REF (ctype) = 1; - if (CP_TYPE_CONST_P (TREE_TYPE (parmtype))) - TYPE_HAS_CONST_INIT_REF (ctype) = 1; - } - /* [class.copy] - - A declaration of a constructor for a class X is ill-formed if its - first parameter is of type (optionally cv-qualified) X and either - there are no other parameters or else all other parameters have - default arguments. - - We *don't* complain about member template instantiations that - have this form, though; they can occur as we try to decide what - constructor to use during overload resolution. Since overload - resolution will never prefer such a constructor to the - non-template copy constructor (which is either explicitly or - implicitly defined), there's no need to worry about their - existence. Theoretically, they should never even be - instantiated, but that's hard to forestall. */ - else if (TYPE_MAIN_VARIANT (parmtype) == ctype - && (TREE_CHAIN (parmtypes) == NULL_TREE - || TREE_CHAIN (parmtypes) == void_list_node - || TREE_PURPOSE (TREE_CHAIN (parmtypes))) - && !(DECL_TEMPLATE_INSTANTIATION (decl) - && is_member_template (DECL_TI_TEMPLATE (decl)))) - { - cp_error ("invalid constructor; you probably meant `%T (const %T&)'", - ctype, ctype); - SET_IDENTIFIER_ERROR_LOCUS (DECL_NAME (decl), ctype); - return 0; - } - else if (TREE_CODE (parmtype) == VOID_TYPE - || TREE_PURPOSE (parmtypes) != NULL_TREE) - TYPE_HAS_DEFAULT_CONSTRUCTOR (ctype) = 1; - - return 1; -} - -/* An operator with this name can be either unary or binary. */ - -static int -ambi_op_p (name) - tree name; -{ - return (name == ansi_opname [(int) INDIRECT_REF] - || name == ansi_opname [(int) ADDR_EXPR] - || name == ansi_opname [(int) NEGATE_EXPR] - || name == ansi_opname[(int) POSTINCREMENT_EXPR] - || name == ansi_opname[(int) POSTDECREMENT_EXPR] - || name == ansi_opname [(int) CONVERT_EXPR]); -} - -/* An operator with this name can only be unary. */ - -static int -unary_op_p (name) - tree name; -{ - return (name == ansi_opname [(int) TRUTH_NOT_EXPR] - || name == ansi_opname [(int) BIT_NOT_EXPR] - || name == ansi_opname [(int) COMPONENT_REF] - || IDENTIFIER_TYPENAME_P (name)); -} - -/* Do a little sanity-checking on how they declared their operator. */ - -void -grok_op_properties (decl, virtualp, friendp) - tree decl; - int virtualp, friendp; -{ - tree argtypes = TYPE_ARG_TYPES (TREE_TYPE (decl)); - int methodp = (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE); - tree name = DECL_NAME (decl); - - if (current_class_type == NULL_TREE) - friendp = 1; - - if (! friendp) - { - /* [class.copy] - - A user-declared copy assignment operator X::operator= is a - non-static non-template member function of class X with - exactly one parameter of type X, X&, const X&, volatile X& or - const volatile X&. */ - if (name == ansi_opname[(int) MODIFY_EXPR] - && !(DECL_TEMPLATE_INSTANTIATION (decl) - && is_member_template (DECL_TI_TEMPLATE (decl)))) - TYPE_HAS_ASSIGNMENT (current_class_type) = 1; - else if (name == ansi_opname[(int) CALL_EXPR]) - TYPE_OVERLOADS_CALL_EXPR (current_class_type) = 1; - else if (name == ansi_opname[(int) ARRAY_REF]) - TYPE_OVERLOADS_ARRAY_REF (current_class_type) = 1; - else if (name == ansi_opname[(int) COMPONENT_REF] - || name == ansi_opname[(int) MEMBER_REF]) - TYPE_OVERLOADS_ARROW (current_class_type) = 1; - else if (name == ansi_opname[(int) NEW_EXPR]) - TYPE_GETS_NEW (current_class_type) |= 1; - else if (name == ansi_opname[(int) DELETE_EXPR]) - TYPE_GETS_DELETE (current_class_type) |= 1; - else if (name == ansi_opname[(int) VEC_NEW_EXPR]) - TYPE_GETS_NEW (current_class_type) |= 2; - else if (name == ansi_opname[(int) VEC_DELETE_EXPR]) - TYPE_GETS_DELETE (current_class_type) |= 2; - } - - if (name == ansi_opname[(int) NEW_EXPR] - || name == ansi_opname[(int) VEC_NEW_EXPR]) - { - /* When the compiler encounters the definition of A::operator new, it - doesn't look at the class declaration to find out if it's static. */ - if (methodp) - revert_static_member_fn (&decl, NULL, NULL); - - /* Take care of function decl if we had syntax errors. */ - if (argtypes == NULL_TREE) - TREE_TYPE (decl) - = build_function_type (ptr_type_node, - hash_tree_chain (integer_type_node, - void_list_node)); - else - TREE_TYPE (decl) = coerce_new_type (TREE_TYPE (decl)); - } - else if (name == ansi_opname[(int) DELETE_EXPR] - || name == ansi_opname[(int) VEC_DELETE_EXPR]) - { - if (methodp) - revert_static_member_fn (&decl, NULL, NULL); - - if (argtypes == NULL_TREE) - TREE_TYPE (decl) - = build_function_type (void_type_node, - hash_tree_chain (ptr_type_node, - void_list_node)); - else - { - TREE_TYPE (decl) = coerce_delete_type (TREE_TYPE (decl)); - - if (! friendp && name == ansi_opname[(int) VEC_DELETE_EXPR] - && (TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (decl))) - != void_list_node)) - TYPE_VEC_DELETE_TAKES_SIZE (current_class_type) = 1; - } - } - else - { - /* An operator function must either be a non-static member function - or have at least one parameter of a class, a reference to a class, - an enumeration, or a reference to an enumeration. 13.4.0.6 */ - if (! methodp || DECL_STATIC_FUNCTION_P (decl)) - { - if (IDENTIFIER_TYPENAME_P (name) - || name == ansi_opname[(int) CALL_EXPR] - || name == ansi_opname[(int) MODIFY_EXPR] - || name == ansi_opname[(int) COMPONENT_REF] - || name == ansi_opname[(int) ARRAY_REF]) - cp_error ("`%D' must be a nonstatic member function", decl); - else - { - tree p = argtypes; - - if (DECL_STATIC_FUNCTION_P (decl)) - cp_error ("`%D' must be either a non-static member function or a non-member function", decl); - - if (p) - for (; TREE_CODE (TREE_VALUE (p)) != VOID_TYPE ; p = TREE_CHAIN (p)) - { - tree arg = TREE_VALUE (p); - if (TREE_CODE (arg) == REFERENCE_TYPE) - arg = TREE_TYPE (arg); - - /* This lets bad template code slip through. */ - if (IS_AGGR_TYPE (arg) - || TREE_CODE (arg) == ENUMERAL_TYPE - || TREE_CODE (arg) == TEMPLATE_TYPE_PARM - || TREE_CODE (arg) == TEMPLATE_TEMPLATE_PARM) - goto foundaggr; - } - cp_error - ("`%D' must have an argument of class or enumerated type", - decl); - foundaggr: - ; - } - } - - if (name == ansi_opname[(int) CALL_EXPR]) - return; /* No restrictions on args. */ - - if (IDENTIFIER_TYPENAME_P (name) && ! DECL_TEMPLATE_INFO (decl)) - { - tree t = TREE_TYPE (name); - if (TREE_CODE (t) == VOID_TYPE) - pedwarn ("void is not a valid type conversion operator"); - else if (! friendp) - { - int ref = (TREE_CODE (t) == REFERENCE_TYPE); - char *what = 0; - if (ref) - t = TYPE_MAIN_VARIANT (TREE_TYPE (t)); - - if (t == current_class_type) - what = "the same type"; - /* Don't force t to be complete here. */ - else if (IS_AGGR_TYPE (t) - && TYPE_SIZE (t) - && DERIVED_FROM_P (t, current_class_type)) - what = "a base class"; - - if (what) - warning ("conversion to %s%s will never use a type conversion operator", - ref ? "a reference to " : "", what); - } - } - - if (name == ansi_opname[(int) MODIFY_EXPR]) - { - tree parmtype; - - if (list_length (argtypes) != 3 && methodp) - { - cp_error ("`%D' must take exactly one argument", decl); - return; - } - parmtype = TREE_VALUE (TREE_CHAIN (argtypes)); - - if (copy_assignment_arg_p (parmtype, virtualp) - && ! friendp) - { - TYPE_HAS_ASSIGN_REF (current_class_type) = 1; - if (TREE_CODE (parmtype) != REFERENCE_TYPE - || CP_TYPE_CONST_P (TREE_TYPE (parmtype))) - TYPE_HAS_CONST_ASSIGN_REF (current_class_type) = 1; - } - } - else if (name == ansi_opname[(int) COND_EXPR]) - { - /* 13.4.0.3 */ - pedwarn ("ANSI C++ prohibits overloading operator ?:"); - if (list_length (argtypes) != 4) - cp_error ("`%D' must take exactly three arguments", decl); - } - else if (ambi_op_p (name)) - { - if (list_length (argtypes) == 2) - /* prefix */; - else if (list_length (argtypes) == 3) - { - if ((name == ansi_opname[(int) POSTINCREMENT_EXPR] - || name == ansi_opname[(int) POSTDECREMENT_EXPR]) - && ! processing_template_decl - && ! same_type_p (TREE_VALUE (TREE_CHAIN (argtypes)), integer_type_node)) - { - if (methodp) - cp_error ("postfix `%D' must take `int' as its argument", - decl); - else - cp_error - ("postfix `%D' must take `int' as its second argument", - decl); - } - } - else - { - if (methodp) - cp_error ("`%D' must take either zero or one argument", decl); - else - cp_error ("`%D' must take either one or two arguments", decl); - } - - /* More Effective C++ rule 6. */ - if (warn_ecpp - && (name == ansi_opname[(int) POSTINCREMENT_EXPR] - || name == ansi_opname[(int) POSTDECREMENT_EXPR])) - { - tree arg = TREE_VALUE (argtypes); - tree ret = TREE_TYPE (TREE_TYPE (decl)); - if (methodp || TREE_CODE (arg) == REFERENCE_TYPE) - arg = TREE_TYPE (arg); - arg = TYPE_MAIN_VARIANT (arg); - if (list_length (argtypes) == 2) - { - if (TREE_CODE (ret) != REFERENCE_TYPE - || !same_type_p (TYPE_MAIN_VARIANT (TREE_TYPE (ret)), - arg)) - cp_warning ("prefix `%D' should return `%T'", decl, - build_reference_type (arg)); - } - else - { - if (!same_type_p (TYPE_MAIN_VARIANT (ret), arg)) - cp_warning ("postfix `%D' should return `%T'", decl, arg); - } - } - } - else if (unary_op_p (name)) - { - if (list_length (argtypes) != 2) - { - if (methodp) - cp_error ("`%D' must take `void'", decl); - else - cp_error ("`%D' must take exactly one argument", decl); - } - } - else /* if (binary_op_p (name)) */ - { - if (list_length (argtypes) != 3) - { - if (methodp) - cp_error ("`%D' must take exactly one argument", decl); - else - cp_error ("`%D' must take exactly two arguments", decl); - } - - /* More Effective C++ rule 7. */ - if (warn_ecpp - && (name == ansi_opname [TRUTH_ANDIF_EXPR] - || name == ansi_opname [TRUTH_ORIF_EXPR] - || name == ansi_opname [COMPOUND_EXPR])) - cp_warning ("user-defined `%D' always evaluates both arguments", - decl); - } - - /* Effective C++ rule 23. */ - if (warn_ecpp - && list_length (argtypes) == 3 - && (name == ansi_opname [PLUS_EXPR] - || name == ansi_opname [MINUS_EXPR] - || name == ansi_opname [TRUNC_DIV_EXPR] - || name == ansi_opname [MULT_EXPR]) - && TREE_CODE (TREE_TYPE (TREE_TYPE (decl))) == REFERENCE_TYPE) - cp_warning ("`%D' should return by value", decl); - - /* 13.4.0.8 */ - if (argtypes) - for (; argtypes != void_list_node ; argtypes = TREE_CHAIN (argtypes)) - if (TREE_PURPOSE (argtypes)) - { - TREE_PURPOSE (argtypes) = NULL_TREE; - if (name == ansi_opname[(int) POSTINCREMENT_EXPR] - || name == ansi_opname[(int) POSTDECREMENT_EXPR]) - { - if (pedantic) - cp_pedwarn ("`%D' cannot have default arguments", decl); - } - else - cp_error ("`%D' cannot have default arguments", decl); - } - } -} - -static char * -tag_name (code) - enum tag_types code; -{ - switch (code) - { - case record_type: - return "struct"; - case class_type: - return "class"; - case union_type: - return "union "; - case enum_type: - return "enum"; - case signature_type: - return "signature"; - default: - my_friendly_abort (981122); - } -} - -/* Get the struct, enum or union (CODE says which) with tag NAME. - Define the tag as a forward-reference if it is not defined. - - C++: If a class derivation is given, process it here, and report - an error if multiple derivation declarations are not identical. - - If this is a definition, come in through xref_tag and only look in - the current frame for the name (since C++ allows new names in any - scope.) */ - -tree -xref_tag (code_type_node, name, globalize) - tree code_type_node; - tree name; - int globalize; -{ - enum tag_types tag_code; - enum tree_code code; - int temp = 0; - register tree ref, t; - struct binding_level *b = inner_binding_level; - int got_type = 0; - tree attributes = NULL_TREE; - - /* If we are called from the parser, code_type_node will sometimes be a - TREE_LIST. This indicates that the user wrote - "class __attribute__ ((foo)) bar". Extract the attributes so we can - use them later. */ - if (TREE_CODE (code_type_node) == TREE_LIST) - { - attributes = TREE_PURPOSE (code_type_node); - code_type_node = TREE_VALUE (code_type_node); - } - - tag_code = (enum tag_types) TREE_INT_CST_LOW (code_type_node); - switch (tag_code) - { - case record_type: - case class_type: - case signature_type: - code = RECORD_TYPE; - break; - case union_type: - code = UNION_TYPE; - break; - case enum_type: - code = ENUMERAL_TYPE; - break; - default: - my_friendly_abort (18); - } - - /* If a cross reference is requested, look up the type - already defined for this tag and return it. */ - if (TREE_CODE_CLASS (TREE_CODE (name)) == 't') - { - t = name; - name = TYPE_IDENTIFIER (t); - got_type = 1; - } - else - t = IDENTIFIER_TYPE_VALUE (name); - - if (t && TREE_CODE (t) != code && TREE_CODE (t) != TEMPLATE_TYPE_PARM - && TREE_CODE (t) != TEMPLATE_TEMPLATE_PARM) - t = NULL_TREE; - - if (! globalize) - { - /* If we know we are defining this tag, only look it up in - this scope and don't try to find it as a type. */ - ref = lookup_tag (code, name, b, 1); - } - else - { - if (current_class_type - && template_class_depth (current_class_type) - && PROCESSING_REAL_TEMPLATE_DECL_P ()) - /* Since GLOBALIZE is non-zero, we are not looking at a - definition of this tag. Since, in addition, we are currently - processing a (member) template declaration of a template - class, we don't want to do any lookup at all; consider: - - template - struct S1 - - template - struct S2 - { template - friend struct S1; }; - - Here, the S2::S1 declaration should not be confused with the - outer declaration. In particular, the inner version should - have a template parameter of level 2, not level 1. This - would be particularly important if the member declaration - were instead: - - template friend struct S1; - - say, when we should tsubst into `U' when instantiating S2. */ - ref = NULL_TREE; - else - { - if (t) - { - if (t != TYPE_MAIN_VARIANT (t)) - cp_pedwarn ("using typedef-name `%D' after `%s'", - TYPE_NAME (t), tag_name (tag_code)); - ref = t; - } - else - ref = lookup_tag (code, name, b, 0); - - if (! ref) - { - /* Try finding it as a type declaration. If that wins, - use it. */ - ref = lookup_name (name, 1); - - if (ref != NULL_TREE - && processing_template_decl - && DECL_CLASS_TEMPLATE_P (ref) - && template_class_depth (current_class_type) == 0) - /* Since GLOBALIZE is true, we're declaring a global - template, so we want this type. */ - ref = DECL_RESULT (ref); - - if (ref && TREE_CODE (ref) == TYPE_DECL - && TREE_CODE (TREE_TYPE (ref)) == code) - ref = TREE_TYPE (ref); - else - ref = NULL_TREE; - } - } - } - - push_obstacks_nochange (); - - if (! ref) - { - /* If no such tag is yet defined, create a forward-reference node - and record it as the "definition". - When a real declaration of this type is found, - the forward-reference will be altered into a real type. */ - - /* In C++, since these migrate into the global scope, we must - build them on the permanent obstack. */ - - temp = allocation_temporary_p (); - if (temp) - end_temporary_allocation (); - - if (code == ENUMERAL_TYPE) - { - cp_error ("use of enum `%#D' without previous declaration", name); - - ref = make_node (ENUMERAL_TYPE); - - /* Give the type a default layout like unsigned int - to avoid crashing if it does not get defined. */ - TYPE_MODE (ref) = TYPE_MODE (unsigned_type_node); - TYPE_ALIGN (ref) = TYPE_ALIGN (unsigned_type_node); - TREE_UNSIGNED (ref) = 1; - TYPE_PRECISION (ref) = TYPE_PRECISION (unsigned_type_node); - TYPE_MIN_VALUE (ref) = TYPE_MIN_VALUE (unsigned_type_node); - TYPE_MAX_VALUE (ref) = TYPE_MAX_VALUE (unsigned_type_node); - - /* Enable us to recognize when a type is created in class context. - To do nested classes correctly, this should probably be cleared - out when we leave this classes scope. Currently this in only - done in `start_enum'. */ - - pushtag (name, ref, globalize); - } - else - { - struct binding_level *old_b = class_binding_level; - - ref = make_lang_type (code); - - if (tag_code == signature_type) - { - SET_SIGNATURE (ref); - /* Since a signature type will be turned into the type - of signature tables, it's not only an interface. */ - CLASSTYPE_INTERFACE_ONLY (ref) = 0; - SET_CLASSTYPE_INTERFACE_KNOWN (ref); - /* A signature doesn't have a vtable. */ - CLASSTYPE_VTABLE_NEEDS_WRITING (ref) = 0; - } - -#ifdef NONNESTED_CLASSES - /* Class types don't nest the way enums do. */ - class_binding_level = (struct binding_level *)0; -#endif - pushtag (name, ref, globalize); - class_binding_level = old_b; - } - } - else - { - /* If it no longer looks like a nested type, make sure it's - in global scope. - If it is not an IDENTIFIER, this is not a declaration */ - if (b->namespace_p && !class_binding_level - && TREE_CODE (name) == IDENTIFIER_NODE) - { - if (IDENTIFIER_NAMESPACE_VALUE (name) == NULL_TREE) - SET_IDENTIFIER_NAMESPACE_VALUE (name, TYPE_NAME (ref)); - } - - if (!globalize && processing_template_decl && IS_AGGR_TYPE (ref)) - redeclare_class_template (ref, current_template_parms); - } - - /* Until the type is defined, tentatively accept whatever - structure tag the user hands us. */ - if (TYPE_SIZE (ref) == NULL_TREE - && ref != current_class_type - /* Have to check this, in case we have contradictory tag info. */ - && IS_AGGR_TYPE_CODE (TREE_CODE (ref))) - { - if (tag_code == class_type) - CLASSTYPE_DECLARED_CLASS (ref) = 1; - else if (tag_code == record_type || tag_code == signature_type) - CLASSTYPE_DECLARED_CLASS (ref) = 0; - } - - pop_obstacks (); - - TREE_TYPE (ref) = attributes; - - if (ref && TYPE_P (ref)) - { - /* [dcl.type.elab] - - If the identifier resolves to a typedef-name or a template - type-parameter, the elaborated-type-specifier is - ill-formed. */ - if (TYPE_LANG_SPECIFIC (ref) && TYPE_WAS_ANONYMOUS (ref)) - cp_error ("`%T' is a typedef name", ref); - else if (TREE_CODE (ref) == TEMPLATE_TYPE_PARM) - cp_error ("`%T' is a template type paramter", ref); - } - - return ref; -} - -tree -xref_tag_from_type (old, id, globalize) - tree old, id; - int globalize; -{ - tree code_type_node; - - if (TREE_CODE (old) == RECORD_TYPE) - code_type_node = (CLASSTYPE_DECLARED_CLASS (old) - ? class_type_node : record_type_node); - else - code_type_node = union_type_node; - - if (id == NULL_TREE) - id = TYPE_IDENTIFIER (old); - - return xref_tag (code_type_node, id, globalize); -} - -void -xref_basetypes (code_type_node, name, ref, binfo) - tree code_type_node; - tree name, ref; - tree binfo; -{ - /* In the declaration `A : X, Y, ... Z' we mark all the types - (A, X, Y, ..., Z) so we can check for duplicates. */ - tree binfos; - int i, len; - enum tag_types tag_code = (enum tag_types) TREE_INT_CST_LOW (code_type_node); - - if (tag_code == union_type) - { - cp_error ("derived union `%T' invalid", ref); - return; - } - - len = list_length (binfo); - push_obstacks (TYPE_OBSTACK (ref), TYPE_OBSTACK (ref)); - - SET_CLASSTYPE_MARKED (ref); - BINFO_BASETYPES (TYPE_BINFO (ref)) = binfos = make_tree_vec (len); - - for (i = 0; binfo; binfo = TREE_CHAIN (binfo)) - { - /* The base of a derived struct is public by default. */ - int via_public - = (TREE_PURPOSE (binfo) == access_public_node - || TREE_PURPOSE (binfo) == access_public_virtual_node - || (tag_code != class_type - && (TREE_PURPOSE (binfo) == access_default_node - || TREE_PURPOSE (binfo) == access_default_virtual_node))); - int via_protected - = (TREE_PURPOSE (binfo) == access_protected_node - || TREE_PURPOSE (binfo) == access_protected_virtual_node); - int via_virtual - = (TREE_PURPOSE (binfo) == access_private_virtual_node - || TREE_PURPOSE (binfo) == access_protected_virtual_node - || TREE_PURPOSE (binfo) == access_public_virtual_node - || TREE_PURPOSE (binfo) == access_default_virtual_node); - tree basetype = TREE_VALUE (binfo); - tree base_binfo; - - if (basetype && TREE_CODE (basetype) == TYPE_DECL) - basetype = TREE_TYPE (basetype); - if (!basetype - || (TREE_CODE (basetype) != RECORD_TYPE - && TREE_CODE (basetype) != TYPENAME_TYPE - && TREE_CODE (basetype) != TEMPLATE_TYPE_PARM - && TREE_CODE (basetype) != TEMPLATE_TEMPLATE_PARM)) - { - cp_error ("base type `%T' fails to be a struct or class type", - TREE_VALUE (binfo)); - continue; - } - - GNU_xref_hier (name, basetype, via_public, via_virtual, 0); - -#if 1 - /* This code replaces similar code in layout_basetypes. - We put the complete_type first for implicit `typename'. */ - if (TYPE_SIZE (complete_type (basetype)) == NULL_TREE - && ! (current_template_parms && uses_template_parms (basetype))) - { - cp_error ("base class `%T' has incomplete type", basetype); - continue; - } -#endif - else - { - if (CLASSTYPE_MARKED (basetype)) - { - if (basetype == ref) - cp_error ("recursive type `%T' undefined", basetype); - else - cp_error ("duplicate base type `%T' invalid", basetype); - continue; - } - - if (TYPE_FOR_JAVA (basetype) - && current_lang_stack == current_lang_base) - TYPE_FOR_JAVA (ref) = 1; - - /* Note that the BINFO records which describe individual - inheritances are *not* shared in the lattice! They - cannot be shared because a given baseclass may be - inherited with different `accessibility' by different - derived classes. (Each BINFO record describing an - individual inheritance contains flags which say what - the `accessibility' of that particular inheritance is.) */ - - base_binfo - = make_binfo (integer_zero_node, basetype, - CLASS_TYPE_P (basetype) - ? TYPE_BINFO_VTABLE (basetype) : NULL_TREE, - CLASS_TYPE_P (basetype) - ? TYPE_BINFO_VIRTUALS (basetype) : NULL_TREE); - - TREE_VEC_ELT (binfos, i) = base_binfo; - TREE_VIA_PUBLIC (base_binfo) = via_public; - TREE_VIA_PROTECTED (base_binfo) = via_protected; - TREE_VIA_VIRTUAL (base_binfo) = via_virtual; - BINFO_INHERITANCE_CHAIN (base_binfo) = TYPE_BINFO (ref); - - /* We need to unshare the binfos now so that lookups during class - definition work. */ - unshare_base_binfos (base_binfo); - - SET_CLASSTYPE_MARKED (basetype); - - /* We are free to modify these bits because they are meaningless - at top level, and BASETYPE is a top-level type. */ - if (via_virtual || TYPE_USES_VIRTUAL_BASECLASSES (basetype)) - { - TYPE_USES_VIRTUAL_BASECLASSES (ref) = 1; - TYPE_USES_COMPLEX_INHERITANCE (ref) = 1; - } - - if (CLASS_TYPE_P (basetype)) - { - TYPE_GETS_NEW (ref) |= TYPE_GETS_NEW (basetype); - TYPE_GETS_DELETE (ref) |= TYPE_GETS_DELETE (basetype); - } - - i += 1; - } - } - if (i) - TREE_VEC_LENGTH (binfos) = i; - else - BINFO_BASETYPES (TYPE_BINFO (ref)) = NULL_TREE; - - if (i > 1) - TYPE_USES_MULTIPLE_INHERITANCE (ref) = 1; - else if (i == 1) - { - tree basetype = BINFO_TYPE (TREE_VEC_ELT (binfos, 0)); - - if (CLASS_TYPE_P (basetype)) - TYPE_USES_MULTIPLE_INHERITANCE (ref) - = TYPE_USES_MULTIPLE_INHERITANCE (basetype); - } - - if (TYPE_USES_MULTIPLE_INHERITANCE (ref)) - TYPE_USES_COMPLEX_INHERITANCE (ref) = 1; - - /* Unmark all the types. */ - while (--i >= 0) - CLEAR_CLASSTYPE_MARKED (BINFO_TYPE (TREE_VEC_ELT (binfos, i))); - CLEAR_CLASSTYPE_MARKED (ref); - - pop_obstacks (); -} - - -/* Begin compiling the definition of an enumeration type. - NAME is its name (or null if anonymous). - Returns the type object, as yet incomplete. - Also records info about it so that build_enumerator - may be used to declare the individual values as they are read. */ - -tree -start_enum (name) - tree name; -{ - register tree enumtype = NULL_TREE; - struct binding_level *b = inner_binding_level; - - /* We are wasting space here and putting these on the permanent_obstack so - that typeid(local enum) will work correctly. */ - push_obstacks (&permanent_obstack, &permanent_obstack); - - /* If this is the real definition for a previous forward reference, - fill in the contents in the same object that used to be the - forward reference. */ - - if (name != NULL_TREE) - enumtype = lookup_tag (ENUMERAL_TYPE, name, b, 1); - - if (enumtype != NULL_TREE && TREE_CODE (enumtype) == ENUMERAL_TYPE) - cp_error ("multiple definition of `%#T'", enumtype); - else - { - enumtype = make_node (ENUMERAL_TYPE); - pushtag (name, enumtype, 0); - } - - if (current_class_type) - TREE_ADDRESSABLE (b->tags) = 1; - - /* We don't copy this value because build_enumerator needs to do it. */ - enum_next_value = integer_zero_node; - enum_overflow = 0; - - GNU_xref_decl (current_function_decl, enumtype); - return enumtype; -} - -/* After processing and defining all the values of an enumeration type, - install their decls in the enumeration type and finish it off. - ENUMTYPE is the type object and VALUES a list of name-value pairs. - Returns ENUMTYPE. */ - -tree -finish_enum (enumtype) - tree enumtype; -{ - register tree minnode = NULL_TREE, maxnode = NULL_TREE; - /* Calculate the maximum value of any enumerator in this type. */ - - tree values = TYPE_VALUES (enumtype); - if (values) - { - tree pair; - - for (pair = values; pair; pair = TREE_CHAIN (pair)) - { - tree decl; - tree value; - - /* The TREE_VALUE is a CONST_DECL for this enumeration - constant. */ - decl = TREE_VALUE (pair); - - /* The DECL_INITIAL will be NULL if we are processing a - template declaration and this enumeration constant had no - explicit initializer. */ - value = DECL_INITIAL (decl); - if (value && !processing_template_decl) - { - /* Set the TREE_TYPE for the VALUE as well. That's so - that when we call decl_constant_value we get an - entity of the right type (but with the constant - value). Since we shouldn't ever call - decl_constant_value on a template type, there's no - reason to do that when processing_template_decl. - And, if the expression is something like a - TEMPLATE_PARM_INDEX or a CAST_EXPR doing so will - wreak havoc on the intended type of the expression. - - Of course, there's also no point in trying to compute - minimum or maximum values if we're in a template. */ - TREE_TYPE (value) = enumtype; - - if (!minnode) - minnode = maxnode = value; - else if (tree_int_cst_lt (maxnode, value)) - maxnode = value; - else if (tree_int_cst_lt (value, minnode)) - minnode = value; - } - - if (processing_template_decl) - /* If this is just a template, leave the CONST_DECL - alone. That way tsubst_copy will find CONST_DECLs for - CONST_DECLs, and not INTEGER_CSTs. */ - ; - else - /* In the list we're building up, we want the enumeration - values, not the CONST_DECLs. */ - TREE_VALUE (pair) = value; - } - } - else - maxnode = minnode = integer_zero_node; - - TYPE_VALUES (enumtype) = nreverse (values); - - if (processing_template_decl) - { - tree scope = current_scope (); - if (scope && TREE_CODE (scope) == FUNCTION_DECL) - add_tree (build_min (TAG_DEFN, enumtype)); - } - else - { - int unsignedp = tree_int_cst_sgn (minnode) >= 0; - int lowprec = min_precision (minnode, unsignedp); - int highprec = min_precision (maxnode, unsignedp); - int precision = MAX (lowprec, highprec); - tree tem; - - TYPE_SIZE (enumtype) = NULL_TREE; - - /* Set TYPE_MIN_VALUE and TYPE_MAX_VALUE according to `precision'. */ - - TYPE_PRECISION (enumtype) = precision; - if (unsignedp) - fixup_unsigned_type (enumtype); - else - fixup_signed_type (enumtype); - - if (flag_short_enums || (precision > TYPE_PRECISION (integer_type_node))) - /* Use the width of the narrowest normal C type which is wide - enough. */ - TYPE_PRECISION (enumtype) = TYPE_PRECISION (type_for_size - (precision, 1)); - else - TYPE_PRECISION (enumtype) = TYPE_PRECISION (integer_type_node); - - TYPE_SIZE (enumtype) = 0; - layout_type (enumtype); - - /* Fix up all variant types of this enum type. */ - for (tem = TYPE_MAIN_VARIANT (enumtype); tem; - tem = TYPE_NEXT_VARIANT (tem)) - { - TYPE_VALUES (tem) = TYPE_VALUES (enumtype); - TYPE_MIN_VALUE (tem) = TYPE_MIN_VALUE (enumtype); - TYPE_MAX_VALUE (tem) = TYPE_MAX_VALUE (enumtype); - TYPE_SIZE (tem) = TYPE_SIZE (enumtype); - TYPE_SIZE_UNIT (tem) = TYPE_SIZE_UNIT (enumtype); - TYPE_MODE (tem) = TYPE_MODE (enumtype); - TYPE_PRECISION (tem) = TYPE_PRECISION (enumtype); - TYPE_ALIGN (tem) = TYPE_ALIGN (enumtype); - TREE_UNSIGNED (tem) = TREE_UNSIGNED (enumtype); - } - - /* Finish debugging output for this type. */ - rest_of_type_compilation (enumtype, namespace_bindings_p ()); - } - - /* In start_enum we pushed obstacks. Here, we must pop them. */ - pop_obstacks (); - - return enumtype; -} - -/* Build and install a CONST_DECL for an enumeration constant of the - enumeration type TYPE whose NAME and VALUE (if any) are provided. - Assignment of sequential values by default is handled here. */ - -tree -build_enumerator (name, value, type) - tree name; - tree value; - tree type; -{ - tree decl, result; - tree context; - - /* Remove no-op casts from the value. */ - if (value) - STRIP_TYPE_NOPS (value); - - if (! processing_template_decl) - { - /* Validate and default VALUE. */ - if (value != NULL_TREE) - { - if (TREE_READONLY_DECL_P (value)) - value = decl_constant_value (value); - - if (TREE_CODE (value) == INTEGER_CST) - { - value = default_conversion (value); - constant_expression_warning (value); - } - else - { - cp_error ("enumerator value for `%D' not integer constant", name); - value = NULL_TREE; - } - } - - /* Default based on previous value. */ - if (value == NULL_TREE && ! processing_template_decl) - { - value = enum_next_value; - if (enum_overflow) - cp_error ("overflow in enumeration values at `%D'", name); - } - - /* Remove no-op casts from the value. */ - if (value) - STRIP_TYPE_NOPS (value); -#if 0 - /* To fix MAX_VAL enum consts. (bkoz) */ - TREE_TYPE (value) = integer_type_node; -#endif - } - - /* We always have to copy here; not all INTEGER_CSTs are unshared. - Even in other cases, we will later (in finish_enum) be setting the - type of VALUE. */ - if (value != NULL_TREE) - value = copy_node (value); - - /* C++ associates enums with global, function, or class declarations. */ - - context = current_scope (); - if (context && context == current_class_type) - /* This enum declaration is local to the class. */ - decl = build_lang_field_decl (CONST_DECL, name, type); - else - /* It's a global enum, or it's local to a function. (Note local to - a function could mean local to a class method. */ - decl = build_decl (CONST_DECL, name, type); - - DECL_CONTEXT (decl) = FROB_CONTEXT (context); - DECL_INITIAL (decl) = value; - TREE_READONLY (decl) = 1; - - if (context && context == current_class_type) - { - pushdecl_class_level (decl); - /* In something like `struct S { enum E { i = 7 }; };' we put `i' - on the TYPE_FIELDS list for `S'. (That's so that you can say - things like `S::i' later.) */ - finish_member_declaration (decl); - } - else - { - pushdecl (decl); - GNU_xref_decl (current_function_decl, decl); - } - - if (! processing_template_decl) - { - /* Set basis for default for next value. */ - enum_next_value = build_binary_op_nodefault (PLUS_EXPR, value, - integer_one_node, PLUS_EXPR); - enum_overflow = tree_int_cst_lt (enum_next_value, value); - } - - result = saveable_tree_cons (name, decl, NULL_TREE); - return result; -} - - -static int function_depth; - -/* Create the FUNCTION_DECL for a function definition. - DECLSPECS and DECLARATOR are the parts of the declaration; - they describe the function's name and the type it returns, - but twisted together in a fashion that parallels the syntax of C. - - If PRE_PARSED_P is non-zero then DECLARATOR is really the DECL for - the function we are about to process; DECLSPECS are ignored. For - example, we set PRE_PARSED_P when processing the definition of - inline function that was defined in-class; the definition is - actually processed when the class is complete. In this case, - PRE_PARSED_P is 2. We also set PRE_PARSED_P when instanting the - body of a template function, and when constructing thunk functions - and such; in these cases PRE_PARSED_P is 1. - - This function creates a binding context for the function body - as well as setting up the FUNCTION_DECL in current_function_decl. - - Returns 1 on success. If the DECLARATOR is not suitable for a function - (it defines a datum instead), we return 0, which tells - yyparse to report a parse error. - - For C++, we must first check whether that datum makes any sense. - For example, "class A local_a(1,2);" means that variable local_a - is an aggregate of type A, which should have a constructor - applied to it with the argument list [1, 2]. - - @@ There is currently no way to retrieve the storage - @@ allocated to FUNCTION (or all of its parms) if we return - @@ something we had previously. */ - -int -start_function (declspecs, declarator, attrs, pre_parsed_p) - tree declspecs, declarator, attrs; - int pre_parsed_p; -{ - tree decl1; - tree ctype = NULL_TREE; - tree fntype; - tree restype; - extern int have_extern_spec; - extern int used_extern_spec; - int doing_friend = 0; - - /* Sanity check. */ - my_friendly_assert (TREE_CODE (TREE_VALUE (void_list_node)) == VOID_TYPE, 160); - my_friendly_assert (TREE_CHAIN (void_list_node) == NULL_TREE, 161); - - /* Assume, until we see it does. */ - current_function_returns_value = 0; - current_function_returns_null = 0; - named_labels = 0; - shadowed_labels = 0; - current_function_assigns_this = 0; - current_function_just_assigned_this = 0; - current_function_parms_stored = 0; - original_result_rtx = NULL_RTX; - base_init_expr = NULL_TREE; - current_base_init_list = NULL_TREE; - current_member_init_list = NULL_TREE; - ctor_label = dtor_label = NULL_TREE; - static_labelno = 0; - - clear_temp_name (); - - /* This should only be done once on the top most decl. */ - if (have_extern_spec && !used_extern_spec) - { - declspecs = decl_tree_cons (NULL_TREE, get_identifier ("extern"), declspecs); - used_extern_spec = 1; - } - - if (pre_parsed_p) - { - decl1 = declarator; - -#if 0 - /* What was this testing for, exactly? */ - if (! DECL_ARGUMENTS (decl1) - && !DECL_STATIC_FUNCTION_P (decl1) - && !DECL_ARTIFICIAL (decl1) - && DECL_CLASS_SCOPE_P (decl1) - && TYPE_IDENTIFIER (DECL_CONTEXT (decl1)) - && IDENTIFIER_TEMPLATE (TYPE_IDENTIFIER (DECL_CONTEXT (decl1)))) - { - tree binding = binding_for_name (DECL_NAME (decl1), - current_namespace); - cp_error ("redeclaration of `%#D'", decl1); - if (IDENTIFIER_CLASS_VALUE (DECL_NAME (decl1))) - cp_error_at ("previous declaration here", IDENTIFIER_CLASS_VALUE (DECL_NAME (decl1))); - else if (BINDING_VALUE (binding)) - cp_error_at ("previous declaration here", BINDING_VALUE (binding)); - } -#endif - - fntype = TREE_TYPE (decl1); - if (TREE_CODE (fntype) == METHOD_TYPE) - ctype = TYPE_METHOD_BASETYPE (fntype); - - /* ANSI C++ June 5 1992 WP 11.4.5. A friend function defined in a - class is in the (lexical) scope of the class in which it is - defined. */ - if (!ctype && DECL_FRIEND_P (decl1)) - { - ctype = DECL_CLASS_CONTEXT (decl1); - - /* CTYPE could be null here if we're dealing with a template; - for example, `inline friend float foo()' inside a template - will have no CTYPE set. */ - if (ctype && TREE_CODE (ctype) != RECORD_TYPE) - ctype = NULL_TREE; - else - doing_friend = 1; - } - - last_function_parms = DECL_ARGUMENTS (decl1); - last_function_parm_tags = NULL_TREE; - } - else - { - decl1 = grokdeclarator (declarator, declspecs, FUNCDEF, 1, NULL_TREE); - /* If the declarator is not suitable for a function definition, - cause a syntax error. */ - if (decl1 == NULL_TREE || TREE_CODE (decl1) != FUNCTION_DECL) return 0; - - fntype = TREE_TYPE (decl1); - - restype = TREE_TYPE (fntype); - if (CLASS_TYPE_P (restype) && !CLASSTYPE_GOT_SEMICOLON (restype)) - { - cp_error ("semicolon missing after declaration of `%#T'", restype); - shadow_tag (build_expr_list (NULL_TREE, restype)); - CLASSTYPE_GOT_SEMICOLON (restype) = 1; - if (TREE_CODE (fntype) == FUNCTION_TYPE) - fntype = build_function_type (integer_type_node, - TYPE_ARG_TYPES (fntype)); - else - fntype = build_cplus_method_type (build_type_variant (TYPE_METHOD_BASETYPE (fntype), TREE_READONLY (decl1), TREE_SIDE_EFFECTS (decl1)), - integer_type_node, - TYPE_ARG_TYPES (fntype)); - TREE_TYPE (decl1) = fntype; - } - - if (TREE_CODE (fntype) == METHOD_TYPE) - ctype = TYPE_METHOD_BASETYPE (fntype); - else if (DECL_MAIN_P (decl1)) - { - /* If this doesn't return integer_type, complain. */ - if (TREE_TYPE (TREE_TYPE (decl1)) != integer_type_node) - { - if (pedantic || warn_return_type) - pedwarn ("return type for `main' changed to `int'"); - TREE_TYPE (decl1) = fntype = default_function_type; - } - } - } - - /* Warn if function was previously implicitly declared - (but not if we warned then). */ - if (! warn_implicit - && IDENTIFIER_IMPLICIT_DECL (DECL_NAME (decl1)) != NULL_TREE) - cp_warning_at ("`%D' implicitly declared before its definition", IDENTIFIER_IMPLICIT_DECL (DECL_NAME (decl1))); - - announce_function (decl1); - - /* Set up current_class_type, and enter the scope of the class, if - appropriate. */ - if (ctype) - push_nested_class (ctype, 1); - else if (DECL_STATIC_FUNCTION_P (decl1)) - push_nested_class (DECL_CONTEXT (decl1), 2); - - /* Now that we have entered the scope of the class, we must restore - the bindings for any template parameters surrounding DECL1, if it - is an inline member template. (Order is important; consider the - case where a template parameter has the same name as a field of - the class.) It is not until after this point that - PROCESSING_TEMPLATE_DECL is guaranteed to be set up correctly. */ - if (pre_parsed_p == 2) - maybe_begin_member_template_processing (decl1); - - /* We are now in the scope of the function being defined. */ - current_function_decl = decl1; - - /* Save the parm names or decls from this function's declarator - where store_parm_decls will find them. */ - current_function_parms = last_function_parms; - current_function_parm_tags = last_function_parm_tags; - - if (! processing_template_decl) - { - /* In a function definition, arg types must be complete. */ - require_complete_types_for_parms (current_function_parms); - - if (TYPE_SIZE (complete_type (TREE_TYPE (fntype))) == NULL_TREE) - { - cp_error ("return-type `%#T' is an incomplete type", - TREE_TYPE (fntype)); - - /* Make it return void instead, but don't change the - type of the DECL_RESULT, in case we have a named return value. */ - if (ctype) - TREE_TYPE (decl1) - = build_cplus_method_type (build_type_variant (ctype, - TREE_READONLY (decl1), - TREE_SIDE_EFFECTS (decl1)), - void_type_node, - FUNCTION_ARG_CHAIN (decl1)); - else - TREE_TYPE (decl1) - = build_function_type (void_type_node, - TYPE_ARG_TYPES (TREE_TYPE (decl1))); - DECL_RESULT (decl1) - = build_decl (RESULT_DECL, 0, TYPE_MAIN_VARIANT (TREE_TYPE (fntype))); - TREE_READONLY (DECL_RESULT (decl1)) - = CP_TYPE_CONST_P (TREE_TYPE (fntype)); - TREE_THIS_VOLATILE (DECL_RESULT (decl1)) - = CP_TYPE_VOLATILE_P (TREE_TYPE (fntype)); - } - - if (TYPE_LANG_SPECIFIC (TREE_TYPE (fntype)) - && CLASSTYPE_ABSTRACT_VIRTUALS (TREE_TYPE (fntype))) - abstract_virtuals_error (decl1, TREE_TYPE (fntype)); - } - - /* Effective C++ rule 15. See also c_expand_return. */ - if (warn_ecpp - && DECL_NAME (decl1) == ansi_opname[(int) MODIFY_EXPR] - && TREE_CODE (TREE_TYPE (fntype)) == VOID_TYPE) - cp_warning ("`operator=' should return a reference to `*this'"); - - /* Make the init_value nonzero so pushdecl knows this is not tentative. - error_mark_node is replaced below (in poplevel) with the BLOCK. */ - DECL_INITIAL (decl1) = error_mark_node; - -#ifdef SET_DEFAULT_DECL_ATTRIBUTES - SET_DEFAULT_DECL_ATTRIBUTES (decl1, attrs); -#endif - - /* This function exists in static storage. - (This does not mean `static' in the C sense!) */ - TREE_STATIC (decl1) = 1; - - /* We must call push_template_decl after current_class_type is set - up. (If we are processing inline definitions after exiting a - class scope, current_class_type will be NULL_TREE until set above - by push_nested_class.) */ - if (processing_template_decl) - decl1 = push_template_decl (decl1); - - /* Record the decl so that the function name is defined. - If we already have a decl for this name, and it is a FUNCTION_DECL, - use the old decl. */ - if (!processing_template_decl && pre_parsed_p == 0) - { - /* A specialization is not used to guide overload resolution. */ - if ((flag_guiding_decls - || !DECL_TEMPLATE_SPECIALIZATION (decl1)) - && ! DECL_FUNCTION_MEMBER_P (decl1)) - decl1 = pushdecl (decl1); - else - { - /* We need to set the DECL_CONTEXT. */ - if (!DECL_CONTEXT (decl1) && DECL_TEMPLATE_INFO (decl1)) - DECL_CONTEXT (decl1) = DECL_CONTEXT (DECL_TI_TEMPLATE (decl1)); - /* And make sure we have enough default args. */ - check_default_args (decl1); - } - DECL_MAIN_VARIANT (decl1) = decl1; - fntype = TREE_TYPE (decl1); - } - - current_function_decl = decl1; - - if (DECL_INTERFACE_KNOWN (decl1)) - { - tree ctx = hack_decl_function_context (decl1); - - if (DECL_NOT_REALLY_EXTERN (decl1)) - DECL_EXTERNAL (decl1) = 0; - - if (ctx != NULL_TREE && DECL_THIS_INLINE (ctx) - && TREE_PUBLIC (ctx)) - /* This is a function in a local class in an extern inline - function. */ - comdat_linkage (decl1); - } - /* If this function belongs to an interface, it is public. - If it belongs to someone else's interface, it is also external. - This only affects inlines and template instantiations. */ - else if (interface_unknown == 0 - && (! DECL_TEMPLATE_INSTANTIATION (decl1) - || flag_alt_external_templates)) - { - if (DECL_THIS_INLINE (decl1) || DECL_TEMPLATE_INSTANTIATION (decl1) - || processing_template_decl) - { - DECL_EXTERNAL (decl1) - = (interface_only - || (DECL_THIS_INLINE (decl1) && ! flag_implement_inlines)); - - /* For WIN32 we also want to put these in linkonce sections. */ - maybe_make_one_only (decl1); - } - else - DECL_EXTERNAL (decl1) = 0; - DECL_NOT_REALLY_EXTERN (decl1) = 0; - DECL_INTERFACE_KNOWN (decl1) = 1; - } - else - { - /* This is a definition, not a reference. - So clear DECL_EXTERNAL. */ - DECL_EXTERNAL (decl1) = 0; - - if ((DECL_THIS_INLINE (decl1) || DECL_TEMPLATE_INSTANTIATION (decl1)) - && ! DECL_INTERFACE_KNOWN (decl1) - /* Don't try to defer nested functions for now. */ - && ! hack_decl_function_context (decl1)) - DECL_DEFER_OUTPUT (decl1) = 1; - else - DECL_INTERFACE_KNOWN (decl1) = 1; - } - - if (ctype != NULL_TREE && DECL_STATIC_FUNCTION_P (decl1)) - { - if (TREE_CODE (fntype) == METHOD_TYPE) - TREE_TYPE (decl1) = fntype - = build_function_type (TREE_TYPE (fntype), - TREE_CHAIN (TYPE_ARG_TYPES (fntype))); - current_function_parms = TREE_CHAIN (current_function_parms); - DECL_ARGUMENTS (decl1) = current_function_parms; - ctype = NULL_TREE; - } - restype = TREE_TYPE (fntype); - - if (ctype) - { - /* If we're compiling a friend function, neither of the variables - current_class_ptr nor current_class_type will have values. */ - if (! doing_friend) - { - /* We know that this was set up by `grokclassfn'. - We do not wait until `store_parm_decls', since evil - parse errors may never get us to that point. Here - we keep the consistency between `current_class_type' - and `current_class_ptr'. */ - tree t = current_function_parms; - - my_friendly_assert (t != NULL_TREE - && TREE_CODE (t) == PARM_DECL, 162); - - if (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE) - { - int i; - - if (! hack_decl_function_context (decl1)) - temporary_allocation (); - i = suspend_momentary (); - - /* Normally, build_indirect_ref returns - current_class_ref whenever current_class_ptr is - dereferenced. This time, however, we want it to - *create* current_class_ref, so we temporarily clear - current_class_ptr to fool it. */ - current_class_ptr = NULL_TREE; - current_class_ref = build_indirect_ref (t, NULL_PTR); - current_class_ptr = t; - - resume_momentary (i); - if (! hack_decl_function_context (decl1)) - end_temporary_allocation (); - } - else - /* We're having a signature pointer here. */ - current_class_ref = current_class_ptr = t; - - } - } - else - current_class_ptr = current_class_ref = NULL_TREE; - - pushlevel (0); - current_binding_level->parm_flag = 1; - - GNU_xref_function (decl1, current_function_parms); - - if (attrs) - cplus_decl_attributes (decl1, NULL_TREE, attrs); - - make_function_rtl (decl1); - - /* Promote the value to int before returning it. */ - if (C_PROMOTING_INTEGER_TYPE_P (restype)) - restype = type_promotes_to (restype); - - /* If this fcn was already referenced via a block-scope `extern' decl - (or an implicit decl), propagate certain information about the usage. */ - if (TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (decl1))) - TREE_ADDRESSABLE (decl1) = 1; - - if (DECL_RESULT (decl1) == NULL_TREE) - { - DECL_RESULT (decl1) - = build_decl (RESULT_DECL, 0, TYPE_MAIN_VARIANT (restype)); - TREE_READONLY (DECL_RESULT (decl1)) = CP_TYPE_CONST_P (restype); - TREE_THIS_VOLATILE (DECL_RESULT (decl1)) = CP_TYPE_VOLATILE_P (restype); - } - - /* Allocate further tree nodes temporarily during compilation - of this function only. Tiemann moved up here from bottom of fn. */ - /* If this is a nested function, then we must continue to allocate RTL - on the permanent obstack in case we need to inline it later. */ - if (! hack_decl_function_context (decl1)) - temporary_allocation (); - - if (processing_template_decl) - { - ++minimal_parse_mode; - last_tree = DECL_SAVED_TREE (decl1) - = build_nt (EXPR_STMT, void_zero_node); - } - - ++function_depth; - - if (DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (decl1)) - && DECL_LANGUAGE (decl1) == lang_cplusplus) - { - dtor_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); - ctor_label = NULL_TREE; - } - else - { - dtor_label = NULL_TREE; - if (DECL_CONSTRUCTOR_P (decl1)) - ctor_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); - } - - return 1; -} - -/* Called after store_parm_decls for a function-try-block. We need to update - last_parm_cleanup_insn so that the base initializers for a constructor - are run within this block, not before it. */ - -void -expand_start_early_try_stmts () -{ - expand_start_try_stmts (); - last_parm_cleanup_insn = get_last_insn (); -} - -/* Store the parameter declarations into the current function declaration. - This is called after parsing the parameter declarations, before - digesting the body of the function. - - Also install to binding contour return value identifier, if any. */ - -void -store_parm_decls () -{ - register tree fndecl = current_function_decl; - register tree parm; - int parms_have_cleanups = 0; - tree cleanups = NULL_TREE; - - /* This is either a chain of PARM_DECLs (when a prototype is used). */ - tree specparms = current_function_parms; - - /* This is a list of types declared among parms in a prototype. */ - tree parmtags = current_function_parm_tags; - - /* This is a chain of any other decls that came in among the parm - declarations. If a parm is declared with enum {foo, bar} x; - then CONST_DECLs for foo and bar are put here. */ - tree nonparms = NULL_TREE; - - if (toplevel_bindings_p ()) - fatal ("parse errors have confused me too much"); - - /* Initialize RTL machinery. */ - init_function_start (fndecl, input_filename, lineno); - - /* Create a binding level for the parms. */ - expand_start_bindings (0); - - if (specparms != NULL_TREE) - { - /* This case is when the function was defined with an ANSI prototype. - The parms already have decls, so we need not do anything here - except record them as in effect - and complain if any redundant old-style parm decls were written. */ - - register tree next; - - /* Must clear this because it might contain TYPE_DECLs declared - at class level. */ - storedecls (NULL_TREE); - - for (parm = nreverse (specparms); parm; parm = next) - { - next = TREE_CHAIN (parm); - if (TREE_CODE (parm) == PARM_DECL) - { - tree cleanup; - if (DECL_NAME (parm) == NULL_TREE) - { - pushdecl (parm); - } - else if (TREE_CODE (TREE_TYPE (parm)) == VOID_TYPE) - cp_error ("parameter `%D' declared void", parm); - else - { - /* Now fill in DECL_REFERENCE_SLOT for any of the parm decls. - A parameter is assumed not to have any side effects. - If this should change for any reason, then this - will have to wrap the bashed reference type in a save_expr. - - Also, if the parameter type is declared to be an X - and there is an X(X&) constructor, we cannot lay it - into the stack (any more), so we make this parameter - look like it is really of reference type. Functions - which pass parameters to this function will know to - create a temporary in their frame, and pass a reference - to that. */ - - if (TREE_CODE (TREE_TYPE (parm)) == REFERENCE_TYPE - && TYPE_SIZE (TREE_TYPE (TREE_TYPE (parm)))) - SET_DECL_REFERENCE_SLOT (parm, convert_from_reference (parm)); - - pushdecl (parm); - } - if (! processing_template_decl - && (cleanup = maybe_build_cleanup (parm), cleanup)) - { - expand_decl (parm); - parms_have_cleanups = 1; - - /* Keep track of the cleanups. */ - cleanups = tree_cons (parm, cleanup, cleanups); - } - } - else - { - /* If we find an enum constant or a type tag, - put it aside for the moment. */ - TREE_CHAIN (parm) = NULL_TREE; - nonparms = chainon (nonparms, parm); - } - } - - /* Get the decls in their original chain order - and record in the function. This is all and only the - PARM_DECLs that were pushed into scope by the loop above. */ - DECL_ARGUMENTS (fndecl) = getdecls (); - - storetags (chainon (parmtags, gettags ())); - } - else - DECL_ARGUMENTS (fndecl) = NULL_TREE; - - /* Now store the final chain of decls for the arguments - as the decl-chain of the current lexical scope. - Put the enumerators in as well, at the front so that - DECL_ARGUMENTS is not modified. */ - - storedecls (chainon (nonparms, DECL_ARGUMENTS (fndecl))); - - /* Declare __FUNCTION__ and __PRETTY_FUNCTION__ for this function. */ - declare_function_name (); - - /* Initialize the RTL code for the function. */ - DECL_SAVED_INSNS (fndecl) = NULL_RTX; - if (! processing_template_decl) - expand_function_start (fndecl, parms_have_cleanups); - - current_function_parms_stored = 1; - - /* If this function is `main', emit a call to `__main' - to run global initializers, etc. */ - if (DECL_MAIN_P (fndecl)) - expand_main_function (); - - /* Now that we have initialized the parms, we can start their - cleanups. We cannot do this before, since expand_decl_cleanup - should not be called before the parm can be used. */ - if (cleanups - && ! processing_template_decl) - { - for (cleanups = nreverse (cleanups); cleanups; cleanups = TREE_CHAIN (cleanups)) - { - if (! expand_decl_cleanup (TREE_PURPOSE (cleanups), TREE_VALUE (cleanups))) - cp_error ("parser lost in parsing declaration of `%D'", - TREE_PURPOSE (cleanups)); - } - } - - /* Create a binding contour which can be used to catch - cleanup-generated temporaries. Also, if the return value needs or - has initialization, deal with that now. */ - if (parms_have_cleanups) - { - pushlevel (0); - expand_start_bindings (0); - } - - if (! processing_template_decl && flag_exceptions) - { - /* Do the starting of the exception specifications, if we have any. */ - if (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (current_function_decl))) - expand_start_eh_spec (); - } - - last_parm_cleanup_insn = get_last_insn (); - last_dtor_insn = get_last_insn (); -} - -/* Bind a name and initialization to the return value of - the current function. */ - -void -store_return_init (return_id, init) - tree return_id, init; -{ - tree decl = DECL_RESULT (current_function_decl); - - if (pedantic) - /* Give this error as many times as there are occurrences, - so that users can use Emacs compilation buffers to find - and fix all such places. */ - pedwarn ("ANSI C++ does not permit named return values"); - - if (return_id != NULL_TREE) - { - if (DECL_NAME (decl) == NULL_TREE) - { - DECL_NAME (decl) = return_id; - DECL_ASSEMBLER_NAME (decl) = return_id; - } - else - cp_error ("return identifier `%D' already in place", decl); - } - - /* Can't let this happen for constructors. */ - if (DECL_CONSTRUCTOR_P (current_function_decl)) - { - error ("can't redefine default return value for constructors"); - return; - } - - /* If we have a named return value, put that in our scope as well. */ - if (DECL_NAME (decl) != NULL_TREE) - { - /* If this named return value comes in a register, - put it in a pseudo-register. */ - if (DECL_REGISTER (decl)) - { - original_result_rtx = DECL_RTL (decl); - DECL_RTL (decl) = gen_reg_rtx (DECL_MODE (decl)); - } - - /* Let `cp_finish_decl' know that this initializer is ok. */ - DECL_INITIAL (decl) = init; - pushdecl (decl); - - if (minimal_parse_mode) - add_tree (build_min_nt (RETURN_INIT, return_id, - copy_to_permanent (init))); - else - cp_finish_decl (decl, init, NULL_TREE, 0, 0); - } -} - - -/* Finish up a function declaration and compile that function - all the way to assembler language output. The free the storage - for the function definition. - - This is called after parsing the body of the function definition. - LINENO is the current line number. - - FLAGS is a bitwise or of the following values: - 1 - CALL_POPLEVEL - An extra call to poplevel (and expand_end_bindings) must be - made to take care of the binding contour for the base - initializers. This is only relevant for constructors. - 2 - INCLASS_INLINE - We just finished processing the body of an in-class inline - function definition. (This processing will have taken place - after the class definition is complete.) - - NESTED is nonzero if we were in the middle of compiling another function - when we started on this one. */ - -void -finish_function (lineno, flags, nested) - int lineno; - int flags; - int nested; -{ - register tree fndecl = current_function_decl; - tree fntype, ctype = NULL_TREE; - rtx last_parm_insn, insns; - /* Label to use if this function is supposed to return a value. */ - tree no_return_label = NULL_TREE; - tree decls = NULL_TREE; - int call_poplevel = (flags & 1) != 0; - int inclass_inline = (flags & 2) != 0; - int in_template; - - /* When we get some parse errors, we can end up without a - current_function_decl, so cope. */ - if (fndecl == NULL_TREE) - return; - - if (! nested && function_depth > 1) - nested = 1; - - fntype = TREE_TYPE (fndecl); - -/* TREE_READONLY (fndecl) = 1; - This caused &foo to be of type ptr-to-const-function - which then got a warning when stored in a ptr-to-function variable. */ - - /* This happens on strange parse errors. */ - if (! current_function_parms_stored) - { - call_poplevel = 0; - store_parm_decls (); - } - - if (processing_template_decl) - { - if (DECL_CONSTRUCTOR_P (fndecl) && call_poplevel) - { - decls = getdecls (); - expand_end_bindings (decls, decls != NULL_TREE, 0); - poplevel (decls != NULL_TREE, 0, 0); - } - } - else - { - if (write_symbols != NO_DEBUG /*&& TREE_CODE (fntype) != METHOD_TYPE*/) - { - tree ttype = target_type (fntype); - tree parmdecl; - - if (IS_AGGR_TYPE (ttype)) - /* Let debugger know it should output info for this type. */ - note_debug_info_needed (ttype); - - for (parmdecl = DECL_ARGUMENTS (fndecl); parmdecl; parmdecl = TREE_CHAIN (parmdecl)) - { - ttype = target_type (TREE_TYPE (parmdecl)); - if (IS_AGGR_TYPE (ttype)) - /* Let debugger know it should output info for this type. */ - note_debug_info_needed (ttype); - } - } - - /* Clean house because we will need to reorder insns here. */ - do_pending_stack_adjust (); - - if (dtor_label) - { - tree binfo = TYPE_BINFO (current_class_type); - tree cond = integer_one_node; - tree exprstmt; - tree in_charge_node = lookup_name (in_charge_identifier, 0); - tree virtual_size; - int ok_to_optimize_dtor = 0; - int empty_dtor = get_last_insn () == last_dtor_insn; - - if (current_function_assigns_this) - cond = build (NE_EXPR, boolean_type_node, - current_class_ptr, integer_zero_node); - else - { - int n_baseclasses = CLASSTYPE_N_BASECLASSES (current_class_type); - - /* If this destructor is empty, then we don't need to check - whether `this' is NULL in some cases. */ - if ((flag_this_is_variable & 1) == 0) - ok_to_optimize_dtor = 1; - else if (empty_dtor) - ok_to_optimize_dtor - = (n_baseclasses == 0 - || (n_baseclasses == 1 - && TYPE_HAS_DESTRUCTOR (TYPE_BINFO_BASETYPE (current_class_type, 0)))); - } - - /* These initializations might go inline. Protect - the binding level of the parms. */ - pushlevel (0); - expand_start_bindings (0); - - if (current_function_assigns_this) - { - current_function_assigns_this = 0; - current_function_just_assigned_this = 0; - } - - /* Generate the code to call destructor on base class. - If this destructor belongs to a class with virtual - functions, then set the virtual function table - pointer to represent the type of our base class. */ - - /* This side-effect makes call to `build_delete' generate the - code we have to have at the end of this destructor. - `build_delete' will set the flag again. */ - TYPE_HAS_DESTRUCTOR (current_class_type) = 0; - - /* These are two cases where we cannot delegate deletion. */ - if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type) - || TYPE_GETS_REG_DELETE (current_class_type)) - exprstmt = build_delete (current_class_type, current_class_ref, integer_zero_node, - LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR|LOOKUP_NORMAL, 0); - else - exprstmt = build_delete (current_class_type, current_class_ref, in_charge_node, - LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR|LOOKUP_NORMAL, 0); - - /* If we did not assign to this, then `this' is non-zero at - the end of a destructor. As a special optimization, don't - emit test if this is an empty destructor. If it does nothing, - it does nothing. If it calls a base destructor, the base - destructor will perform the test. */ - - if (exprstmt != error_mark_node - && (TREE_CODE (exprstmt) != NOP_EXPR - || TREE_OPERAND (exprstmt, 0) != integer_zero_node - || TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))) - { - expand_label (dtor_label); - if (cond != integer_one_node) - expand_start_cond (cond, 0); - if (exprstmt != void_zero_node) - /* Don't call `expand_expr_stmt' if we're not going to do - anything, since -Wall will give a diagnostic. */ - expand_expr_stmt (exprstmt); - - /* Run destructor on all virtual baseclasses. */ - if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type)) - { - tree vbases = nreverse (copy_list (CLASSTYPE_VBASECLASSES (current_class_type))); - expand_start_cond (build (BIT_AND_EXPR, integer_type_node, - in_charge_node, integer_two_node), 0); - while (vbases) - { - if (TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (vbases))) - { - tree vb = get_vbase - (BINFO_TYPE (vbases), - TYPE_BINFO (current_class_type)); - expand_expr_stmt - (build_scoped_method_call - (current_class_ref, vb, dtor_identifier, - build_expr_list (NULL_TREE, integer_zero_node))); - } - vbases = TREE_CHAIN (vbases); - } - expand_end_cond (); - } - - do_pending_stack_adjust (); - if (cond != integer_one_node) - expand_end_cond (); - } - - virtual_size = c_sizeof (current_class_type); - - /* At the end, call delete if that's what's requested. */ - - /* FDIS sez: At the point of definition of a virtual destructor - (including an implicit definition), non-placement operator - delete shall be looked up in the scope of the destructor's - class and if found shall be accessible and unambiguous. - - This is somewhat unclear, but I take it to mean that if the - class only defines placement deletes we don't do anything here. - So we pass LOOKUP_SPECULATIVELY; delete_sanity will complain - for us if they ever try to delete one of these. */ - - if (TYPE_GETS_REG_DELETE (current_class_type) - || TYPE_USES_VIRTUAL_BASECLASSES (current_class_type)) - exprstmt = build_op_delete_call - (DELETE_EXPR, current_class_ptr, virtual_size, - LOOKUP_NORMAL | LOOKUP_SPECULATIVELY, NULL_TREE); - else - exprstmt = NULL_TREE; - - if (exprstmt) - { - cond = build (BIT_AND_EXPR, integer_type_node, - in_charge_node, integer_one_node); - expand_start_cond (cond, 0); - expand_expr_stmt (exprstmt); - expand_end_cond (); - } - - /* End of destructor. */ - expand_end_bindings (NULL_TREE, getdecls () != NULL_TREE, 0); - poplevel (getdecls () != NULL_TREE, 0, 0); - - /* Back to the top of destructor. */ - /* Don't execute destructor code if `this' is NULL. */ - - start_sequence (); - - /* If the dtor is empty, and we know there is not possible way we - could use any vtable entries, before they are possibly set by - a base class dtor, we don't have to setup the vtables, as we - know that any base class dtoring will set up any vtables it - needs. We avoid MI, because one base class dtor can do a - virtual dispatch to an overridden function that would need to - have a non-related vtable set up, we cannot avoid setting up - vtables in that case. We could change this to see if there is - just one vtable. */ - if (! empty_dtor || TYPE_USES_COMPLEX_INHERITANCE (current_class_type)) - { - /* Make all virtual function table pointers in non-virtual base - classes point to CURRENT_CLASS_TYPE's virtual function - tables. */ - expand_direct_vtbls_init (binfo, binfo, 1, 0, current_class_ptr); - - if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type)) - expand_indirect_vtbls_init (binfo, current_class_ref, current_class_ptr); - } - - if (! ok_to_optimize_dtor) - { - cond = build_binary_op (NE_EXPR, - current_class_ptr, integer_zero_node, 1); - expand_start_cond (cond, 0); - } - - insns = get_insns (); - end_sequence (); - - last_parm_insn = get_first_nonparm_insn (); - if (last_parm_insn == NULL_RTX) - last_parm_insn = get_last_insn (); - else - last_parm_insn = previous_insn (last_parm_insn); - - emit_insns_after (insns, last_parm_insn); - - if (! ok_to_optimize_dtor) - expand_end_cond (); - } - else if (current_function_assigns_this) - { - /* Does not need to call emit_base_init, because - that is done (if needed) just after assignment to this - is seen. */ - - if (DECL_CONSTRUCTOR_P (current_function_decl)) - { - end_protect_partials (); - expand_label (ctor_label); - ctor_label = NULL_TREE; - - if (call_poplevel) - { - decls = getdecls (); - expand_end_bindings (decls, decls != NULL_TREE, 0); - poplevel (decls != NULL_TREE, 0, 0); - } - /* c_expand_return knows to return 'this' from a constructor. */ - c_expand_return (NULL_TREE); - } - else if (TREE_CODE (TREE_TYPE (DECL_RESULT (current_function_decl))) != VOID_TYPE - && return_label != NULL_RTX) - no_return_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); - - current_function_assigns_this = 0; - current_function_just_assigned_this = 0; - base_init_expr = NULL_TREE; - } - else if (DECL_CONSTRUCTOR_P (fndecl)) - { - tree cond = NULL_TREE, thenclause = NULL_TREE; - /* Allow constructor for a type to get a new instance of the object - using `build_new'. */ - tree abstract_virtuals = CLASSTYPE_ABSTRACT_VIRTUALS (current_class_type); - CLASSTYPE_ABSTRACT_VIRTUALS (current_class_type) = NULL_TREE; - - DECL_RETURNS_FIRST_ARG (fndecl) = 1; - - if (flag_this_is_variable > 0) - { - cond = build_binary_op (EQ_EXPR, - current_class_ptr, integer_zero_node, 1); - thenclause = build_modify_expr (current_class_ptr, NOP_EXPR, - build_new (NULL_TREE, current_class_type, void_type_node, 0)); - } - - CLASSTYPE_ABSTRACT_VIRTUALS (current_class_type) = abstract_virtuals; - - start_sequence (); - - if (flag_this_is_variable > 0) - { - expand_start_cond (cond, 0); - expand_expr_stmt (thenclause); - expand_end_cond (); - } - - /* Emit insns from `emit_base_init' which sets up virtual - function table pointer(s). */ - if (base_init_expr) - { - expand_expr_stmt (base_init_expr); - base_init_expr = NULL_TREE; - } - - insns = get_insns (); - end_sequence (); - - /* This is where the body of the constructor begins. */ - - emit_insns_after (insns, last_parm_cleanup_insn); - - end_protect_partials (); - - /* This is where the body of the constructor ends. */ - expand_label (ctor_label); - ctor_label = NULL_TREE; - - if (call_poplevel) - { - decls = getdecls (); - expand_end_bindings (decls, decls != NULL_TREE, 0); - poplevel (decls != NULL_TREE, 1, 0); - } - - /* c_expand_return knows to return 'this' from a constructor. */ - c_expand_return (NULL_TREE); - - current_function_assigns_this = 0; - current_function_just_assigned_this = 0; - } - else if (DECL_MAIN_P (fndecl)) - { - /* Make it so that `main' always returns 0 by default. */ -#ifdef VMS - c_expand_return (integer_one_node); -#else - c_expand_return (integer_zero_node); -#endif - } - else if (return_label != NULL_RTX - && current_function_return_value == NULL_TREE - && ! DECL_NAME (DECL_RESULT (current_function_decl))) - no_return_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); - - if (flag_exceptions) - expand_exception_blocks (); - - /* If this function is supposed to return a value, ensure that - we do not fall into the cleanups by mistake. The end of our - function will look like this: - - user code (may have return stmt somewhere) - goto no_return_label - cleanup_label: - cleanups - goto return_label - no_return_label: - NOTE_INSN_FUNCTION_END - return_label: - things for return - - If the user omits a return stmt in the USER CODE section, we - will have a control path which reaches NOTE_INSN_FUNCTION_END. - Otherwise, we won't. */ - if (no_return_label) - { - DECL_CONTEXT (no_return_label) = fndecl; - DECL_INITIAL (no_return_label) = error_mark_node; - DECL_SOURCE_FILE (no_return_label) = input_filename; - DECL_SOURCE_LINE (no_return_label) = lineno; - expand_goto (no_return_label); - } - - if (cleanup_label) - { - /* Remove the binding contour which is used - to catch cleanup-generated temporaries. */ - expand_end_bindings (0, 0, 0); - poplevel (0, 0, 0); - - /* Emit label at beginning of cleanup code for parameters. */ - emit_label (cleanup_label); - } - - /* Get return value into register if that's where it's supposed to be. */ - if (original_result_rtx) - fixup_result_decl (DECL_RESULT (fndecl), original_result_rtx); - - /* Finish building code that will trigger warnings if users forget - to make their functions return values. */ - if (no_return_label || cleanup_label) - emit_jump (return_label); - if (no_return_label) - { - /* We don't need to call `expand_*_return' here because we - don't need any cleanups here--this path of code is only - for error checking purposes. */ - expand_label (no_return_label); - } - - /* Generate rtl for function exit. */ - expand_function_end (input_filename, lineno, 1); - } - - /* If we're processing a template, squirrel away the definition - until we do an instantiation. */ - if (processing_template_decl) - { - --minimal_parse_mode; - DECL_SAVED_TREE (fndecl) = TREE_CHAIN (DECL_SAVED_TREE (fndecl)); - /* We have to save this value here in case - maybe_end_member_template_processing decides to pop all the - template parameters. */ - in_template = 1; - } - else - in_template = 0; - - /* This must come after expand_function_end because cleanups might - have declarations (from inline functions) that need to go into - this function's blocks. */ - if (current_binding_level->parm_flag != 1) - my_friendly_abort (122); - poplevel (1, 0, 1); - - /* If this is a in-class inline definition, we may have to pop the - bindings for the template parameters that we added in - maybe_begin_member_template_processing when start_function was - called. */ - if (inclass_inline) - maybe_end_member_template_processing (); - - /* Reset scope for C++: if we were in the scope of a class, - then when we finish this function, we are not longer so. - This cannot be done until we know for sure that no more - class members will ever be referenced in this function - (i.e., calls to destructors). */ - if (current_class_name) - { - ctype = current_class_type; - pop_nested_class (1); - } - - /* Must mark the RESULT_DECL as being in this function. */ - DECL_CONTEXT (DECL_RESULT (fndecl)) = fndecl; - - /* Set the BLOCK_SUPERCONTEXT of the outermost function scope to point - to the FUNCTION_DECL node itself. */ - BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl; - - if (!in_template) - { - int saved_flag_keep_inline_functions = - flag_keep_inline_functions; - - /* So we can tell if jump_optimize sets it to 1. */ - can_reach_end = 0; - - if (DECL_CONTEXT (fndecl) != NULL_TREE - && hack_decl_function_context (fndecl)) - /* Trick rest_of_compilation into not deferring output of this - function, even if it is inline, since the rtl_obstack for - this function is the function_obstack of the enclosing - function and will be deallocated when the enclosing - function is gone. See save_tree_status. */ - flag_keep_inline_functions = 1; - - /* Run the optimizers and output the assembler code for this - function. */ - - if (DECL_ARTIFICIAL (fndecl)) - { - /* Do we really *want* to inline this synthesized method? */ - - int save_fif = flag_inline_functions; - flag_inline_functions = 1; - - /* Turn off DECL_INLINE for the moment so function_cannot_inline_p - will check our size. */ - DECL_INLINE (fndecl) = 0; - - rest_of_compilation (fndecl); - flag_inline_functions = save_fif; - } - else - rest_of_compilation (fndecl); - - flag_keep_inline_functions = saved_flag_keep_inline_functions; - - if (DECL_SAVED_INSNS (fndecl) && ! TREE_ASM_WRITTEN (fndecl)) - { - /* Set DECL_EXTERNAL so that assemble_external will be called as - necessary. We'll clear it again in finish_file. */ - if (! DECL_EXTERNAL (fndecl)) - DECL_NOT_REALLY_EXTERN (fndecl) = 1; - DECL_EXTERNAL (fndecl) = 1; - mark_inline_for_output (fndecl); - } - - if (ctype && TREE_ASM_WRITTEN (fndecl)) - note_debug_info_needed (ctype); - - current_function_returns_null |= can_reach_end; - - /* Since we don't normally go through c_expand_return for constructors, - this normally gets the wrong value. - Also, named return values have their return codes emitted after - NOTE_INSN_FUNCTION_END, confusing jump.c. */ - if (DECL_CONSTRUCTOR_P (fndecl) - || DECL_NAME (DECL_RESULT (fndecl)) != NULL_TREE) - current_function_returns_null = 0; - - if (TREE_THIS_VOLATILE (fndecl) && current_function_returns_null) - cp_warning ("`noreturn' function `%D' does return", fndecl); - else if ((warn_return_type || pedantic) - && current_function_returns_null - && TREE_CODE (TREE_TYPE (fntype)) != VOID_TYPE) - { - /* If this function returns non-void and control can drop through, - complain. */ - cp_warning ("control reaches end of non-void function `%D'", fndecl); - } - /* With just -W, complain only if function returns both with - and without a value. */ - else if (extra_warnings - && current_function_returns_value && current_function_returns_null) - warning ("this function may return with or without a value"); - } - - --function_depth; - - /* Free all the tree nodes making up this function. */ - /* Switch back to allocating nodes permanently - until we start another function. */ - if (! nested) - permanent_allocation (1); - - if (DECL_SAVED_INSNS (fndecl) == NULL_RTX) - { - tree t; - - /* Stop pointing to the local nodes about to be freed. */ - /* But DECL_INITIAL must remain nonzero so we know this - was an actual function definition. */ - DECL_INITIAL (fndecl) = error_mark_node; - for (t = DECL_ARGUMENTS (fndecl); t; t = TREE_CHAIN (t)) - DECL_RTL (t) = DECL_INCOMING_RTL (t) = NULL_RTX; - } - - if (DECL_STATIC_CONSTRUCTOR (fndecl)) - static_ctors = perm_tree_cons (NULL_TREE, fndecl, static_ctors); - if (DECL_STATIC_DESTRUCTOR (fndecl)) - static_dtors = perm_tree_cons (NULL_TREE, fndecl, static_dtors); - - if (! nested) - { - /* Let the error reporting routines know that we're outside a - function. For a nested function, this value is used in - pop_cp_function_context and then reset via pop_function_context. */ - current_function_decl = NULL_TREE; - } - - named_label_uses = NULL; - current_class_ptr = NULL_TREE; - current_class_ref = NULL_TREE; -} - -/* Create the FUNCTION_DECL for a function definition. - DECLSPECS and DECLARATOR are the parts of the declaration; - they describe the return type and the name of the function, - but twisted together in a fashion that parallels the syntax of C. - - This function creates a binding context for the function body - as well as setting up the FUNCTION_DECL in current_function_decl. - - Returns a FUNCTION_DECL on success. - - If the DECLARATOR is not suitable for a function (it defines a datum - instead), we return 0, which tells yyparse to report a parse error. - - May return void_type_node indicating that this method is actually - a friend. See grokfield for more details. - - Came here with a `.pushlevel' . - - DO NOT MAKE ANY CHANGES TO THIS CODE WITHOUT MAKING CORRESPONDING - CHANGES TO CODE IN `grokfield'. */ - -tree -start_method (declspecs, declarator, attrlist) - tree declarator, declspecs, attrlist; -{ - tree fndecl = grokdeclarator (declarator, declspecs, MEMFUNCDEF, 0, - attrlist); - - /* Something too ugly to handle. */ - if (fndecl == NULL_TREE) - return NULL_TREE; - - /* Pass friends other than inline friend functions back. */ - if (fndecl == void_type_node) - return fndecl; - - if (TREE_CODE (fndecl) != FUNCTION_DECL) - /* Not a function, tell parser to report parse error. */ - return NULL_TREE; - - if (IS_SIGNATURE (current_class_type)) - IS_DEFAULT_IMPLEMENTATION (fndecl) = 1; - - if (DECL_IN_AGGR_P (fndecl)) - { - if (IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (fndecl)) != current_class_type) - { - if (DECL_CONTEXT (fndecl) - && TREE_CODE( DECL_CONTEXT (fndecl)) != NAMESPACE_DECL) - cp_error ("`%D' is already defined in class %s", fndecl, - TYPE_NAME_STRING (DECL_CONTEXT (fndecl))); - } - return void_type_node; - } - - check_template_shadow (fndecl); - - DECL_THIS_INLINE (fndecl) = 1; - - if (flag_default_inline) - DECL_INLINE (fndecl) = 1; - - /* We process method specializations in finish_struct_1. */ - if (processing_template_decl && !DECL_TEMPLATE_SPECIALIZATION (fndecl)) - fndecl = push_template_decl (fndecl); - - /* We read in the parameters on the maybepermanent_obstack, - but we won't be getting back to them until after we - may have clobbered them. So the call to preserve_data - will keep them safe. */ - preserve_data (); - - if (! DECL_FRIEND_P (fndecl)) - { - if (TREE_CHAIN (fndecl)) - { - fndecl = copy_node (fndecl); - TREE_CHAIN (fndecl) = NULL_TREE; - } - - if (DECL_CONSTRUCTOR_P (fndecl)) - { - if (! grok_ctor_properties (current_class_type, fndecl)) - return void_type_node; - } - else if (IDENTIFIER_OPNAME_P (DECL_NAME (fndecl))) - grok_op_properties (fndecl, DECL_VIRTUAL_P (fndecl), 0); - } - - cp_finish_decl (fndecl, NULL_TREE, NULL_TREE, 0, 0); - - /* Make a place for the parms */ - pushlevel (0); - current_binding_level->parm_flag = 1; - - DECL_IN_AGGR_P (fndecl) = 1; - return fndecl; -} - -/* Go through the motions of finishing a function definition. - We don't compile this method until after the whole class has - been processed. - - FINISH_METHOD must return something that looks as though it - came from GROKFIELD (since we are defining a method, after all). - - This is called after parsing the body of the function definition. - STMTS is the chain of statements that makes up the function body. - - DECL is the ..._DECL that `start_method' provided. */ - -tree -finish_method (decl) - tree decl; -{ - register tree fndecl = decl; - tree old_initial; - - register tree link; - - if (decl == void_type_node) - return decl; - - old_initial = DECL_INITIAL (fndecl); - - /* Undo the level for the parms (from start_method). - This is like poplevel, but it causes nothing to be - saved. Saving information here confuses symbol-table - output routines. Besides, this information will - be correctly output when this method is actually - compiled. */ - - /* Clear out the meanings of the local variables of this level; - also record in each decl which block it belongs to. */ - - for (link = current_binding_level->names; link; link = TREE_CHAIN (link)) - { - if (DECL_NAME (link) != NULL_TREE) - pop_binding (DECL_NAME (link), link); - my_friendly_assert (TREE_CODE (link) != FUNCTION_DECL, 163); - DECL_CONTEXT (link) = NULL_TREE; - } - - GNU_xref_end_scope ((HOST_WIDE_INT) current_binding_level, - (HOST_WIDE_INT) current_binding_level->level_chain, - current_binding_level->parm_flag, - current_binding_level->keep); - - poplevel (0, 0, 0); - - DECL_INITIAL (fndecl) = old_initial; - - /* We used to check if the context of FNDECL was different from - current_class_type as another way to get inside here. This didn't work - for String.cc in libg++. */ - if (DECL_FRIEND_P (fndecl)) - { - CLASSTYPE_INLINE_FRIENDS (current_class_type) - = tree_cons (NULL_TREE, fndecl, CLASSTYPE_INLINE_FRIENDS (current_class_type)); - decl = void_type_node; - } - - return decl; -} - -/* Called when a new struct TYPE is defined. - If this structure or union completes the type of any previous - variable declaration, lay it out and output its rtl. */ - -void -hack_incomplete_structures (type) - tree type; -{ - tree *list; - - if (current_binding_level->incomplete == NULL_TREE) - return; - - if (!type) /* Don't do this for class templates. */ - return; - - for (list = ¤t_binding_level->incomplete; *list; ) - { - tree decl = TREE_VALUE (*list); - if ((decl && TREE_TYPE (decl) == type) - || (TREE_TYPE (decl) - && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE - && TREE_TYPE (TREE_TYPE (decl)) == type)) - { - int toplevel = toplevel_bindings_p (); - if (TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE - && TREE_TYPE (TREE_TYPE (decl)) == type) - layout_type (TREE_TYPE (decl)); - layout_decl (decl, 0); - rest_of_decl_compilation (decl, NULL_PTR, toplevel, 0); - if (! toplevel) - { - tree cleanup; - expand_decl (decl); - cleanup = maybe_build_cleanup (decl); - expand_decl_init (decl); - if (! expand_decl_cleanup (decl, cleanup)) - cp_error ("parser lost in parsing declaration of `%D'", - decl); - } - *list = TREE_CHAIN (*list); - } - else - list = &TREE_CHAIN (*list); - } -} - -/* If DECL is of a type which needs a cleanup, build that cleanup here. - See build_delete for information about AUTO_DELETE. - - Don't build these on the momentary obstack; they must live - the life of the binding contour. */ - -static tree -maybe_build_cleanup_1 (decl, auto_delete) - tree decl, auto_delete; -{ - tree type = TREE_TYPE (decl); - if (TYPE_NEEDS_DESTRUCTOR (type)) - { - int temp = 0, flags = LOOKUP_NORMAL|LOOKUP_DESTRUCTOR; - tree rval; - - if (TREE_CODE (decl) != PARM_DECL) - temp = suspend_momentary (); - - if (TREE_CODE (type) == ARRAY_TYPE) - rval = decl; - else - { - mark_addressable (decl); - rval = build_unary_op (ADDR_EXPR, decl, 0); - } - - /* Optimize for space over speed here. */ - if (! TYPE_USES_VIRTUAL_BASECLASSES (type) - || flag_expensive_optimizations) - flags |= LOOKUP_NONVIRTUAL; - - rval = build_delete (TREE_TYPE (rval), rval, auto_delete, flags, 0); - - if (TYPE_USES_VIRTUAL_BASECLASSES (type) - && ! TYPE_HAS_DESTRUCTOR (type)) - rval = build_compound_expr (expr_tree_cons (NULL_TREE, rval, - build_expr_list (NULL_TREE, build_vbase_delete (type, decl)))); - - if (TREE_CODE (decl) != PARM_DECL) - resume_momentary (temp); - - return rval; - } - return 0; -} - -/* If DECL is of a type which needs a cleanup, build that cleanup - here. The cleanup does free the storage with a call to delete. */ - -tree -maybe_build_cleanup_and_delete (decl) - tree decl; -{ - return maybe_build_cleanup_1 (decl, integer_three_node); -} - -/* If DECL is of a type which needs a cleanup, build that cleanup - here. The cleanup does not free the storage with a call a delete. */ - -tree -maybe_build_cleanup (decl) - tree decl; -{ - return maybe_build_cleanup_1 (decl, integer_two_node); -} - -/* Expand a C++ expression at the statement level. - This is needed to ferret out nodes which have UNKNOWN_TYPE. - The C++ type checker should get all of these out when - expressions are combined with other, type-providing, expressions, - leaving only orphan expressions, such as: - - &class::bar; / / takes its address, but does nothing with it. */ - -void -cplus_expand_expr_stmt (exp) - tree exp; -{ - if (processing_template_decl) - { - add_tree (build_min_nt (EXPR_STMT, exp)); - return; - } - - /* Arrange for all temps to disappear. */ - expand_start_target_temps (); - - if (TREE_TYPE (exp) == unknown_type_node) - { - if (TREE_CODE (exp) == COMPONENT_REF) - error ("invalid reference to a member function name, did you forget the ()?"); - else - error ("address of overloaded function with no contextual type information"); - } - else - { - if (TREE_CODE (exp) == FUNCTION_DECL) - { - cp_warning ("reference, not call, to function `%D'", exp); - warning ("at this point in file"); - } - -#if 0 - /* We should do this eventually, but right now this causes regex.o from - libg++ to miscompile, and tString to core dump. */ - exp = build1 (CLEANUP_POINT_EXPR, TREE_TYPE (exp), exp); -#endif - - /* Strip unused implicit INDIRECT_REFs of references. */ - if (TREE_CODE (exp) == INDIRECT_REF - && TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == REFERENCE_TYPE) - exp = TREE_OPERAND (exp, 0); - - /* If we don't do this, we end up down inside expand_expr - trying to do TYPE_MODE on the ERROR_MARK, and really - go outside the bounds of the type. */ - if (exp != error_mark_node) - expand_expr_stmt (break_out_cleanups (exp)); - } - - /* Clean up any pending cleanups. This happens when a function call - returns a cleanup-needing value that nobody uses. */ - expand_end_target_temps (); -} - -/* When a stmt has been parsed, this function is called. - - Currently, this function only does something within a - constructor's scope: if a stmt has just assigned to this, - and we are in a derived class, we call `emit_base_init'. */ - -void -finish_stmt () -{ - extern struct nesting *cond_stack, *loop_stack, *case_stack; - - - if (current_function_assigns_this - || ! current_function_just_assigned_this) - return; - if (DECL_CONSTRUCTOR_P (current_function_decl)) - { - /* Constructors must wait until we are out of control - zones before calling base constructors. */ - if (cond_stack || loop_stack || case_stack) - return; - expand_expr_stmt (base_init_expr); - check_base_init (current_class_type); - } - current_function_assigns_this = 1; -} - -/* Change a static member function definition into a FUNCTION_TYPE, instead - of the METHOD_TYPE that we create when it's originally parsed. - - WARNING: DO NOT pass &TREE_TYPE (decl) to FN or &TYPE_ARG_TYPES - (TREE_TYPE (decl)) to ARGTYPES, as doing so will corrupt the types of - other decls. Either pass the addresses of local variables or NULL. */ - -void -revert_static_member_fn (decl, fn, argtypes) - tree *decl, *fn, *argtypes; -{ - tree tmp; - tree function = fn ? *fn : TREE_TYPE (*decl); - tree args = argtypes ? *argtypes : TYPE_ARG_TYPES (function); - - if (CP_TYPE_QUALS (TREE_TYPE (TREE_VALUE (args))) - != TYPE_UNQUALIFIED) - cp_error ("static member function `%#D' declared with type qualifiers", - *decl); - - args = TREE_CHAIN (args); - tmp = build_function_type (TREE_TYPE (function), args); - tmp = build_qualified_type (tmp, CP_TYPE_QUALS (function)); - tmp = build_exception_variant (tmp, - TYPE_RAISES_EXCEPTIONS (function)); - TREE_TYPE (*decl) = tmp; - if (DECL_ARGUMENTS (*decl)) - DECL_ARGUMENTS (*decl) = TREE_CHAIN (DECL_ARGUMENTS (*decl)); - DECL_STATIC_FUNCTION_P (*decl) = 1; - if (fn) - *fn = tmp; - if (argtypes) - *argtypes = args; -} - -int -id_in_current_class (id) - tree id; -{ - return !!purpose_member (id, class_binding_level->class_shadowed); -} - -struct cp_function -{ - int returns_value; - int returns_null; - int assigns_this; - int just_assigned_this; - int parms_stored; - int temp_name_counter; - tree named_labels; - struct named_label_list *named_label_uses; - tree shadowed_labels; - tree ctor_label; - tree dtor_label; - rtx last_dtor_insn; - rtx last_parm_cleanup_insn; - tree base_init_list; - tree member_init_list; - tree base_init_expr; - tree current_class_ptr; - tree current_class_ref; - rtx result_rtx; - struct cp_function *next; - struct binding_level *binding_level; - int static_labelno; -}; - -static struct cp_function *cp_function_chain; - -extern int temp_name_counter; - -/* Save and reinitialize the variables - used during compilation of a C++ function. */ - -void -push_cp_function_context (context) - tree context; -{ - struct cp_function *p - = (struct cp_function *) xmalloc (sizeof (struct cp_function)); - - push_function_context_to (context); - - p->next = cp_function_chain; - cp_function_chain = p; - - p->named_labels = named_labels; - p->named_label_uses = named_label_uses; - p->shadowed_labels = shadowed_labels; - p->returns_value = current_function_returns_value; - p->returns_null = current_function_returns_null; - p->binding_level = current_binding_level; - p->ctor_label = ctor_label; - p->dtor_label = dtor_label; - p->last_dtor_insn = last_dtor_insn; - p->last_parm_cleanup_insn = last_parm_cleanup_insn; - p->assigns_this = current_function_assigns_this; - p->just_assigned_this = current_function_just_assigned_this; - p->parms_stored = current_function_parms_stored; - p->result_rtx = original_result_rtx; - p->base_init_expr = base_init_expr; - p->temp_name_counter = temp_name_counter; - p->base_init_list = current_base_init_list; - p->member_init_list = current_member_init_list; - p->current_class_ptr = current_class_ptr; - p->current_class_ref = current_class_ref; - p->static_labelno = static_labelno; -} - -/* Restore the variables used during compilation of a C++ function. */ - -void -pop_cp_function_context (context) - tree context; -{ - struct cp_function *p = cp_function_chain; - tree link; - - /* Bring back all the labels that were shadowed. */ - for (link = shadowed_labels; link; link = TREE_CHAIN (link)) - if (DECL_NAME (TREE_VALUE (link)) != 0) - SET_IDENTIFIER_LABEL_VALUE (DECL_NAME (TREE_VALUE (link)), - TREE_VALUE (link)); - - pop_function_context_from (context); - - cp_function_chain = p->next; - - named_labels = p->named_labels; - named_label_uses = p->named_label_uses; - shadowed_labels = p->shadowed_labels; - current_function_returns_value = p->returns_value; - current_function_returns_null = p->returns_null; - current_binding_level = p->binding_level; - ctor_label = p->ctor_label; - dtor_label = p->dtor_label; - last_dtor_insn = p->last_dtor_insn; - last_parm_cleanup_insn = p->last_parm_cleanup_insn; - current_function_assigns_this = p->assigns_this; - current_function_just_assigned_this = p->just_assigned_this; - current_function_parms_stored = p->parms_stored; - original_result_rtx = p->result_rtx; - base_init_expr = p->base_init_expr; - temp_name_counter = p->temp_name_counter; - current_base_init_list = p->base_init_list; - current_member_init_list = p->member_init_list; - current_class_ptr = p->current_class_ptr; - current_class_ref = p->current_class_ref; - static_labelno = p->static_labelno; - - free (p); -} - -int -in_function_p () -{ - return function_depth != 0; -} diff --git a/gcc/cp/decl.h b/gcc/cp/decl.h deleted file mode 100755 index f55dca5..0000000 --- a/gcc/cp/decl.h +++ /dev/null @@ -1,59 +0,0 @@ -/* Variables and structures for declaration processing. - Copyright (C) 1993 Free Software Foundation, Inc. - -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 -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -/* In grokdeclarator, distinguish syntactic contexts of declarators. */ -enum decl_context -{ NORMAL, /* Ordinary declaration */ - FUNCDEF, /* Function definition */ - PARM, /* Declaration of parm before function body */ - CATCHPARM, /* Declaration of catch parm */ - FIELD, /* Declaration inside struct or union */ - BITFIELD, /* Likewise but with specified width */ - TYPENAME, /* Typename (inside cast or sizeof) */ - MEMFUNCDEF /* Member function definition */ -}; - -/* We need this in here to get the decl_context definition. */ -extern tree grokdeclarator PROTO((tree, tree, enum decl_context, int, tree)); - -/* C++: Keep these around to reduce calls to `get_identifier'. - Identifiers for `this' in member functions and the auto-delete - parameter for destructors. */ -extern tree this_identifier, in_charge_identifier; - -/* Parsing a function declarator leaves a list of parameter names - or a chain or parameter decls here. */ -extern tree last_function_parms; - -/* A list of static class variables. This is needed, because a - static class variable can be declared inside the class without - an initializer, and then initialized, staticly, outside the class. */ -extern tree pending_statics; - -/* A list of objects which have constructors or destructors - which reside in the global scope. The decl is stored in - the TREE_VALUE slot and the initializer is stored - in the TREE_PURPOSE slot. */ -extern tree static_aggregates; - -#ifdef DEBUG_CP_BINDING_LEVELS -/* Purely for debugging purposes. */ -extern int debug_bindings_indentation; -#endif diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c deleted file mode 100755 index 91c38da..0000000 --- a/gcc/cp/decl2.c +++ /dev/null @@ -1,5040 +0,0 @@ -/* Process declarations and variables for C compiler. - Copyright (C) 1988, 92-98, 1999 Free Software Foundation, Inc. - Hacked by Michael Tiemann (tiemann@cygnus.com) - -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 -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - - -/* Process declarations and symbol lookup for C front end. - Also constructs types; the standard scalar types at initialization, - and structure, union, array and enum types when they are declared. */ - -/* ??? not all decl nodes are given the most useful possible - line numbers. For example, the CONST_DECLs for enum values. */ - -#include "config.h" -#include "system.h" -#include "tree.h" -#include "rtl.h" -#include "flags.h" -#include "cp-tree.h" -#include "decl.h" -#include "lex.h" -#include "output.h" -#include "except.h" -#include "expr.h" -#include "defaults.h" -#include "toplev.h" -#include "dwarf2out.h" -#include "dwarfout.h" - -#if USE_CPPLIB -#include "cpplib.h" -extern cpp_reader parse_in; -#endif - -static tree get_sentry PROTO((tree)); -static void mark_vtable_entries PROTO((tree)); -static void grok_function_init PROTO((tree, tree)); -static int finish_vtable_vardecl PROTO((tree, tree)); -static int prune_vtable_vardecl PROTO((tree, tree)); -static void finish_sigtable_vardecl PROTO((tree, tree)); -static int is_namespace_ancestor PROTO((tree, tree)); -static void add_using_namespace PROTO((tree, tree, int)); -static tree ambiguous_decl PROTO((tree, tree, tree,int)); -static tree build_anon_union_vars PROTO((tree, tree*, int, int)); -static void check_decl_namespace PROTO((void)); - -extern int current_class_depth; - -/* A list of virtual function tables we must make sure to write out. */ -tree pending_vtables; - -/* A list of static class variables. This is needed, because a - static class variable can be declared inside the class without - an initializer, and then initialized, staticly, outside the class. */ -tree pending_statics; - -/* A list of functions which were declared inline, but which we - may need to emit outline anyway. */ -static tree saved_inlines; - -/* Used to help generate temporary names which are unique within - a function. Reset to 0 by start_function. */ - -int temp_name_counter; - -/* Same, but not reset. Local temp variables and global temp variables - can have the same name. */ -static int global_temp_name_counter; - -/* Flag used when debugging spew.c */ - -extern int spew_debug; - -/* Nonzero if we're done parsing and into end-of-file activities. */ - -int at_eof; - -/* Functions called along with real static constructors and destructors. */ - -tree static_ctors, static_dtors; - -/* The current open namespace, and ::. */ - -tree current_namespace; -tree global_namespace; - -/* The stack for namespaces of current declarations. */ - -static tree decl_namespace_list; - - -/* C (and C++) language-specific option variables. */ - -/* Nonzero means allow type mismatches in conditional expressions; - just make their values `void'. */ - -int flag_cond_mismatch; - -/* Nonzero means give `double' the same size as `float'. */ - -int flag_short_double; - -/* Nonzero means don't recognize the keyword `asm'. */ - -int flag_no_asm; - -/* Nonzero means don't recognize any extension keywords. */ - -int flag_no_gnu_keywords; - -/* Nonzero means don't recognize the non-ANSI builtin functions. */ - -int flag_no_builtin; - -/* Nonzero means don't recognize the non-ANSI builtin functions. - -ansi sets this. */ - -int flag_no_nonansi_builtin; - -/* Nonzero means do some things the same way PCC does. Only provided so - the compiler will link. */ - -int flag_traditional; - -/* Nonzero means to treat bitfields as unsigned unless they say `signed'. */ - -int flag_signed_bitfields = 1; - -/* Nonzero means handle `#ident' directives. 0 means ignore them. */ - -int flag_no_ident; - -/* Nonzero means enable obscure ANSI features and disable GNU extensions - that might cause ANSI-compliant code to be miscompiled. */ - -int flag_ansi; - -/* Nonzero means do emit exported implementations of functions even if - they can be inlined. */ - -int flag_implement_inlines = 1; - -/* Nonzero means do emit exported implementations of templates, instead of - multiple static copies in each file that needs a definition. */ - -int flag_external_templates; - -/* Nonzero means that the decision to emit or not emit the implementation of a - template depends on where the template is instantiated, rather than where - it is defined. */ - -int flag_alt_external_templates; - -/* Nonzero means that implicit instantiations will be emitted if needed. */ - -int flag_implicit_templates = 1; - -/* Nonzero means that implicit instantiations of inline templates will be - emitted if needed, even if instantiations of non-inline templates - aren't. */ - -int flag_implicit_inline_templates = 1; - -/* Nonzero means warn about implicit declarations. */ - -int warn_implicit = 1; - -/* Nonzero means warn about usage of long long when `-pedantic'. */ - -int warn_long_long = 1; - -/* Nonzero means warn when all ctors or dtors are private, and the class - has no friends. */ - -int warn_ctor_dtor_privacy = 1; - -/* True if we want to implement vtables using "thunks". - The default is off. */ - -#ifndef DEFAULT_VTABLE_THUNKS -#define DEFAULT_VTABLE_THUNKS 0 -#endif -int flag_vtable_thunks = DEFAULT_VTABLE_THUNKS; - -/* True if we want to deal with repository information. */ - -int flag_use_repository; - -/* Nonzero if we want to issue diagnostics that the standard says are not - required. */ - -int flag_optional_diags = 1; - -/* Nonzero means give string constants the type `const char *', as mandated - by the standard. */ - -int flag_const_strings = 1; - -/* Nonzero means warn about deprecated conversion from string constant to - `char *'. */ - -int warn_write_strings; - -/* Nonzero means warn about pointer casts that can drop a type qualifier - from the pointer target type. */ - -int warn_cast_qual; - -/* Nonzero means warn about sizeof(function) or addition/subtraction - of function pointers. */ - -int warn_pointer_arith = 1; - -/* Nonzero means warn for any function def without prototype decl. */ - -int warn_missing_prototypes; - -/* Nonzero means warn about multiple (redundant) decls for the same single - variable or function. */ - -int warn_redundant_decls; - -/* Warn if initializer is not completely bracketed. */ - -int warn_missing_braces; - -/* Warn about comparison of signed and unsigned values. */ - -int warn_sign_compare; - -/* Warn about *printf or *scanf format/argument anomalies. */ - -int warn_format; - -/* Warn about a subscript that has type char. */ - -int warn_char_subscripts; - -/* Warn if a type conversion is done that might have confusing results. */ - -int warn_conversion; - -/* Warn if adding () is suggested. */ - -int warn_parentheses; - -/* Non-zero means warn in function declared in derived class has the - same name as a virtual in the base class, but fails to match the - type signature of any virtual function in the base class. */ -int warn_overloaded_virtual; - -/* Non-zero means warn when declaring a class that has a non virtual - destructor, when it really ought to have a virtual one. */ -int warn_nonvdtor; - -/* Non-zero means warn when a function is declared extern and later inline. */ -int warn_extern_inline; - -/* Non-zero means warn when the compiler will reorder code. */ -int warn_reorder; - -/* Non-zero means warn when synthesis behavior differs from Cfront's. */ -int warn_synth; - -/* Non-zero means warn when we convert a pointer to member function - into a pointer to (void or function). */ -int warn_pmf2ptr = 1; - -/* Nonzero means warn about violation of some Effective C++ style rules. */ - -int warn_ecpp; - -/* Nonzero means warn where overload resolution chooses a promotion from - unsigned to signed over a conversion to an unsigned of the same size. */ - -int warn_sign_promo; - -/* Nonzero means warn when an old-style cast is used. */ - -int warn_old_style_cast; - -/* Warn about #pragma directives that are not recognised. */ - -int warn_unknown_pragmas; /* Tri state variable. */ - -/* Nonzero means warn about use of multicharacter literals. */ - -int warn_multichar = 1; - -/* Nonzero means warn when non-templatized friend functions are - declared within a template */ - -int warn_nontemplate_friend = 1; - -/* Nonzero means `$' can be in an identifier. */ - -#ifndef DOLLARS_IN_IDENTIFIERS -#define DOLLARS_IN_IDENTIFIERS 1 -#endif -int dollars_in_ident = DOLLARS_IN_IDENTIFIERS; - -/* Nonzero for -fno-strict-prototype switch: do not consider empty - argument prototype to mean function takes no arguments. */ - -int flag_strict_prototype = 2; -int strict_prototype = 1; -int strict_prototypes_lang_c, strict_prototypes_lang_cplusplus = 1; - -/* Nonzero means that labels can be used as first-class objects */ - -int flag_labels_ok; - -/* Non-zero means to collect statistics which might be expensive - and to print them when we are done. */ -int flag_detailed_statistics; - -/* C++ specific flags. */ -/* Zero means that `this' is a *const. This gives nice behavior in the - 2.0 world. 1 gives 1.2-compatible behavior. 2 gives Spring behavior. - -2 means we're constructing an object and it has fixed type. */ - -int flag_this_is_variable; - -/* 3 means write out only virtuals function tables `defined' - in this implementation file. - 0 means write out virtual function tables and give them - (C) static access (default). */ - -int write_virtuals; - -/* Nonzero means we should attempt to elide constructors when possible. */ - -int flag_elide_constructors = 1; - -/* Nonzero means recognize and handle signature language constructs. */ - -int flag_handle_signatures; - -/* Nonzero means that member functions defined in class scope are - inline by default. */ - -int flag_default_inline = 1; - -/* Controls whether compiler generates 'type descriptor' that give - run-time type information. */ -int flag_rtti = 1; - -/* Nonzero if we wish to output cross-referencing information - for the GNU class browser. */ -extern int flag_gnu_xref; - -/* Nonzero if we want to support huge (> 2^(sizeof(short)*8-1) bytes) - objects. */ - -int flag_huge_objects; - -/* Nonzero if we want to conserve space in the .o files. We do this - by putting uninitialized data and runtime initialized data into - .common instead of .data at the expense of not flagging multiple - definitions. */ - -int flag_conserve_space; - -/* Nonzero if we want to obey access control semantics. */ - -int flag_access_control = 1; - -/* Nonzero if we want to understand the operator names, i.e. 'bitand'. */ - -int flag_operator_names; - -/* Nonzero if we want to check the return value of new and avoid calling - constructors if it is a null pointer. */ - -int flag_check_new; - -/* Nonzero if we want the new ANSI rules for pushing a new scope for `for' - initialization variables. - 0: Old rules, set by -fno-for-scope. - 2: New ANSI rules, set by -ffor-scope. - 1: Try to implement new ANSI rules, but with backup compatibility - (and warnings). This is the default, for now. */ - -int flag_new_for_scope = 1; - -/* Nonzero if we want to emit defined symbols with common-like linkage as - weak symbols where possible, in order to conform to C++ semantics. - Otherwise, emit them as local symbols. */ - -int flag_weak = 1; - -/* CYGNUS LOCAL Embedded C++ */ -/* Nonzero if we want to adhere to the language rules of the Embedded C++ - specification. */ - -int flag_embedded_cxx = 0; -/* END CYGNUS LOCAL Embedded C++ */ - -/* Nonzero to enable experimental ABI changes. */ - -int flag_new_abi; - -/* Nonzero to not ignore namespace std. */ - -int flag_honor_std; - -/* Maximum template instantiation depth. Must be at least 17 for ANSI - compliance. */ - -int max_tinst_depth = 17; - -/* The name-mangling scheme to use. Must be 1 or greater to support - template functions with identical types, but different template - arguments. */ -int name_mangling_version = 2; - -/* Nonzero means that guiding declarations are allowed. */ -int flag_guiding_decls; - -/* Nonzero if squashed mangling is to be performed. - This uses the B and K codes to reference previously seen class types - and class qualifiers. */ -int flag_do_squangling; - -/* Nonzero means output .vtable_{entry,inherit} for use in doing vtable gc. */ - -int flag_vtable_gc; - -/* Nonzero means make the default pedwarns warnings instead of errors. - The value of this flag is ignored if -pedantic is specified. */ - -int flag_permissive; - -/* Table of language-dependent -f options. - STRING is the option name. VARIABLE is the address of the variable. - ON_VALUE is the value to store in VARIABLE - if `-fSTRING' is seen as an option. - (If `-fno-STRING' is seen as an option, the opposite value is stored.) */ - -static struct { char *string; int *variable; int on_value;} lang_f_options[] = -{ - /* C/C++ options. */ - {"signed-char", &flag_signed_char, 1}, - {"unsigned-char", &flag_signed_char, 0}, - {"signed-bitfields", &flag_signed_bitfields, 1}, - {"unsigned-bitfields", &flag_signed_bitfields, 0}, - {"short-enums", &flag_short_enums, 1}, - {"short-double", &flag_short_double, 1}, - {"cond-mismatch", &flag_cond_mismatch, 1}, - {"asm", &flag_no_asm, 0}, - {"builtin", &flag_no_builtin, 0}, - {"ident", &flag_no_ident, 0}, - -/* CYGNUS LOCAL Embedded C++ */ - {"embedded-cxx", &flag_embedded_cxx, 1}, -/* END CYGNUS LOCAL Embedded C++ */ - - /* C++-only options. */ - {"access-control", &flag_access_control, 1}, - {"check-new", &flag_check_new, 1}, - {"conserve-space", &flag_conserve_space, 1}, - {"const-strings", &flag_const_strings, 1}, - {"default-inline", &flag_default_inline, 1}, - {"dollars-in-identifiers", &dollars_in_ident, 1}, - {"elide-constructors", &flag_elide_constructors, 1}, - {"external-templates", &flag_external_templates, 1}, - {"for-scope", &flag_new_for_scope, 2}, - {"gnu-keywords", &flag_no_gnu_keywords, 0}, - {"handle-exceptions", &flag_exceptions, 1}, - {"handle-signatures", &flag_handle_signatures, 1}, - {"honor-std", &flag_honor_std, 1}, - {"huge-objects", &flag_huge_objects, 1}, - {"implement-inlines", &flag_implement_inlines, 1}, - {"implicit-inline-templates", &flag_implicit_inline_templates, 1}, - {"implicit-templates", &flag_implicit_templates, 1}, - {"labels-ok", &flag_labels_ok, 1}, - {"nonansi-builtins", &flag_no_nonansi_builtin, 0}, - {"operator-names", &flag_operator_names, 1}, - {"optional-diags", &flag_optional_diags, 1}, - {"permissive", &flag_permissive, 1}, - {"repo", &flag_use_repository, 1}, - {"rtti", &flag_rtti, 1}, - {"squangle", &flag_do_squangling, 1}, - {"stats", &flag_detailed_statistics, 1}, - {"strict-prototype", &flag_strict_prototype, 1}, - {"this-is-variable", &flag_this_is_variable, 1}, - {"vtable-gc", &flag_vtable_gc, 1}, - {"vtable-thunks", &flag_vtable_thunks, 1}, - {"weak", &flag_weak, 1}, - {"xref", &flag_gnu_xref, 1} -}; - -/* Decode the string P as a language-specific option. - Return the number of strings consumed for a valid option. - Otherwise return 0. */ - -int -lang_decode_option (argc, argv) - int argc -#if !USE_CPPLIB - ATTRIBUTE_UNUSED -#endif - ; - char **argv; - -{ - int strings_processed; - char *p = argv[0]; -#if USE_CPPLIB - strings_processed = cpp_handle_option (&parse_in, argc, argv); -#else - strings_processed = 0; -#endif /* ! USE_CPPLIB */ - - if (!strcmp (p, "-ftraditional") || !strcmp (p, "-traditional")) - /* ignore */; - else if (p[0] == '-' && p[1] == 'f') - { - /* Some kind of -f option. - P's value is the option sans `-f'. - Search for it in the table of options. */ - int found = 0; - size_t j; - - p += 2; - /* Try special -f options. */ - - if (!strcmp (p, "handle-exceptions") - || !strcmp (p, "no-handle-exceptions")) - warning ("-fhandle-exceptions has been renamed to -fexceptions (and is now on by default)"); - - if (!strcmp (p, "memoize-lookups") - || !strcmp (p, "no-memoize-lookups") - || !strcmp (p, "save-memoized") - || !strcmp (p, "no-save-memoized") - || !strcmp (p, "no-all-virtual") - || !strcmp (p, "no-enum-int-equiv") - || !strcmp (p, "nonnull-objects") - || !strcmp (p, "ansi-overloading")) - { - /* ignore */ - found = 1; - } - else if (!strcmp (p, "all-virtual") - || !strcmp (p, "enum-int-equiv") - || !strcmp (p, "no-nonnull-objects") - || !strcmp (p, "no-ansi-overloading")) - { - warning ("-f%s is no longer supported", p); - found = 1; - } - else if (! strcmp (p, "alt-external-templates")) - { - flag_external_templates = 1; - flag_alt_external_templates = 1; - found = 1; - } - else if (! strcmp (p, "no-alt-external-templates")) - { - flag_alt_external_templates = 0; - found = 1; - } - else if (!strcmp (p, "repo")) - { - flag_use_repository = 1; - flag_implicit_templates = 0; - found = 1; - } - else if (!strcmp (p, "guiding-decls")) - { - flag_guiding_decls = 1; - name_mangling_version = 0; - found = 1; - } - else if (!strcmp (p, "no-guiding-decls")) - { - flag_guiding_decls = 0; - found = 1; - } -/* CYGNUS LOCAL Embedded C++ */ - else if (!strcmp (p, "embedded-cxx")) - { - flag_embedded_cxx = 1; - flag_rtti = flag_exceptions = 0; - flag_vtable_thunks = 1; - found = 1; - } - else if (!strcmp (p, "no-embedded-cxx")) - { - flag_embedded_cxx = 0; - found = 1; - } -/* END CYGNUS LOCAL Embedded C++ */ - else if (!strcmp (p, "new-abi")) - { - flag_new_abi = 1; - flag_do_squangling = 1; - flag_honor_std = 1; - flag_vtable_thunks = 1; - } - else if (!strcmp (p, "no-new-abi")) - { - flag_new_abi = 0; - flag_do_squangling = 0; - flag_honor_std = 0; - } - else if (!strncmp (p, "template-depth-", 15)) - { - char *endp = p + 15; - while (*endp) - { - if (*endp >= '0' && *endp <= '9') - endp++; - else - { - error ("Invalid option `%s'", p - 2); - goto template_depth_lose; - } - } - max_tinst_depth = atoi (p + 15); - template_depth_lose: ; - } - else if (!strncmp (p, "name-mangling-version-", 22)) - { - char *endp = p + 22; - while (*endp) - { - if (*endp >= '0' && *endp <= '9') - endp++; - else - { - error ("Invalid option `%s'", p - 2); - goto mangling_version_lose; - } - } - name_mangling_version = atoi (p + 22); - mangling_version_lose: ; - } - else for (j = 0; - !found && j < sizeof (lang_f_options) / sizeof (lang_f_options[0]); - j++) - { - if (!strcmp (p, lang_f_options[j].string)) - { - *lang_f_options[j].variable = lang_f_options[j].on_value; - /* A goto here would be cleaner, - but breaks the vax pcc. */ - found = 1; - } - if (p[0] == 'n' && p[1] == 'o' && p[2] == '-' - && ! strcmp (p+3, lang_f_options[j].string)) - { - *lang_f_options[j].variable = ! lang_f_options[j].on_value; - found = 1; - } - } - return found; - } - else if (p[0] == '-' && p[1] == 'W') - { - int setting = 1; - - /* The -W options control the warning behavior of the compiler. */ - p += 2; - - if (p[0] == 'n' && p[1] == 'o' && p[2] == '-') - setting = 0, p += 3; - - if (!strcmp (p, "implicit")) - warn_implicit = setting; - else if (!strcmp (p, "long-long")) - warn_long_long = setting; - else if (!strcmp (p, "return-type")) - warn_return_type = setting; - else if (!strcmp (p, "ctor-dtor-privacy")) - warn_ctor_dtor_privacy = setting; - else if (!strcmp (p, "write-strings")) - warn_write_strings = setting; - else if (!strcmp (p, "cast-qual")) - warn_cast_qual = setting; - else if (!strcmp (p, "char-subscripts")) - warn_char_subscripts = setting; - else if (!strcmp (p, "pointer-arith")) - warn_pointer_arith = setting; - else if (!strcmp (p, "missing-prototypes")) - warn_missing_prototypes = setting; - else if (!strcmp (p, "redundant-decls")) - warn_redundant_decls = setting; - else if (!strcmp (p, "missing-braces")) - warn_missing_braces = setting; - else if (!strcmp (p, "sign-compare")) - warn_sign_compare = setting; - else if (!strcmp (p, "format")) - warn_format = setting; - else if (!strcmp (p, "conversion")) - warn_conversion = setting; - else if (!strcmp (p, "parentheses")) - warn_parentheses = setting; - else if (!strcmp (p, "non-virtual-dtor")) - warn_nonvdtor = setting; - else if (!strcmp (p, "extern-inline")) - warn_extern_inline = setting; - else if (!strcmp (p, "reorder")) - warn_reorder = setting; - else if (!strcmp (p, "synth")) - warn_synth = setting; - else if (!strcmp (p, "pmf-conversions")) - warn_pmf2ptr = setting; - else if (!strcmp (p, "effc++")) - warn_ecpp = setting; - else if (!strcmp (p, "sign-promo")) - warn_sign_promo = setting; - else if (!strcmp (p, "old-style-cast")) - warn_old_style_cast = setting; - else if (!strcmp (p, "overloaded-virtual")) - warn_overloaded_virtual = setting; - else if (!strcmp (p, "multichar")) - warn_multichar = setting; - else if (!strcmp (p, "unknown-pragmas")) - /* Set to greater than 1, so that even unknown pragmas in - system headers will be warned about. */ - warn_unknown_pragmas = setting * 2; - else if (!strcmp (p, "non-template-friend")) - warn_nontemplate_friend = setting; - else if (!strcmp (p, "comment")) - ; /* cpp handles this one. */ - else if (!strcmp (p, "comments")) - ; /* cpp handles this one. */ - else if (!strcmp (p, "trigraphs")) - ; /* cpp handles this one. */ - else if (!strcmp (p, "import")) - ; /* cpp handles this one. */ - else if (!strcmp (p, "all")) - { - warn_return_type = setting; - warn_unused = setting; - warn_implicit = setting; - warn_ctor_dtor_privacy = setting; - warn_switch = setting; - warn_format = setting; - warn_parentheses = setting; - warn_missing_braces = setting; - warn_sign_compare = setting; - warn_extern_inline = setting; - warn_nonvdtor = setting; - warn_multichar = setting; - /* We save the value of warn_uninitialized, since if they put - -Wuninitialized on the command line, we need to generate a - warning about not using it without also specifying -O. */ - if (warn_uninitialized != 1) - warn_uninitialized = (setting ? 2 : 0); - warn_reorder = setting; - warn_sign_promo = setting; - /* Only warn about unknown pragmas that are not in system - headers. */ - warn_unknown_pragmas = 1; - warn_nontemplate_friend = setting; - } - else return strings_processed; - } - else if (!strcmp (p, "-ansi")) - flag_no_nonansi_builtin = 1, flag_ansi = 1, - flag_no_gnu_keywords = 1, flag_operator_names = 1; -#ifdef SPEW_DEBUG - /* Undocumented, only ever used when you're invoking cc1plus by hand, since - it's probably safe to assume no sane person would ever want to use this - under normal circumstances. */ - else if (!strcmp (p, "-spew-debug")) - spew_debug = 1; -#endif - else - return strings_processed; - - return 1; -} - -/* Incorporate `const' and `volatile' qualifiers for member functions. - FUNCTION is a TYPE_DECL or a FUNCTION_DECL. - QUALS is a list of qualifiers. */ - -tree -grok_method_quals (ctype, function, quals) - tree ctype, function, quals; -{ - tree fntype = TREE_TYPE (function); - tree raises = TYPE_RAISES_EXCEPTIONS (fntype); - int type_quals = TYPE_UNQUALIFIED; - int dup_quals = TYPE_UNQUALIFIED; - - do - { - int tq = cp_type_qual_from_rid (TREE_VALUE (quals)); - - if (type_quals & tq) - dup_quals |= tq; - else - type_quals |= tq; - quals = TREE_CHAIN (quals); - } - while (quals); - - if (dup_quals != TYPE_UNQUALIFIED) - cp_error ("duplicate type qualifiers in %s declaration", - TREE_CODE (function) == FUNCTION_DECL - ? "member function" : "type"); - - ctype = cp_build_qualified_type (ctype, type_quals); - fntype = build_cplus_method_type (ctype, TREE_TYPE (fntype), - (TREE_CODE (fntype) == METHOD_TYPE - ? TREE_CHAIN (TYPE_ARG_TYPES (fntype)) - : TYPE_ARG_TYPES (fntype))); - if (raises) - fntype = build_exception_variant (fntype, raises); - - TREE_TYPE (function) = fntype; - return ctype; -} - -/* Warn when -fexternal-templates is used and #pragma - interface/implementation is not used all the times it should be, - inform the user. */ - -void -warn_if_unknown_interface (decl) - tree decl; -{ - static int already_warned = 0; - if (already_warned++) - return; - - if (flag_alt_external_templates) - { - struct tinst_level *til = tinst_for_decl (); - int sl = lineno; - char *sf = input_filename; - - if (til) - { - lineno = til->line; - input_filename = til->file; - } - cp_warning ("template `%#D' instantiated in file without #pragma interface", - decl); - lineno = sl; - input_filename = sf; - } - else - cp_warning_at ("template `%#D' defined in file without #pragma interface", - decl); -} - -/* A subroutine of the parser, to handle a component list. */ - -void -grok_x_components (specs) - tree specs; -{ - struct pending_inline **p; - tree t; - - specs = strip_attrs (specs); - - check_tag_decl (specs); - t = groktypename (build_decl_list (specs, NULL_TREE)); - - /* The only case where we need to do anything additional here is an - anonymous union field, e.g.: `struct S { union { int i; }; };'. */ - if (t == NULL_TREE || !ANON_UNION_TYPE_P (t)) - return; - - fixup_anonymous_union (t); - finish_member_declaration (build_lang_field_decl (FIELD_DECL, - NULL_TREE, - t)); - - /* Ignore any inline function definitions in the anonymous union - since an anonymous union may not have function members. */ - p = &pending_inlines; - for (; *p; *p = (*p)->next) - if (DECL_CONTEXT ((*p)->fndecl) != t) - break; -} - -/* Constructors for types with virtual baseclasses need an "in-charge" flag - saying whether this constructor is responsible for initialization of - virtual baseclasses or not. All destructors also need this "in-charge" - flag, which additionally determines whether or not the destructor should - free the memory for the object. - - This function adds the "in-charge" flag to member function FN if - appropriate. It is called from grokclassfn and tsubst. - FN must be either a constructor or destructor. */ - -void -maybe_retrofit_in_chrg (fn) - tree fn; -{ - tree basetype, arg_types, parms, parm, fntype; - - if (DECL_CONSTRUCTOR_P (fn) - && TYPE_USES_VIRTUAL_BASECLASSES (DECL_CLASS_CONTEXT (fn)) - && ! DECL_CONSTRUCTOR_FOR_VBASE_P (fn)) - /* OK */; - else if (! DECL_CONSTRUCTOR_P (fn) - && TREE_CHAIN (DECL_ARGUMENTS (fn)) == NULL_TREE) - /* OK */; - else - return; - - if (DECL_CONSTRUCTOR_P (fn)) - DECL_CONSTRUCTOR_FOR_VBASE_P (fn) = 1; - - /* First add it to DECL_ARGUMENTS... */ - parm = build_decl (PARM_DECL, in_charge_identifier, integer_type_node); - /* Mark the artificial `__in_chrg' parameter as "artificial". */ - SET_DECL_ARTIFICIAL (parm); - DECL_ARG_TYPE (parm) = integer_type_node; - TREE_READONLY (parm) = 1; - parms = DECL_ARGUMENTS (fn); - TREE_CHAIN (parm) = TREE_CHAIN (parms); - TREE_CHAIN (parms) = parm; - - /* ...and then to TYPE_ARG_TYPES. */ - arg_types = TYPE_ARG_TYPES (TREE_TYPE (fn)); - basetype = TREE_TYPE (TREE_VALUE (arg_types)); - arg_types = hash_tree_chain (integer_type_node, TREE_CHAIN (arg_types)); - fntype = build_cplus_method_type (basetype, TREE_TYPE (TREE_TYPE (fn)), - arg_types); - if (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn))) - fntype = build_exception_variant (fntype, - TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn))); - TREE_TYPE (fn) = fntype; -} - -/* Classes overload their constituent function names automatically. - When a function name is declared in a record structure, - its name is changed to it overloaded name. Since names for - constructors and destructors can conflict, we place a leading - '$' for destructors. - - CNAME is the name of the class we are grokking for. - - FUNCTION is a FUNCTION_DECL. It was created by `grokdeclarator'. - - FLAGS contains bits saying what's special about today's - arguments. 1 == DESTRUCTOR. 2 == OPERATOR. - - If FUNCTION is a destructor, then we must add the `auto-delete' field - as a second parameter. There is some hair associated with the fact - that we must "declare" this variable in the manner consistent with the - way the rest of the arguments were declared. - - QUALS are the qualifiers for the this pointer. */ - -void -grokclassfn (ctype, function, flags, quals) - tree ctype, function; - enum overload_flags flags; - tree quals; -{ - tree fn_name = DECL_NAME (function); - tree arg_types; - tree parm; - tree qualtype; - - if (fn_name == NULL_TREE) - { - error ("name missing for member function"); - fn_name = get_identifier (""); - DECL_NAME (function) = fn_name; - } - - if (quals) - qualtype = grok_method_quals (ctype, function, quals); - else - qualtype = ctype; - - arg_types = TYPE_ARG_TYPES (TREE_TYPE (function)); - if (TREE_CODE (TREE_TYPE (function)) == METHOD_TYPE) - { - /* Must add the class instance variable up front. */ - /* Right now we just make this a pointer. But later - we may wish to make it special. */ - tree type = TREE_VALUE (arg_types); - int constp = 1; - - if ((flag_this_is_variable > 0) - && (flags == DTOR_FLAG || DECL_CONSTRUCTOR_P (function))) - constp = 0; - - parm = build_decl (PARM_DECL, this_identifier, type); - /* Mark the artificial `this' parameter as "artificial". */ - SET_DECL_ARTIFICIAL (parm); - DECL_ARG_TYPE (parm) = type; - /* We can make this a register, so long as we don't - accidentally complain if someone tries to take its address. */ - DECL_REGISTER (parm) = 1; - if (constp) - TREE_READONLY (parm) = 1; - TREE_CHAIN (parm) = last_function_parms; - last_function_parms = parm; - } - - DECL_ARGUMENTS (function) = last_function_parms; - /* First approximations. */ - DECL_CONTEXT (function) = ctype; - DECL_CLASS_CONTEXT (function) = ctype; - - if (flags == DTOR_FLAG || DECL_CONSTRUCTOR_P (function)) - { - maybe_retrofit_in_chrg (function); - arg_types = TYPE_ARG_TYPES (TREE_TYPE (function)); - } - - if (flags == DTOR_FLAG) - { - DECL_ASSEMBLER_NAME (function) = build_destructor_name (ctype); - TYPE_HAS_DESTRUCTOR (ctype) = 1; - } - else - set_mangled_name_for_decl (function); -} - -/* Work on the expr used by alignof (this is only called by the parser). */ - -tree -grok_alignof (expr) - tree expr; -{ - tree best, t; - int bestalign; - - if (processing_template_decl) - return build_min (ALIGNOF_EXPR, sizetype, expr); - - if (TREE_CODE (expr) == COMPONENT_REF - && DECL_C_BIT_FIELD (TREE_OPERAND (expr, 1))) - error ("`__alignof__' applied to a bit-field"); - - if (TREE_CODE (expr) == INDIRECT_REF) - { - best = t = TREE_OPERAND (expr, 0); - bestalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t))); - - while (TREE_CODE (t) == NOP_EXPR - && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == POINTER_TYPE) - { - int thisalign; - t = TREE_OPERAND (t, 0); - thisalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t))); - if (thisalign > bestalign) - best = t, bestalign = thisalign; - } - return c_alignof (TREE_TYPE (TREE_TYPE (best))); - } - else - { - /* ANSI says arrays and fns are converted inside comma. - But we can't convert them in build_compound_expr - because that would break commas in lvalues. - So do the conversion here if operand was a comma. */ - if (TREE_CODE (expr) == COMPOUND_EXPR - && (TREE_CODE (TREE_TYPE (expr)) == ARRAY_TYPE - || TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE)) - expr = default_conversion (expr); - return c_alignof (TREE_TYPE (expr)); - } -} - -/* Create an ARRAY_REF, checking for the user doing things backwards - along the way. */ - -tree -grok_array_decl (array_expr, index_exp) - tree array_expr, index_exp; -{ - tree type = TREE_TYPE (array_expr); - tree p1, p2, i1, i2; - - if (type == error_mark_node || index_exp == error_mark_node) - return error_mark_node; - if (processing_template_decl) - return build_min (ARRAY_REF, type ? TREE_TYPE (type) : NULL_TREE, - array_expr, index_exp); - - if (type == NULL_TREE) - { - /* Something has gone very wrong. Assume we are mistakenly reducing - an expression instead of a declaration. */ - error ("parser may be lost: is there a '{' missing somewhere?"); - return NULL_TREE; - } - - if (TREE_CODE (type) == OFFSET_TYPE - || TREE_CODE (type) == REFERENCE_TYPE) - type = TREE_TYPE (type); - - /* If they have an `operator[]', use that. */ - if (IS_AGGR_TYPE (type) || IS_AGGR_TYPE (TREE_TYPE (index_exp))) - return build_opfncall (ARRAY_REF, LOOKUP_NORMAL, - array_expr, index_exp, NULL_TREE); - - /* Otherwise, create an ARRAY_REF for a pointer or array type. It - is a little-known fact that, if `a' is an array and `i' is an - int, you can write `i[a]', which means the same thing as `a[i]'. */ - - if (TREE_CODE (type) == ARRAY_TYPE) - p1 = array_expr; - else - p1 = build_expr_type_conversion (WANT_POINTER, array_expr, 0); - - if (TREE_CODE (TREE_TYPE (index_exp)) == ARRAY_TYPE) - p2 = index_exp; - else - p2 = build_expr_type_conversion (WANT_POINTER, index_exp, 0); - - i1 = build_expr_type_conversion (WANT_INT | WANT_ENUM, array_expr, 0); - i2 = build_expr_type_conversion (WANT_INT | WANT_ENUM, index_exp, 0); - - if ((p1 && i2) && (i1 && p2)) - error ("ambiguous conversion for array subscript"); - - if (p1 && i2) - array_expr = p1, index_exp = i2; - else if (i1 && p2) - array_expr = p2, index_exp = i1; - else - { - cp_error ("invalid types `%T[%T]' for array subscript", - type, TREE_TYPE (index_exp)); - return error_mark_node; - } - - if (array_expr == error_mark_node || index_exp == error_mark_node) - error ("ambiguous conversion for array subscript"); - - return build_array_ref (array_expr, index_exp); -} - -/* Given the cast expression EXP, checking out its validity. Either return - an error_mark_node if there was an unavoidable error, return a cast to - void for trying to delete a pointer w/ the value 0, or return the - call to delete. If DOING_VEC is 1, we handle things differently - for doing an array delete. If DOING_VEC is 2, they gave us the - array size as an argument to delete. - Implements ARM $5.3.4. This is called from the parser. */ - -tree -delete_sanity (exp, size, doing_vec, use_global_delete) - tree exp, size; - int doing_vec, use_global_delete; -{ - tree t, type; - /* For a regular vector delete (aka, no size argument) we will pass - this down as a NULL_TREE into build_vec_delete. */ - tree maxindex = NULL_TREE; - - if (exp == error_mark_node) - return exp; - - if (processing_template_decl) - { - t = build_min (DELETE_EXPR, void_type_node, exp, size); - DELETE_EXPR_USE_GLOBAL (t) = use_global_delete; - DELETE_EXPR_USE_VEC (t) = doing_vec; - return t; - } - - if (TREE_CODE (exp) == OFFSET_REF) - exp = resolve_offset_ref (exp); - exp = convert_from_reference (exp); - t = stabilize_reference (exp); - t = build_expr_type_conversion (WANT_POINTER, t, 1); - - if (t == NULL_TREE || t == error_mark_node) - { - cp_error ("type `%#T' argument given to `delete', expected pointer", - TREE_TYPE (exp)); - return error_mark_node; - } - - if (doing_vec == 2) - { - maxindex = build_binary_op (MINUS_EXPR, size, integer_one_node, 1); - pedwarn ("anachronistic use of array size in vector delete"); - } - - type = TREE_TYPE (t); - - /* As of Valley Forge, you can delete a pointer to const. */ - - /* You can't delete functions. */ - if (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE) - { - error ("cannot delete a function"); - return error_mark_node; - } - - /* An array can't have been allocated by new, so complain. */ - if (TREE_CODE (t) == ADDR_EXPR - && TREE_CODE (TREE_OPERAND (t, 0)) == VAR_DECL - && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == ARRAY_TYPE) - cp_warning ("deleting array `%#D'", TREE_OPERAND (t, 0)); - - /* Deleting a pointer with the value zero is valid and has no effect. */ - if (integer_zerop (t)) - return build1 (NOP_EXPR, void_type_node, t); - - if (doing_vec) - return build_vec_delete (t, maxindex, integer_one_node, - integer_zero_node, use_global_delete); - else - { - if (IS_AGGR_TYPE (TREE_TYPE (type)) - && TYPE_GETS_REG_DELETE (TREE_TYPE (type))) - { - /* Only do access checking here; we'll be calling op delete - from the destructor. */ - tree tmp = build_op_delete_call (DELETE_EXPR, t, size_zero_node, - LOOKUP_NORMAL, NULL_TREE); - if (tmp == error_mark_node) - return error_mark_node; - } - - return build_delete (type, t, integer_three_node, - LOOKUP_NORMAL, use_global_delete); - } -} - -/* Report an error if the indicated template declaration is not the - sort of thing that should be a member template. */ - -void -check_member_template (tmpl) - tree tmpl; -{ - tree decl; - - my_friendly_assert (TREE_CODE (tmpl) == TEMPLATE_DECL, 0); - decl = DECL_TEMPLATE_RESULT (tmpl); - - if (TREE_CODE (decl) == FUNCTION_DECL - || (TREE_CODE (decl) == TYPE_DECL - && IS_AGGR_TYPE (TREE_TYPE (decl)))) - { - if (current_function_decl) - /* 14.5.2.2 [temp.mem] - - A local class shall not have member templates. */ - cp_error ("declaration of member template `%#D' in local class", - decl); - - if (TREE_CODE (decl) == FUNCTION_DECL && DECL_VIRTUAL_P (decl)) - { - /* 14.5.2.3 [temp.mem] - - A member function template shall not be virtual. */ - cp_error - ("invalid use of `virtual' in template declaration of `%#D'", - decl); - DECL_VIRTUAL_P (decl) = 0; - } - - /* The debug-information generating code doesn't know what to do - with member templates. */ - DECL_IGNORED_P (tmpl) = 1; - } - else - cp_error ("template declaration of `%#D'", decl); -} - -/* Return true iff TYPE is a valid Java parameter or return type. */ - -int -acceptable_java_type (type) - tree type; -{ - if (TREE_CODE (type) == VOID_TYPE || TYPE_FOR_JAVA (type)) - return 1; - if (TREE_CODE (type) == POINTER_TYPE) - { - type = TREE_TYPE (type); - if (TREE_CODE (type) == RECORD_TYPE) - { - tree args; int i; - if (! TYPE_FOR_JAVA (type)) - return 0; - if (! CLASSTYPE_TEMPLATE_INFO (type)) - return 1; - args = CLASSTYPE_TI_ARGS (type); - i = TREE_VEC_LENGTH (args); - while (--i >= 0) - { - type = TREE_VEC_ELT (args, i); - if (TREE_CODE (type) == POINTER_TYPE) - type = TREE_TYPE (type); - if (! TYPE_FOR_JAVA (type)) - return 0; - } - return 1; - } - } - return 0; -} - -/* For a METHOD in a Java class CTYPE, return 1 if - the parameter and return types are valid Java types. - Otherwise, print appropriate error messages, and return 0. */ - -int -check_java_method (method) - tree method; -{ - int jerr = 0; - tree arg_types = TYPE_ARG_TYPES (TREE_TYPE (method)); - tree ret_type = TREE_TYPE (TREE_TYPE (method)); - if (! acceptable_java_type (ret_type)) - { - cp_error ("Java method '%D' has non-Java return type `%T'", - method, ret_type); - jerr++; - } - for (; arg_types != NULL_TREE; arg_types = TREE_CHAIN (arg_types)) - { - tree type = TREE_VALUE (arg_types); - if (! acceptable_java_type (type)) - { - cp_error ("Java method '%D' has non-Java parameter type `%T'", - method, type); - jerr++; - } - } - return jerr ? 0 : 1; -} - -/* Sanity check: report error if this function FUNCTION is not - really a member of the class (CTYPE) it is supposed to belong to. - CNAME is the same here as it is for grokclassfn above. */ - -tree -check_classfn (ctype, function) - tree ctype, function; -{ - tree fn_name = DECL_NAME (function); - tree fndecl, fndecls; - tree method_vec = CLASSTYPE_METHOD_VEC (complete_type (ctype)); - tree *methods = 0; - tree *end = 0; - tree templates = NULL_TREE; - - if (method_vec != 0) - { - methods = &TREE_VEC_ELT (method_vec, 0); - end = TREE_VEC_END (method_vec); - - /* First suss out ctors and dtors. */ - if (*methods && fn_name == DECL_NAME (OVL_CURRENT (*methods)) - && DECL_CONSTRUCTOR_P (function)) - goto got_it; - if (*++methods && fn_name == DECL_NAME (OVL_CURRENT (*methods)) - && DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (function))) - goto got_it; - - while (++methods != end && *methods) - { - fndecl = *methods; - if (fn_name == DECL_NAME (OVL_CURRENT (*methods))) - { - got_it: - for (fndecls = *methods; fndecls != NULL_TREE; - fndecls = OVL_NEXT (fndecls)) - { - fndecl = OVL_CURRENT (fndecls); - /* The DECL_ASSEMBLER_NAME for a TEMPLATE_DECL, or - for a for member function of a template class, is - not mangled, so the check below does not work - correctly in that case. Since mangled destructor - names do not include the type of the arguments, - we can't use this short-cut for them, either. - (It's not legal to declare arguments for a - destructor, but some people try.) */ - if (!DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (function)) - && (DECL_ASSEMBLER_NAME (function) - != DECL_NAME (function)) - && (DECL_ASSEMBLER_NAME (fndecl) - != DECL_NAME (fndecl)) - && (DECL_ASSEMBLER_NAME (function) - == DECL_ASSEMBLER_NAME (fndecl))) - return fndecl; - - /* We cannot simply call decls_match because this - doesn't work for static member functions that are - pretending to be methods, and because the name - may have been changed by asm("new_name"). */ - if (DECL_NAME (function) == DECL_NAME (fndecl)) - { - tree p1 = TYPE_ARG_TYPES (TREE_TYPE (function)); - tree p2 = TYPE_ARG_TYPES (TREE_TYPE (fndecl)); - - /* Get rid of the this parameter on functions that become - static. */ - if (DECL_STATIC_FUNCTION_P (fndecl) - && TREE_CODE (TREE_TYPE (function)) == METHOD_TYPE) - p1 = TREE_CHAIN (p1); - - if (same_type_p (TREE_TYPE (TREE_TYPE (function)), - TREE_TYPE (TREE_TYPE (fndecl))) - && compparms (p1, p2) - && (DECL_TEMPLATE_SPECIALIZATION (function) - == DECL_TEMPLATE_SPECIALIZATION (fndecl)) - && (!DECL_TEMPLATE_SPECIALIZATION (function) - || (DECL_TI_TEMPLATE (function) - == DECL_TI_TEMPLATE (fndecl)))) - return fndecl; - - if (is_member_template (fndecl)) - /* This function might be an instantiation - or specialization of fndecl. */ - templates = - scratch_tree_cons (NULL_TREE, fndecl, templates); - } - } - break; /* loser */ - } - else if (TREE_CODE (OVL_CURRENT (fndecl)) == TEMPLATE_DECL - && DECL_CONV_FN_P (OVL_CURRENT (fndecl)) - && DECL_CONV_FN_P (function)) - /* The method in the class is a member template - conversion operator. We are declaring another - conversion operator. It is possible that even though - the names don't match, there is some specialization - occurring. */ - templates = - scratch_tree_cons (NULL_TREE, fndecl, templates); - } - } - - if (templates) - /* This function might be an instantiation or a specialization. - We should verify that this is possible. For now, we simply - return NULL_TREE, which lets the caller know that this function - is new, but we don't print an error message. */ - return NULL_TREE; - - if (methods != end && *methods) - { - tree fndecl = *methods; - cp_error ("prototype for `%#D' does not match any in class `%T'", - function, ctype); - cp_error_at ("candidate%s: %+#D", OVL_NEXT (fndecl) ? "s are" : " is", - OVL_CURRENT (fndecl)); - while (fndecl = OVL_NEXT (fndecl), fndecl) - cp_error_at (" %#D", OVL_CURRENT(fndecl)); - } - else - { - methods = 0; - if (TYPE_SIZE (ctype) == 0) - incomplete_type_error (function, ctype); - else - cp_error ("no `%#D' member function declared in class `%T'", - function, ctype); - } - - /* If we did not find the method in the class, add it to avoid - spurious errors (unless the CTYPE is not yet defined, in which - case we'll only confuse ourselves when the function is declared - properly within the class. */ - if (TYPE_SIZE (ctype)) - add_method (ctype, methods, function); - return NULL_TREE; -} - -/* Process the specs, declarator (NULL if omitted) and width (NULL if omitted) - of a structure component, returning a FIELD_DECL node. - QUALS is a list of type qualifiers for this decl (such as for declaring - const member functions). - - This is done during the parsing of the struct declaration. - The FIELD_DECL nodes are chained together and the lot of them - are ultimately passed to `build_struct' to make the RECORD_TYPE node. - - C++: - - If class A defines that certain functions in class B are friends, then - the way I have set things up, it is B who is interested in permission - granted by A. However, it is in A's context that these declarations - are parsed. By returning a void_type_node, class A does not attempt - to incorporate the declarations of the friends within its structure. - - DO NOT MAKE ANY CHANGES TO THIS CODE WITHOUT MAKING CORRESPONDING - CHANGES TO CODE IN `start_method'. */ - -tree -grokfield (declarator, declspecs, init, asmspec_tree, attrlist) - tree declarator, declspecs, init, asmspec_tree, attrlist; -{ - register tree value; - char *asmspec = 0; - int flags = LOOKUP_ONLYCONVERTING; - - /* Convert () initializers to = initializers. */ - if (init == NULL_TREE && declarator != NULL_TREE - && TREE_CODE (declarator) == CALL_EXPR - && TREE_OPERAND (declarator, 0) - && (TREE_CODE (TREE_OPERAND (declarator, 0)) == IDENTIFIER_NODE - || TREE_CODE (TREE_OPERAND (declarator, 0)) == SCOPE_REF) - && parmlist_is_exprlist (TREE_OPERAND (declarator, 1))) - { - init = TREE_OPERAND (declarator, 1); - declarator = TREE_OPERAND (declarator, 0); - flags = 0; - } - - if (declspecs == NULL_TREE - && TREE_CODE (declarator) == SCOPE_REF - && TREE_CODE (TREE_OPERAND (declarator, 1)) == IDENTIFIER_NODE) - { - /* Access declaration */ - if (! IS_AGGR_TYPE_CODE (TREE_CODE (TREE_OPERAND (declarator, 0)))) - ; - else if (TREE_COMPLEXITY (declarator) == current_class_depth) - pop_nested_class (1); - return do_class_using_decl (declarator); - } - - if (init - && TREE_CODE (init) == TREE_LIST - && TREE_VALUE (init) == error_mark_node - && TREE_CHAIN (init) == NULL_TREE) - init = NULL_TREE; - - value = grokdeclarator (declarator, declspecs, FIELD, init != 0, NULL_TREE); - if (! value || value == error_mark_node) - /* friend or constructor went bad. */ - return value; - - /* Pass friendly classes back. */ - if (TREE_CODE (value) == VOID_TYPE) - return void_type_node; - - if (DECL_NAME (value) != NULL_TREE - && IDENTIFIER_POINTER (DECL_NAME (value))[0] == '_' - && ! strcmp (IDENTIFIER_POINTER (DECL_NAME (value)), "_vptr")) - cp_error ("member `%D' conflicts with virtual function table field name", - value); - - /* Stash away type declarations. */ - if (TREE_CODE (value) == TYPE_DECL) - { - DECL_NONLOCAL (value) = 1; - DECL_CONTEXT (value) = current_class_type; - DECL_CLASS_CONTEXT (value) = current_class_type; - - /* Now that we've updated the context, we need to remangle the - name for this TYPE_DECL. */ - DECL_ASSEMBLER_NAME (value) = DECL_NAME (value); - if (!uses_template_parms (value)) - DECL_ASSEMBLER_NAME (value) = - get_identifier (build_overload_name (TREE_TYPE (value), 1, 1)); - - pushdecl_class_level (value); - return value; - } - - if (IS_SIGNATURE (current_class_type) - && TREE_CODE (value) != FUNCTION_DECL) - { - error ("field declaration not allowed in signature"); - return void_type_node; - } - - if (DECL_IN_AGGR_P (value)) - { - cp_error ("`%D' is already defined in `%T'", value, - DECL_CONTEXT (value)); - return void_type_node; - } - - if (asmspec_tree) - asmspec = TREE_STRING_POINTER (asmspec_tree); - - if (init) - { - if (IS_SIGNATURE (current_class_type) - && TREE_CODE (value) == FUNCTION_DECL) - { - error ("function declarations cannot have initializers in signature"); - init = NULL_TREE; - } - else if (TREE_CODE (value) == FUNCTION_DECL) - { - grok_function_init (value, init); - init = NULL_TREE; - } - else if (pedantic && TREE_CODE (value) != VAR_DECL) - /* Already complained in grokdeclarator. */ - init = NULL_TREE; - else - { - /* We allow initializers to become parameters to base - initializers. */ - if (TREE_CODE (init) == TREE_LIST) - { - if (TREE_CHAIN (init) == NULL_TREE) - init = TREE_VALUE (init); - else - init = digest_init (TREE_TYPE (value), init, (tree *)0); - } - - if (TREE_CODE (init) == CONST_DECL) - init = DECL_INITIAL (init); - else if (TREE_READONLY_DECL_P (init)) - init = decl_constant_value (init); - else if (TREE_CODE (init) == CONSTRUCTOR) - init = digest_init (TREE_TYPE (value), init, (tree *)0); - my_friendly_assert (TREE_PERMANENT (init), 192); - if (init == error_mark_node) - /* We must make this look different than `error_mark_node' - because `decl_const_value' would mis-interpret it - as only meaning that this VAR_DECL is defined. */ - init = build1 (NOP_EXPR, TREE_TYPE (value), init); - else if (processing_template_decl) - ; - else if (! TREE_CONSTANT (init)) - { - /* We can allow references to things that are effectively - static, since references are initialized with the address. */ - if (TREE_CODE (TREE_TYPE (value)) != REFERENCE_TYPE - || (TREE_STATIC (init) == 0 - && (TREE_CODE_CLASS (TREE_CODE (init)) != 'd' - || DECL_EXTERNAL (init) == 0))) - { - error ("field initializer is not constant"); - init = error_mark_node; - } - } - } - } - - /* The corresponding pop_obstacks is in cp_finish_decl. */ - push_obstacks_nochange (); - - if (processing_template_decl && ! current_function_decl - && (TREE_CODE (value) == VAR_DECL || TREE_CODE (value) == FUNCTION_DECL)) - value = push_template_decl (value); - - check_template_shadow (value); - - if (attrlist) - cplus_decl_attributes (value, TREE_PURPOSE (attrlist), - TREE_VALUE (attrlist)); - - if (TREE_CODE (value) == VAR_DECL) - { - my_friendly_assert (TREE_PUBLIC (value), 0); - - /* We cannot call pushdecl here, because that would - fill in the value of our TREE_CHAIN. Instead, we - modify cp_finish_decl to do the right thing, namely, to - put this decl out straight away. */ - /* current_class_type can be NULL_TREE in case of error. */ - if (asmspec == 0 && current_class_type) - { - TREE_PUBLIC (value) = 1; - DECL_INITIAL (value) = error_mark_node; - DECL_ASSEMBLER_NAME (value) - = build_static_name (current_class_type, DECL_NAME (value)); - } - if (! processing_template_decl) - pending_statics = perm_tree_cons (NULL_TREE, value, pending_statics); - - /* Static consts need not be initialized in the class definition. */ - if (init != NULL_TREE && TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (value))) - { - static int explanation = 0; - - error ("initializer invalid for static member with constructor"); - if (explanation++ == 0) - error ("(you really want to initialize it separately)"); - init = 0; - } - /* Force the compiler to know when an uninitialized static - const member is being used. */ - if (CP_TYPE_CONST_P (TREE_TYPE (value)) && init == 0) - TREE_USED (value) = 1; - DECL_INITIAL (value) = init; - DECL_IN_AGGR_P (value) = 1; - DECL_CONTEXT (value) = current_class_type; - DECL_CLASS_CONTEXT (value) = current_class_type; - - cp_finish_decl (value, init, asmspec_tree, 1, flags); - pushdecl_class_level (value); - return value; - } - if (TREE_CODE (value) == FIELD_DECL) - { - if (asmspec) - { - /* This must override the asm specifier which was placed - by grokclassfn. Lay this out fresh. */ - DECL_RTL (value) = NULL_RTX; - DECL_ASSEMBLER_NAME (value) = get_identifier (asmspec); - } - if (DECL_INITIAL (value) == error_mark_node) - init = error_mark_node; - cp_finish_decl (value, init, asmspec_tree, 1, flags); - DECL_INITIAL (value) = init; - DECL_IN_AGGR_P (value) = 1; - return value; - } - if (TREE_CODE (value) == FUNCTION_DECL) - { - if (asmspec) - { - /* This must override the asm specifier which was placed - by grokclassfn. Lay this out fresh. */ - DECL_RTL (value) = NULL_RTX; - DECL_ASSEMBLER_NAME (value) = get_identifier (asmspec); - } - cp_finish_decl (value, init, asmspec_tree, 1, flags); - - /* Pass friends back this way. */ - if (DECL_FRIEND_P (value)) - return void_type_node; - -#if 0 /* Just because a fn is declared doesn't mean we'll try to define it. */ - if (current_function_decl && ! IS_SIGNATURE (current_class_type)) - cp_error ("method `%#D' of local class must be defined in class body", - value); -#endif - - DECL_IN_AGGR_P (value) = 1; - return value; - } - my_friendly_abort (21); - /* NOTREACHED */ - return NULL_TREE; -} - -/* Like `grokfield', but for bitfields. - WIDTH is non-NULL for bit fields only, and is an INTEGER_CST node. */ - -tree -grokbitfield (declarator, declspecs, width) - tree declarator, declspecs, width; -{ - register tree value = grokdeclarator (declarator, declspecs, BITFIELD, - 0, NULL_TREE); - - if (! value) return NULL_TREE; /* friends went bad. */ - - /* Pass friendly classes back. */ - if (TREE_CODE (value) == VOID_TYPE) - return void_type_node; - - if (TREE_CODE (value) == TYPE_DECL) - { - cp_error ("cannot declare `%D' to be a bitfield type", value); - return NULL_TREE; - } - - /* Usually, finish_struct_1 catches bitifields with invalid types. - But, in the case of bitfields with function type, we confuse - ourselves into thinking they are member functions, so we must - check here. */ - if (TREE_CODE (value) == FUNCTION_DECL) - { - cp_error ("cannot declare bitfield `%D' with funcion type", - DECL_NAME (value)); - return NULL_TREE; - } - - if (IS_SIGNATURE (current_class_type)) - { - error ("field declaration not allowed in signature"); - return void_type_node; - } - - if (DECL_IN_AGGR_P (value)) - { - cp_error ("`%D' is already defined in the class %T", value, - DECL_CONTEXT (value)); - return void_type_node; - } - - GNU_xref_member (current_class_name, value); - - if (TREE_STATIC (value)) - { - cp_error ("static member `%D' cannot be a bitfield", value); - return NULL_TREE; - } - cp_finish_decl (value, NULL_TREE, NULL_TREE, 0, 0); - - if (width != error_mark_node) - { - constant_expression_warning (width); - DECL_INITIAL (value) = width; - SET_DECL_C_BIT_FIELD (value); - } - - DECL_IN_AGGR_P (value) = 1; - return value; -} - -tree -grokoptypename (declspecs, declarator) - tree declspecs, declarator; -{ - tree t = grokdeclarator (declarator, declspecs, TYPENAME, 0, NULL_TREE); - return build_typename_overload (t); -} - -/* When a function is declared with an initializer, - do the right thing. Currently, there are two possibilities: - - class B - { - public: - // initialization possibility #1. - virtual void f () = 0; - int g (); - }; - - class D1 : B - { - public: - int d1; - // error, no f (); - }; - - class D2 : B - { - public: - int d2; - void f (); - }; - - class D3 : B - { - public: - int d3; - // initialization possibility #2 - void f () = B::f; - }; - -*/ - -int -copy_assignment_arg_p (parmtype, virtualp) - tree parmtype; - int virtualp ATTRIBUTE_UNUSED; -{ - if (current_class_type == NULL_TREE) - return 0; - - if (TREE_CODE (parmtype) == REFERENCE_TYPE) - parmtype = TREE_TYPE (parmtype); - - if ((TYPE_MAIN_VARIANT (parmtype) == current_class_type) -#if 0 - /* Non-standard hack to support old Booch components. */ - || (! virtualp && DERIVED_FROM_P (parmtype, current_class_type)) -#endif - ) - return 1; - - return 0; -} - -static void -grok_function_init (decl, init) - tree decl; - tree init; -{ - /* An initializer for a function tells how this function should - be inherited. */ - tree type = TREE_TYPE (decl); - - if (TREE_CODE (type) == FUNCTION_TYPE) - cp_error ("initializer specified for non-member function `%D'", decl); -#if 0 - /* We'll check for this in finish_struct_1. */ - else if (DECL_VINDEX (decl) == NULL_TREE) - cp_error ("initializer specified for non-virtual method `%D'", decl); -#endif - else if (integer_zerop (init)) - { -#if 0 - /* Mark this function as being "defined". */ - DECL_INITIAL (decl) = error_mark_node; - /* pure virtual destructors must be defined. */ - /* pure virtual needs to be defined (as abort) only when put in - vtbl. For wellformed call, it should be itself. pr4737 */ - if (!DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (decl))) - { - extern tree abort_fndecl; - /* Give this node rtl from `abort'. */ - DECL_RTL (decl) = DECL_RTL (abort_fndecl); - } -#endif - DECL_ABSTRACT_VIRTUAL_P (decl) = 1; - if (DECL_NAME (decl) == ansi_opname [(int) MODIFY_EXPR]) - { - tree parmtype - = TREE_VALUE (TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (decl)))); - - if (copy_assignment_arg_p (parmtype, 1)) - TYPE_HAS_ABSTRACT_ASSIGN_REF (current_class_type) = 1; - } - } - else - cp_error ("invalid initializer for virtual method `%D'", decl); -} - -void -cplus_decl_attributes (decl, attributes, prefix_attributes) - tree decl, attributes, prefix_attributes; -{ - if (decl == NULL_TREE || decl == void_type_node) - return; - - if (TREE_CODE (decl) == TEMPLATE_DECL) - decl = DECL_TEMPLATE_RESULT (decl); - - decl_attributes (decl, attributes, prefix_attributes); - - if (TREE_CODE (decl) == TYPE_DECL) - SET_IDENTIFIER_TYPE_VALUE (DECL_NAME (decl), TREE_TYPE (decl)); -} - -/* CONSTRUCTOR_NAME: - Return the name for the constructor (or destructor) for the - specified class. Argument can be RECORD_TYPE, TYPE_DECL, or - IDENTIFIER_NODE. When given a template, this routine doesn't - lose the specialization. */ - -tree -constructor_name_full (thing) - tree thing; -{ - if (TREE_CODE (thing) == TEMPLATE_TYPE_PARM - || TREE_CODE (thing) == TEMPLATE_TEMPLATE_PARM - || TREE_CODE (thing) == TYPENAME_TYPE) - thing = TYPE_NAME (thing); - else if (IS_AGGR_TYPE_CODE (TREE_CODE (thing))) - { - if (TYPE_WAS_ANONYMOUS (thing) && TYPE_HAS_CONSTRUCTOR (thing)) - thing = DECL_NAME (OVL_CURRENT (TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (thing), 0))); - else - thing = TYPE_NAME (thing); - } - if (TREE_CODE (thing) == TYPE_DECL - || (TREE_CODE (thing) == TEMPLATE_DECL - && TREE_CODE (DECL_TEMPLATE_RESULT (thing)) == TYPE_DECL)) - thing = DECL_NAME (thing); - my_friendly_assert (TREE_CODE (thing) == IDENTIFIER_NODE, 197); - return thing; -} - -/* CONSTRUCTOR_NAME: - Return the name for the constructor (or destructor) for the - specified class. Argument can be RECORD_TYPE, TYPE_DECL, or - IDENTIFIER_NODE. When given a template, return the plain - unspecialized name. */ - -tree -constructor_name (thing) - tree thing; -{ - tree t; - thing = constructor_name_full (thing); - t = IDENTIFIER_TEMPLATE (thing); - if (!t) - return thing; - return t; -} - -/* Cache the value of this class's main virtual function table pointer - in a register variable. This will save one indirection if a - more than one virtual function call is made this function. */ - -void -setup_vtbl_ptr () -{ - extern tree base_init_expr; - - if (base_init_expr == 0 - && DECL_CONSTRUCTOR_P (current_function_decl)) - { - if (processing_template_decl) - add_tree (build_min_nt - (CTOR_INITIALIZER, - current_member_init_list, current_base_init_list)); - else - emit_base_init (current_class_type, 0); - } -} - -/* Record the existence of an addressable inline function. */ - -void -mark_inline_for_output (decl) - tree decl; -{ - decl = DECL_MAIN_VARIANT (decl); - if (DECL_SAVED_INLINE (decl)) - return; - my_friendly_assert (TREE_PERMANENT (decl), 363); - DECL_SAVED_INLINE (decl) = 1; -#if 0 - if (DECL_PENDING_INLINE_INFO (decl) != 0 - && ! DECL_PENDING_INLINE_INFO (decl)->deja_vu) - { - struct pending_inline *t = pending_inlines; - my_friendly_assert (DECL_SAVED_INSNS (decl) == 0, 198); - while (t) - { - if (t == DECL_PENDING_INLINE_INFO (decl)) - break; - t = t->next; - } - if (t == 0) - { - t = DECL_PENDING_INLINE_INFO (decl); - t->next = pending_inlines; - pending_inlines = t; - } - DECL_PENDING_INLINE_INFO (decl) = 0; - } -#endif - saved_inlines = perm_tree_cons (NULL_TREE, decl, saved_inlines); -} - -void -clear_temp_name () -{ - temp_name_counter = 0; -} - -/* Hand off a unique name which can be used for variable we don't really - want to know about anyway, for example, the anonymous variables which - are needed to make references work. Declare this thing so we can use it. - The variable created will be of type TYPE. - - STATICP is nonzero if this variable should be static. */ - -tree -get_temp_name (type, staticp) - tree type; - int staticp; -{ - char buf[sizeof (AUTO_TEMP_FORMAT) + 20]; - tree decl; - int toplev = toplevel_bindings_p (); - - push_obstacks_nochange (); - if (toplev || staticp) - { - end_temporary_allocation (); - sprintf (buf, AUTO_TEMP_FORMAT, global_temp_name_counter++); - decl = pushdecl_top_level (build_decl (VAR_DECL, get_identifier (buf), type)); - } - else - { - sprintf (buf, AUTO_TEMP_FORMAT, temp_name_counter++); - decl = pushdecl (build_decl (VAR_DECL, get_identifier (buf), type)); - } - TREE_USED (decl) = 1; - TREE_STATIC (decl) = staticp; - DECL_ARTIFICIAL (decl) = 1; - - /* If this is a local variable, then lay out its rtl now. - Otherwise, callers of this function are responsible for dealing - with this variable's rtl. */ - if (! toplev) - { - expand_decl (decl); - expand_decl_init (decl); - } - pop_obstacks (); - - return decl; -} - -/* Get a variable which we can use for multiple assignments. - It is not entered into current_binding_level, because - that breaks things when it comes time to do final cleanups - (which take place "outside" the binding contour of the function). */ - -tree -get_temp_regvar (type, init) - tree type, init; -{ - tree decl; - - decl = build_decl (VAR_DECL, NULL_TREE, type); - TREE_USED (decl) = 1; - DECL_REGISTER (decl) = 1; - DECL_ARTIFICIAL (decl) = 1; - - DECL_RTL (decl) = assign_temp (type, 2, 0, 1); - /* We can expand these without fear, since they cannot need - constructors or destructors. */ - expand_expr (build_modify_expr (decl, INIT_EXPR, init), - NULL_RTX, VOIDmode, 0); - - return decl; -} - -/* Hunts through the global anonymous union ANON_DECL, building - appropriate VAR_DECLs. Stores cleanups on the list of ELEMS, and - returns a VAR_DECL whose size is the same as the size of the - ANON_DECL, if one is available. */ - -static tree -build_anon_union_vars (anon_decl, elems, static_p, external_p) - tree anon_decl; - tree* elems; - int static_p; - int external_p; -{ - tree type = TREE_TYPE (anon_decl); - tree main_decl = NULL_TREE; - tree field; - - for (field = TYPE_FIELDS (type); - field != NULL_TREE; - field = TREE_CHAIN (field)) - { - tree decl; - - if (DECL_ARTIFICIAL (field)) - continue; - if (TREE_CODE (field) != FIELD_DECL) - { - cp_pedwarn_at ("`%#D' invalid; an anonymous union can only have non-static data members", - field); - continue; - } - - if (TREE_PRIVATE (field)) - cp_pedwarn_at ("private member `%#D' in anonymous union", field); - else if (TREE_PROTECTED (field)) - cp_pedwarn_at ("protected member `%#D' in anonymous union", field); - - if (DECL_NAME (field) == NULL_TREE - && TREE_CODE (TREE_TYPE (field)) == UNION_TYPE) - { - decl = build_anon_union_vars (field, elems, static_p, external_p); - if (!decl) - continue; - } - else if (DECL_NAME (field) == NULL_TREE) - continue; - else - { - decl = build_decl (VAR_DECL, DECL_NAME (field), TREE_TYPE (field)); - /* tell `pushdecl' that this is not tentative. */ - DECL_INITIAL (decl) = error_mark_node; - TREE_PUBLIC (decl) = 0; - TREE_STATIC (decl) = static_p; - DECL_EXTERNAL (decl) = external_p; - decl = pushdecl (decl); - DECL_INITIAL (decl) = NULL_TREE; - } - - /* Only write out one anon union element--choose the one that - can hold them all. */ - if (main_decl == NULL_TREE - && simple_cst_equal (DECL_SIZE (decl), - DECL_SIZE (anon_decl)) == 1) - main_decl = decl; - else - /* ??? This causes there to be no debug info written out - about this decl. */ - TREE_ASM_WRITTEN (decl) = 1; - - if (DECL_NAME (field) == NULL_TREE - && TREE_CODE (TREE_TYPE (field)) == UNION_TYPE) - /* The remainder of the processing was already done in the - recursive call. */ - continue; - - /* If there's a cleanup to do, it belongs in the - TREE_PURPOSE of the following TREE_LIST. */ - *elems = scratch_tree_cons (NULL_TREE, decl, *elems); - TREE_TYPE (*elems) = type; - } - - return main_decl; -} - -/* Finish off the processing of a UNION_TYPE structure. - If there are static members, then all members are - static, and must be laid out together. If the - union is an anonymous union, we arrange for that - as well. PUBLIC_P is nonzero if this union is - not declared static. */ - -void -finish_anon_union (anon_union_decl) - tree anon_union_decl; -{ - tree type = TREE_TYPE (anon_union_decl); - tree elems = NULL_TREE; - tree main_decl; - int public_p = TREE_PUBLIC (anon_union_decl); - int static_p = TREE_STATIC (anon_union_decl); - int external_p = DECL_EXTERNAL (anon_union_decl); - - if (TYPE_FIELDS (type) == NULL_TREE) - return; - - if (public_p) - { - error ("global anonymous unions must be declared static"); - return; - } - - main_decl = build_anon_union_vars (anon_union_decl, &elems, - static_p, external_p); - - if (main_decl == NULL_TREE) - { - warning ("anonymous union with no members"); - return; - } - - if (static_p) - { - make_decl_rtl (main_decl, 0, toplevel_bindings_p ()); - DECL_RTL (anon_union_decl) = DECL_RTL (main_decl); - } - - /* The following call assumes that there are never any cleanups - for anonymous unions--a reasonable assumption. */ - expand_anon_union_decl (anon_union_decl, NULL_TREE, elems); -} - -/* Finish processing a builtin type TYPE. It's name is NAME, - its fields are in the array FIELDS. LEN is the number of elements - in FIELDS minus one, or put another way, it is the maximum subscript - used in FIELDS. - - It is given the same alignment as ALIGN_TYPE. */ - -void -finish_builtin_type (type, name, fields, len, align_type) - tree type; - char *name; - tree fields[]; - int len; - tree align_type; -{ - register int i; - - TYPE_FIELDS (type) = fields[0]; - for (i = 0; i < len; i++) - { - layout_type (TREE_TYPE (fields[i])); - DECL_FIELD_CONTEXT (fields[i]) = type; - TREE_CHAIN (fields[i]) = fields[i+1]; - } - DECL_FIELD_CONTEXT (fields[i]) = type; - DECL_CLASS_CONTEXT (fields[i]) = type; - TYPE_ALIGN (type) = TYPE_ALIGN (align_type); - layout_type (type); -#if 0 /* not yet, should get fixed properly later */ - TYPE_NAME (type) = make_type_decl (get_identifier (name), type); -#else - TYPE_NAME (type) = build_decl (TYPE_DECL, get_identifier (name), type); -#endif - TYPE_STUB_DECL (type) = TYPE_NAME (type); - layout_decl (TYPE_NAME (type), 0); -} - -/* Auxiliary functions to make type signatures for - `operator new' and `operator delete' correspond to - what compiler will be expecting. */ - -tree -coerce_new_type (type) - tree type; -{ - int e1 = 0, e2 = 0; - - if (TREE_CODE (type) == METHOD_TYPE) - type = build_function_type (TREE_TYPE (type), TREE_CHAIN (TYPE_ARG_TYPES (type))); - if (! same_type_p (TREE_TYPE (type), ptr_type_node)) - e1 = 1, error ("`operator new' must return type `void *'"); - - /* Technically the type must be `size_t', but we may not know - what that is. */ - if (TYPE_ARG_TYPES (type) == NULL_TREE) - e1 = 1, error ("`operator new' takes type `size_t' parameter"); - else if (! same_type_p (TREE_VALUE (TYPE_ARG_TYPES (type)), sizetype)) - e2 = 1, error ("`operator new' takes type `size_t' as first parameter"); - if (e2) - type = build_function_type (ptr_type_node, tree_cons (NULL_TREE, sizetype, TREE_CHAIN (TYPE_ARG_TYPES (type)))); - else if (e1) - type = build_function_type (ptr_type_node, TYPE_ARG_TYPES (type)); - return type; -} - -tree -coerce_delete_type (type) - tree type; -{ - int e1 = 0, e2 = 0; -#if 0 - e3 = 0; -#endif - tree arg_types = TYPE_ARG_TYPES (type); - - if (TREE_CODE (type) == METHOD_TYPE) - { - type = build_function_type (TREE_TYPE (type), TREE_CHAIN (arg_types)); - arg_types = TREE_CHAIN (arg_types); - } - - if (TREE_TYPE (type) != void_type_node) - e1 = 1, error ("`operator delete' must return type `void'"); - - if (arg_types == NULL_TREE - || ! same_type_p (TREE_VALUE (arg_types), ptr_type_node)) - e2 = 1, error ("`operator delete' takes type `void *' as first parameter"); - -#if 0 - if (arg_types - && TREE_CHAIN (arg_types) - && TREE_CHAIN (arg_types) != void_list_node) - { - /* Again, technically this argument must be `size_t', but again - we may not know what that is. */ - tree t2 = TREE_VALUE (TREE_CHAIN (arg_types)); - if (! same_type_p (t2, sizetype)) - e3 = 1, error ("second argument to `operator delete' must be of type `size_t'"); - else if (TREE_CHAIN (TREE_CHAIN (arg_types)) != void_list_node) - { - e3 = 1; - if (TREE_CHAIN (TREE_CHAIN (arg_types))) - error ("too many arguments in declaration of `operator delete'"); - else - error ("`...' invalid in specification of `operator delete'"); - } - } - - if (e3) - arg_types = tree_cons (NULL_TREE, ptr_type_node, - build_tree_list (NULL_TREE, sizetype)); - else if (e3 |= e2) - { - if (arg_types == NULL_TREE) - arg_types = tree_cons (NULL_TREE, ptr_type_node, void_list_node); - else - arg_types = tree_cons (NULL_TREE, ptr_type_node, TREE_CHAIN (arg_types)); - } - else e3 |= e1; -#endif - - if (e2) - arg_types = tree_cons (NULL_TREE, ptr_type_node, - arg_types ? TREE_CHAIN (arg_types): NULL_TREE); - if (e2 || e1) - type = build_function_type (void_type_node, arg_types); - - return type; -} - -extern tree abort_fndecl; - -static void -mark_vtable_entries (decl) - tree decl; -{ - tree entries = CONSTRUCTOR_ELTS (DECL_INITIAL (decl)); - - if (flag_rtti) - { - tree fnaddr = (flag_vtable_thunks ? TREE_VALUE (TREE_CHAIN (entries)) - : FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (entries))); - tree fn = TREE_OPERAND (fnaddr, 0); - TREE_ADDRESSABLE (fn) = 1; - mark_used (fn); - } - skip_rtti_stuff (&entries); - - for (; entries; entries = TREE_CHAIN (entries)) - { - tree fnaddr = (flag_vtable_thunks ? TREE_VALUE (entries) - : FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (entries))); - tree fn = TREE_OPERAND (fnaddr, 0); - TREE_ADDRESSABLE (fn) = 1; - if (DECL_LANG_SPECIFIC (fn) && DECL_ABSTRACT_VIRTUAL_P (fn)) - { - TREE_OPERAND (fnaddr, 0) = fn = copy_node (fn); - DECL_RTL (fn) = DECL_RTL (abort_fndecl); - mark_used (abort_fndecl); - } - if (TREE_CODE (fn) == THUNK_DECL && DECL_EXTERNAL (fn)) - { - DECL_EXTERNAL (fn) = 0; - emit_thunk (fn); - } - mark_used (fn); - } -} - -/* Set DECL up to have the closest approximation of "initialized common" - linkage available. */ - -void -comdat_linkage (decl) - tree decl; -{ - if (flag_weak) - make_decl_one_only (decl); - else - TREE_PUBLIC (decl) = 0; - - if (DECL_LANG_SPECIFIC (decl)) - DECL_COMDAT (decl) = 1; -} - -/* For win32 we also want to put explicit instantiations in - linkonce sections, so that they will be merged with implicit - instantiations; otherwise we get duplicate symbol errors. */ - -void -maybe_make_one_only (decl) - tree decl; -{ - /* This is not necessary on targets that support weak symbols, because - the implicit instantiations will defer to the explicit one. */ - if (! supports_one_only () || SUPPORTS_WEAK) - return; - - /* We can't set DECL_COMDAT on functions, or finish_file will think - we can get away with not emitting them if they aren't used. - We can't use make_decl_one_only for variables, because their - DECL_INITIAL may not have been set properly yet. */ - - if (TREE_CODE (decl) == FUNCTION_DECL) - make_decl_one_only (decl); - else - comdat_linkage (decl); -} - -/* Set TREE_PUBLIC and/or DECL_EXTERN on the vtable DECL, - based on TYPE and other static flags. - - Note that anything public is tagged TREE_PUBLIC, whether - it's public in this file or in another one. */ - -void -import_export_vtable (decl, type, final) - tree decl, type; - int final; -{ - if (DECL_INTERFACE_KNOWN (decl)) - return; - - if (TYPE_FOR_JAVA (type)) - { - TREE_PUBLIC (decl) = 1; - DECL_EXTERNAL (decl) = 1; - DECL_INTERFACE_KNOWN (decl) = 1; - } - else if (CLASSTYPE_INTERFACE_KNOWN (type)) - { - TREE_PUBLIC (decl) = 1; - DECL_EXTERNAL (decl) = ! CLASSTYPE_VTABLE_NEEDS_WRITING (type); - DECL_INTERFACE_KNOWN (decl) = 1; - } - else - { - /* We can only wait to decide if we have real non-inline virtual - functions in our class, or if we come from a template. */ - - int found = CLASSTYPE_TEMPLATE_INSTANTIATION (type); - - if (! found && ! final) - { - tree method; - for (method = TYPE_METHODS (type); method != NULL_TREE; - method = TREE_CHAIN (method)) - if (DECL_VINDEX (method) != NULL_TREE - && ! DECL_THIS_INLINE (method) - && ! DECL_ABSTRACT_VIRTUAL_P (method)) - { - found = 1; - break; - } - } - - if (final || ! found) - { - comdat_linkage (decl); - DECL_EXTERNAL (decl) = 0; - } - else - { - TREE_PUBLIC (decl) = 1; - DECL_EXTERNAL (decl) = 1; - } - } -} - -/* Determine whether or not we want to specifically import or export CTYPE, - using various heuristics. */ - -void -import_export_class (ctype) - tree ctype; -{ - /* -1 for imported, 1 for exported. */ - int import_export = 0; - - if (CLASSTYPE_INTERFACE_KNOWN (ctype)) - return; - -#ifdef VALID_MACHINE_TYPE_ATTRIBUTE - /* FIXME this should really use some sort of target-independent macro. */ - if (lookup_attribute ("dllimport", TYPE_ATTRIBUTES (ctype))) - import_export = -1; - else if (lookup_attribute ("dllexport", TYPE_ATTRIBUTES (ctype))) - import_export = 1; -#endif - - /* If we got -fno-implicit-templates, we import template classes that - weren't explicitly instantiated. */ - if (import_export == 0 - && CLASSTYPE_IMPLICIT_INSTANTIATION (ctype) - && ! flag_implicit_templates) - import_export = -1; - - /* Base our import/export status on that of the first non-inline, - non-abstract virtual function, if any. */ - if (import_export == 0 - && TYPE_VIRTUAL_P (ctype) - && ! CLASSTYPE_TEMPLATE_INSTANTIATION (ctype)) - { - tree method; - for (method = TYPE_METHODS (ctype); method != NULL_TREE; - method = TREE_CHAIN (method)) - { - if (DECL_VINDEX (method) != NULL_TREE - && !DECL_THIS_INLINE (method) - && !DECL_ABSTRACT_VIRTUAL_P (method)) - { - import_export = (DECL_REALLY_EXTERN (method) ? -1 : 1); - break; - } - } - } - -#ifdef MULTIPLE_SYMBOL_SPACES - if (import_export == -1) - import_export = 0; -#endif - - if (import_export) - { - SET_CLASSTYPE_INTERFACE_KNOWN (ctype); - CLASSTYPE_VTABLE_NEEDS_WRITING (ctype) = (import_export > 0); - CLASSTYPE_INTERFACE_ONLY (ctype) = (import_export < 0); - } -} - -/* We need to describe to the assembler the relationship between - a vtable and the vtable of the parent class. */ - -static void -output_vtable_inherit (vars) - tree vars; -{ - tree parent; - rtx op[2]; - - op[0] = XEXP (DECL_RTL (vars), 0); /* strip the mem ref */ - - parent = binfo_for_vtable (vars); - - if (parent == TYPE_BINFO (DECL_CONTEXT (vars))) - op[1] = const0_rtx; - else if (parent) - { - parent = TYPE_BINFO_VTABLE (BINFO_TYPE (parent)); - op[1] = XEXP (DECL_RTL (parent), 0); /* strip the mem ref */ - } - else - my_friendly_abort (980826); - - output_asm_insn (".vtable_inherit %c0, %c1", op); -} - -static int -finish_vtable_vardecl (prev, vars) - tree prev, vars; -{ - tree ctype = DECL_CONTEXT (vars); - import_export_class (ctype); - import_export_vtable (vars, ctype, 1); - - if (! DECL_EXTERNAL (vars) - && (DECL_INTERFACE_KNOWN (vars) - || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (vars)) - || (hack_decl_function_context (vars) && TREE_USED (vars))) - && ! TREE_ASM_WRITTEN (vars)) - { - /* Write it out. */ - mark_vtable_entries (vars); - if (TREE_TYPE (DECL_INITIAL (vars)) == 0) - store_init_value (vars, DECL_INITIAL (vars)); - - if (write_symbols == DWARF_DEBUG || write_symbols == DWARF2_DEBUG) - { - /* Mark the VAR_DECL node representing the vtable itself as a - "gratuitous" one, thereby forcing dwarfout.c to ignore it. - It is rather important that such things be ignored because - any effort to actually generate DWARF for them will run - into trouble when/if we encounter code like: - - #pragma interface - struct S { virtual void member (); }; - - because the artificial declaration of the vtable itself (as - manufactured by the g++ front end) will say that the vtable - is a static member of `S' but only *after* the debug output - for the definition of `S' has already been output. This causes - grief because the DWARF entry for the definition of the vtable - will try to refer back to an earlier *declaration* of the - vtable as a static member of `S' and there won't be one. - We might be able to arrange to have the "vtable static member" - attached to the member list for `S' before the debug info for - `S' get written (which would solve the problem) but that would - require more intrusive changes to the g++ front end. */ - - DECL_IGNORED_P (vars) = 1; - } - - /* Always make vtables weak. */ - if (flag_weak) - comdat_linkage (vars); - - rest_of_decl_compilation (vars, NULL_PTR, 1, 1); - - if (flag_vtable_gc) - output_vtable_inherit (vars); - - return 1; - } - else if (! TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (vars))) - /* We don't know what to do with this one yet. */ - return 0; - - /* We know that PREV must be non-zero here. */ - TREE_CHAIN (prev) = TREE_CHAIN (vars); - return 0; -} - -static int -prune_vtable_vardecl (prev, vars) - tree prev, vars; -{ - /* We know that PREV must be non-zero here. */ - TREE_CHAIN (prev) = TREE_CHAIN (vars); - return 1; -} - -int -walk_vtables (typedecl_fn, vardecl_fn) - register void (*typedecl_fn) PROTO ((tree, tree)); - register int (*vardecl_fn) PROTO ((tree, tree)); -{ - tree prev, vars; - int flag = 0; - - for (prev = 0, vars = getdecls (); vars; vars = TREE_CHAIN (vars)) - { - register tree type = TREE_TYPE (vars); - - if (TREE_CODE (vars) == VAR_DECL && DECL_VIRTUAL_P (vars)) - { - if (vardecl_fn) - flag |= (*vardecl_fn) (prev, vars); - - if (prev && TREE_CHAIN (prev) != vars) - continue; - } - else if (TREE_CODE (vars) == TYPE_DECL - && type != error_mark_node - && TYPE_LANG_SPECIFIC (type) - && CLASSTYPE_VSIZE (type)) - { - if (typedecl_fn) (*typedecl_fn) (prev, vars); - } - - prev = vars; - } - - return flag; -} - -static void -finish_sigtable_vardecl (prev, vars) - tree prev, vars; -{ - /* We don't need to mark sigtable entries as addressable here as is done - for vtables. Since sigtables, unlike vtables, are always written out, - that was already done in build_signature_table_constructor. */ - - rest_of_decl_compilation (vars, NULL_PTR, 1, 1); - - /* We know that PREV must be non-zero here. */ - TREE_CHAIN (prev) = TREE_CHAIN (vars); -} - -void -walk_sigtables (typedecl_fn, vardecl_fn) - register void (*typedecl_fn) PROTO((tree, tree)); - register void (*vardecl_fn) PROTO((tree, tree)); -{ - tree prev, vars; - - for (prev = 0, vars = getdecls (); vars; vars = TREE_CHAIN (vars)) - { - register tree type = TREE_TYPE (vars); - - if (TREE_CODE (vars) == TYPE_DECL - && type != error_mark_node - && IS_SIGNATURE (type)) - { - if (typedecl_fn) (*typedecl_fn) (prev, vars); - } - else if (TREE_CODE (vars) == VAR_DECL - && TREE_TYPE (vars) != error_mark_node - && IS_SIGNATURE (TREE_TYPE (vars))) - { - if (vardecl_fn) (*vardecl_fn) (prev, vars); - } - else - prev = vars; - } -} - -/* Determines the proper settings of TREE_PUBLIC and DECL_EXTERNAL for an - inline function or template instantiation at end-of-file. */ - -void -import_export_decl (decl) - tree decl; -{ - if (DECL_INTERFACE_KNOWN (decl)) - return; - - if (DECL_TEMPLATE_INSTANTIATION (decl) - || DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (decl)) - { - DECL_NOT_REALLY_EXTERN (decl) = 1; - if ((DECL_IMPLICIT_INSTANTIATION (decl) - || DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (decl)) - && (flag_implicit_templates - || (flag_implicit_inline_templates && DECL_THIS_INLINE (decl)))) - { - if (!TREE_PUBLIC (decl)) - /* Templates are allowed to have internal linkage. See - [basic.link]. */ - ; - else if (TREE_CODE (decl) == FUNCTION_DECL) - comdat_linkage (decl); - else - DECL_COMDAT (decl) = 1; - } - else - DECL_NOT_REALLY_EXTERN (decl) = 0; - } - else if (DECL_FUNCTION_MEMBER_P (decl)) - { - tree ctype = DECL_CLASS_CONTEXT (decl); - import_export_class (ctype); - if (CLASSTYPE_INTERFACE_KNOWN (ctype) - && (! DECL_ARTIFICIAL (decl) || DECL_VINDEX (decl))) - { - DECL_NOT_REALLY_EXTERN (decl) - = ! (CLASSTYPE_INTERFACE_ONLY (ctype) - || (DECL_THIS_INLINE (decl) && ! flag_implement_inlines)); - - /* Always make artificials weak. */ - if (DECL_ARTIFICIAL (decl) && flag_weak) - comdat_linkage (decl); - else - maybe_make_one_only (decl); - } - else - comdat_linkage (decl); - } - /* tinfo function */ - else if (DECL_ARTIFICIAL (decl) && DECL_MUTABLE_P (decl)) - { - tree ctype = TREE_TYPE (DECL_NAME (decl)); - - if (IS_AGGR_TYPE (ctype)) - import_export_class (ctype); - - if (IS_AGGR_TYPE (ctype) && CLASSTYPE_INTERFACE_KNOWN (ctype) - && TYPE_VIRTUAL_P (ctype) - /* If the type is a cv-qualified variant of a type, then we - must emit the tinfo function in this translation unit - since it will not be emitted when the vtable for the type - is output (which is when the unqualified version is - generated). */ - && ctype == TYPE_MAIN_VARIANT (ctype)) - { - DECL_NOT_REALLY_EXTERN (decl) - = ! (CLASSTYPE_INTERFACE_ONLY (ctype) - || (DECL_THIS_INLINE (decl) && ! flag_implement_inlines)); - - /* Always make artificials weak. */ - if (flag_weak) - comdat_linkage (decl); - } - else if (TYPE_BUILT_IN (ctype) && ctype == TYPE_MAIN_VARIANT (ctype)) - DECL_NOT_REALLY_EXTERN (decl) = 0; - else - comdat_linkage (decl); - } - else - comdat_linkage (decl); - - DECL_INTERFACE_KNOWN (decl) = 1; -} - -tree -build_cleanup (decl) - tree decl; -{ - tree temp; - tree type = TREE_TYPE (decl); - - if (TREE_CODE (type) == ARRAY_TYPE) - temp = decl; - else - { - mark_addressable (decl); - temp = build1 (ADDR_EXPR, build_pointer_type (type), decl); - } - temp = build_delete (TREE_TYPE (temp), temp, - integer_two_node, - LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0); - return temp; -} - -extern int parse_time, varconst_time; -extern tree pending_templates; -extern tree maybe_templates; - -static tree -get_sentry (base) - tree base; -{ - tree sname = get_id_2 ("__sn", base); - /* For struct X foo __attribute__((weak)), there is a counter - __snfoo. Since base is already an assembler name, sname should - be globally unique */ - tree sentry = IDENTIFIER_GLOBAL_VALUE (sname); - if (! sentry) - { - push_obstacks_nochange (); - end_temporary_allocation (); - sentry = build_decl (VAR_DECL, sname, integer_type_node); - TREE_PUBLIC (sentry) = 1; - DECL_ARTIFICIAL (sentry) = 1; - TREE_STATIC (sentry) = 1; - TREE_USED (sentry) = 1; - DECL_COMMON (sentry) = 1; - pushdecl_top_level (sentry); - cp_finish_decl (sentry, NULL_TREE, NULL_TREE, 0, 0); - pop_obstacks (); - } - return sentry; -} - -/* A list of objects which have constructors or destructors - which reside in the global scope. The decl is stored in - the TREE_VALUE slot and the initializer is stored - in the TREE_PURPOSE slot. */ -extern tree static_aggregates_initp; - -/* Set up the static_aggregates* lists for processing. Subroutine of - finish_file. Note that this function changes the format of - static_aggregates_initp, from (priority . decl) to - (priority . ((initializer . decl) ...)). */ - -static void -setup_initp () -{ - tree t, *p, next_t; - - /* First, remove any entries from static_aggregates that are also in - static_aggregates_initp, and update the entries in _initp to - include the initializer. */ - p = &static_aggregates; - for (; *p; ) - { - /* We check for symbol equivalence rather than identical decls - because decl_attributes is run before duplicate_decls. */ - for (t = static_aggregates_initp; t; t = TREE_CHAIN (t)) - if (DECL_ASSEMBLER_NAME (TREE_VALUE (t)) - == DECL_ASSEMBLER_NAME (TREE_VALUE (*p))) - break; - - if (t) - { - TREE_VALUE (t) = *p; - *p = TREE_CHAIN (*p); - TREE_CHAIN (TREE_VALUE (t)) = NULL_TREE; - } - else - p = &TREE_CHAIN (*p); - } - - /* Then, group static_aggregates_initp. After this step, there will only - be one entry for each priority, with a chain coming off it. */ - t = static_aggregates_initp; - static_aggregates_initp = NULL_TREE; - - for (; t; t = next_t) - { - next_t = TREE_CHAIN (t); - - for (p = &static_aggregates_initp; ; p = &TREE_CHAIN (*p)) - { - if (*p == NULL_TREE - || tree_int_cst_lt (TREE_PURPOSE (*p), TREE_PURPOSE (t))) - { - TREE_CHAIN (t) = *p; - *p = t; - break; - } - else if (tree_int_cst_equal (TREE_PURPOSE (*p), TREE_PURPOSE (t))) - { - TREE_CHAIN (TREE_VALUE (t)) = TREE_VALUE (*p); - TREE_VALUE (*p) = TREE_VALUE (t); - break; - } - } - } - - /* Reverse each list to preserve the order (currently reverse declaration - order, for destructors). */ - for (t = static_aggregates_initp; t; t = TREE_CHAIN (t)) - TREE_VALUE (t) = nreverse (TREE_VALUE (t)); -} - -/* Start the process of running a particular set of global constructors - or destructors. Subroutine of do_[cd]tors. */ - -static void -start_objects (method_type, initp) - int method_type, initp; -{ - tree fnname; - char type[10]; - - /* Make ctor or dtor function. METHOD_TYPE may be 'I' or 'D'. */ - - if (initp != DEFAULT_INIT_PRIORITY) - { - char joiner; - -#ifdef JOINER - joiner = JOINER; -#else - joiner = '_'; -#endif - - sprintf (type, "%c%c%.5u", method_type, joiner, initp); - } - else - sprintf (type, "%c", method_type); - - fnname = get_file_function_name_long (type); - - start_function (void_list_node, - make_call_declarator (fnname, void_list_node, NULL_TREE, - NULL_TREE), - NULL_TREE, 0); - - store_parm_decls (); - pushlevel (0); - clear_last_expr (); - push_momentary (); - expand_start_bindings (0); -} - -/* Finish the process of running a particular set of global constructors - or destructors. Subroutine of do_[cd]tors. */ - -static void -finish_objects (method_type, initp) - int method_type, initp; -{ - char *fnname; - - if (! initp) - { - tree list = (method_type == 'I' ? static_ctors : static_dtors); - - if (! current_function_decl && list) - start_objects (method_type, initp); - - for (; list; list = TREE_CHAIN (list)) - expand_expr_stmt (build_function_call (TREE_VALUE (list), NULL_TREE)); - } - - if (! current_function_decl) - return; - - fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0); - - /* Finish up. */ - expand_end_bindings (getdecls (), 1, 0); - poplevel (1, 0, 0); - pop_momentary (); - finish_function (lineno, 0, 0); - - if (initp == DEFAULT_INIT_PRIORITY) - { - if (method_type == 'I') - assemble_constructor (fnname); - else - assemble_destructor (fnname); - } - -#ifdef ASM_OUTPUT_SECTION_NAME - /* If we're using init priority we can't use assemble_*tor, but on ELF - targets we can stick the references into named sections for GNU ld - to collect. */ - else - { - char buf[15]; - sprintf (buf, ".%ctors.%.5u", method_type == 'I' ? 'c' : 'd', - /* invert the numbering so the linker puts us in the proper - order; constructors are run from right to left, and the - linker sorts in increasing order. */ - MAX_INIT_PRIORITY - initp); - named_section (NULL_TREE, buf, 0); - assemble_integer (gen_rtx_SYMBOL_REF (Pmode, fnname), - POINTER_SIZE / BITS_PER_UNIT, 1); - } -#endif -} - -/* Generate a function to run a set of global destructors. START is either - NULL_TREE or a node indicating a set of destructors with the same - init priority. Subroutine of finish_file. */ - -static void -do_dtors (start) - tree start; -{ - tree vars; - int initp; - - if (start) - { - initp = TREE_INT_CST_LOW (TREE_PURPOSE (start)); - vars = TREE_VALUE (start); - } - else - { - initp = DEFAULT_INIT_PRIORITY; - vars = static_aggregates; - } - - for (; vars; vars = TREE_CHAIN (vars)) - { - tree decl = TREE_VALUE (vars); - tree type = TREE_TYPE (decl); - tree temp; - - if (TYPE_NEEDS_DESTRUCTOR (type) && ! TREE_STATIC (vars) - && ! DECL_EXTERNAL (decl)) - { - int protect = (TREE_PUBLIC (decl) && (DECL_COMMON (decl) - || DECL_ONE_ONLY (decl) - || DECL_WEAK (decl))); - - if (! current_function_decl) - start_objects ('D', initp); - - /* Set these global variables so that GDB at least puts - us near the declaration which required the initialization. */ - input_filename = DECL_SOURCE_FILE (decl); - lineno = DECL_SOURCE_LINE (decl); - emit_note (input_filename, lineno); - - /* Because of: - - [class.access.spec] - - Access control for implicit calls to the constructors, - the conversion functions, or the destructor called to - create and destroy a static data member is performed as - if these calls appeared in the scope of the member's - class. - - we must convince enforce_access to let us access the - DECL. */ - if (member_p (decl)) - { - DECL_CLASS_CONTEXT (current_function_decl) - = DECL_CONTEXT (decl); - DECL_STATIC_FUNCTION_P (current_function_decl) = 1; - } - - temp = build_cleanup (decl); - - if (protect) - { - tree sentry = get_sentry (DECL_ASSEMBLER_NAME (decl)); - sentry = build_unary_op (PREDECREMENT_EXPR, sentry, 0); - sentry = build_binary_op (EQ_EXPR, sentry, integer_zero_node, 1); - expand_start_cond (sentry, 0); - } - - expand_expr_stmt (temp); - - if (protect) - expand_end_cond (); - - /* Now that we're done with DECL we don't need to pretend to - be a member of its class any longer. */ - DECL_CLASS_CONTEXT (current_function_decl) = NULL_TREE; - DECL_STATIC_FUNCTION_P (current_function_decl) = 0; - } - } - - finish_objects ('D', initp); -} - -/* Generate a function to run a set of global constructors. START is - either NULL_TREE or a node indicating a set of constructors with the - same init priority. Subroutine of finish_file. */ - -static void -do_ctors (start) - tree start; -{ - tree vars; - int initp; - - if (start) - { - initp = TREE_INT_CST_LOW (TREE_PURPOSE (start)); - vars = TREE_VALUE (start); - } - else - { - initp = DEFAULT_INIT_PRIORITY; - vars = static_aggregates; - } - - /* Reverse the list so it's in the right order for ctors. */ - vars = nreverse (vars); - - for (; vars; vars = TREE_CHAIN (vars)) - { - tree decl = TREE_VALUE (vars); - tree init = TREE_PURPOSE (vars); - - /* If this was a static attribute within some function's scope, - then don't initialize it here. Also, don't bother - with initializers that contain errors. */ - if (TREE_STATIC (vars) - || DECL_EXTERNAL (decl) - || (init && TREE_CODE (init) == TREE_LIST - && value_member (error_mark_node, init))) - continue; - - if (TREE_CODE (decl) == VAR_DECL) - { - int protect = (TREE_PUBLIC (decl) && (DECL_COMMON (decl) - || DECL_ONE_ONLY (decl) - || DECL_WEAK (decl))); - - if (! current_function_decl) - start_objects ('I', initp); - - /* Set these global variables so that GDB at least puts - us near the declaration which required the initialization. */ - input_filename = DECL_SOURCE_FILE (decl); - lineno = DECL_SOURCE_LINE (decl); - emit_note (input_filename, lineno); - - /* 9.5p5: The initializer of a static member of a class has - the same access rights as a member function. */ - if (member_p (decl)) - { - DECL_CLASS_CONTEXT (current_function_decl) - = DECL_CONTEXT (decl); - DECL_STATIC_FUNCTION_P (current_function_decl) = 1; - } - - if (protect) - { - tree sentry = get_sentry (DECL_ASSEMBLER_NAME (decl)); - sentry = build_unary_op (PREINCREMENT_EXPR, sentry, 0); - sentry = build_binary_op - (EQ_EXPR, sentry, integer_one_node, 1); - expand_start_cond (sentry, 0); - } - - expand_start_target_temps (); - - if (IS_AGGR_TYPE (TREE_TYPE (decl)) - || TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE) - expand_aggr_init (decl, init, 0); - else if (TREE_CODE (init) == TREE_VEC) - { - expand_expr (expand_vec_init (decl, TREE_VEC_ELT (init, 0), - TREE_VEC_ELT (init, 1), - TREE_VEC_ELT (init, 2), 0), - const0_rtx, VOIDmode, EXPAND_NORMAL); - } - else - expand_assignment (decl, init, 0, 0); - - /* The expression might have involved increments and - decrements. */ - emit_queue (); - - /* Cleanup any temporaries needed for the initial value. */ - expand_end_target_temps (); - - if (protect) - expand_end_cond (); - - DECL_CLASS_CONTEXT (current_function_decl) = NULL_TREE; - DECL_STATIC_FUNCTION_P (current_function_decl) = 0; - } - else if (decl == error_mark_node) - /* OK */; - else - my_friendly_abort (22); - } - - finish_objects ('I', initp); -} - -/* This routine is called from the last rule in yyparse (). - Its job is to create all the code needed to initialize and - destroy the global aggregates. We do the destruction - first, since that way we only need to reverse the decls once. */ - -void -finish_file () -{ - extern int lineno; - int start_time, this_time; - - tree fnname; - tree vars; - int needs_cleaning = 0, needs_messing_up = 0; - - at_eof = 1; - - /* Bad parse errors. Just forget about it. */ - if (! global_bindings_p () || current_class_type) - return; - - check_decl_namespace (); - - start_time = get_run_time (); - - /* Otherwise, GDB can get confused, because in only knows - about source for LINENO-1 lines. */ - lineno -= 1; - - interface_unknown = 1; - interface_only = 0; - - for (fnname = pending_templates; fnname; fnname = TREE_CHAIN (fnname)) - { - tree srcloc = TREE_PURPOSE (fnname); - tree decl = TREE_VALUE (fnname); - - input_filename = SRCLOC_FILE (srcloc); - lineno = SRCLOC_LINE (srcloc); - - if (TREE_CODE_CLASS (TREE_CODE (decl)) == 't') - { - instantiate_class_template (decl); - if (CLASSTYPE_TEMPLATE_INSTANTIATION (decl)) - for (vars = TYPE_METHODS (decl); vars; vars = TREE_CHAIN (vars)) - if (! DECL_ARTIFICIAL (vars)) - instantiate_decl (vars); - } - else - instantiate_decl (decl); - } - - for (fnname = maybe_templates; fnname; fnname = TREE_CHAIN (fnname)) - { - tree args, fn, decl = TREE_VALUE (fnname); - - if (DECL_INITIAL (decl)) - continue; - - fn = TREE_PURPOSE (fnname); - args = get_bindings (fn, decl, NULL_TREE); - fn = instantiate_template (fn, args); - instantiate_decl (fn); - } - - cat_namespace_levels(); - - /* Push into C language context, because that's all - we'll need here. */ - push_lang_context (lang_name_c); - -#if 1 - /* The reason for pushing garbage onto the global_binding_level is to - ensure that we can slice out _DECLs which pertain to virtual function - tables. If the last thing pushed onto the global_binding_level was a - virtual function table, then slicing it out would slice away all the - decls (i.e., we lose the head of the chain). - - There are several ways of getting the same effect, from changing the - way that iterators over the chain treat the elements that pertain to - virtual function tables, moving the implementation of this code to - decl.c (where we can manipulate global_binding_level directly), - popping the garbage after pushing it and slicing away the vtable - stuff, or just leaving it alone. */ - - /* Make last thing in global scope not be a virtual function table. */ -#if 0 /* not yet, should get fixed properly later */ - vars = make_type_decl (get_identifier (" @%$#@!"), integer_type_node); -#else - vars = build_decl (TYPE_DECL, get_identifier (" @%$#@!"), integer_type_node); -#endif - DECL_IGNORED_P (vars) = 1; - SET_DECL_ARTIFICIAL (vars); - pushdecl (vars); -#endif - - for (vars = static_aggregates; vars; vars = TREE_CHAIN (vars)) - if (! TREE_ASM_WRITTEN (TREE_VALUE (vars))) - rest_of_decl_compilation (TREE_VALUE (vars), 0, 1, 1); - vars = static_aggregates; - - if (static_ctors || vars) - needs_messing_up = 1; - if (static_dtors || vars) - needs_cleaning = 1; - - setup_initp (); - - /* After setup_initp, the aggregates are listed in reverse declaration - order, for cleaning. */ - if (needs_cleaning) - { - do_dtors (NULL_TREE); - - for (vars = static_aggregates_initp; vars; vars = TREE_CHAIN (vars)) - do_dtors (vars); - } - - /* do_ctors will reverse the lists for messing up. */ - if (needs_messing_up) - { - do_ctors (NULL_TREE); - - for (vars = static_aggregates_initp; vars; vars = TREE_CHAIN (vars)) - do_ctors (vars); - } - - permanent_allocation (1); - - /* Done with C language context needs. */ - pop_lang_context (); - - /* Now write out any static class variables (which may have since - learned how to be initialized). */ - while (pending_statics) - { - tree decl = TREE_VALUE (pending_statics); - - /* Output DWARF debug information. */ -#ifdef DWARF_DEBUGGING_INFO - if (write_symbols == DWARF_DEBUG) - dwarfout_file_scope_decl (decl, 1); -#endif -#ifdef DWARF2_DEBUGGING_INFO - if (write_symbols == DWARF2_DEBUG) - dwarf2out_decl (decl); -#endif - - DECL_DEFER_OUTPUT (decl) = 0; - rest_of_decl_compilation - (decl, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)), 1, 1); - - pending_statics = TREE_CHAIN (pending_statics); - } - - this_time = get_run_time (); - parse_time -= this_time - start_time; - varconst_time += this_time - start_time; - - start_time = get_run_time (); - - if (flag_handle_signatures) - walk_sigtables ((void (*) PROTO ((tree, tree))) 0, - finish_sigtable_vardecl); - - for (fnname = saved_inlines; fnname; fnname = TREE_CHAIN (fnname)) - { - tree decl = TREE_VALUE (fnname); - import_export_decl (decl); - } - - mark_all_runtime_matches (); - - /* Now write out inline functions which had their addresses taken and - which were not declared virtual and which were not declared `extern - inline'. */ - { - int reconsider = 1; /* More may be referenced; check again */ - - while (reconsider) - { - tree *p = &saved_inlines; - reconsider = 0; - - /* We need to do this each time so that newly completed template - types don't wind up at the front of the list. Sigh. */ - vars = build_decl (TYPE_DECL, make_anon_name (), integer_type_node); - DECL_IGNORED_P (vars) = 1; - SET_DECL_ARTIFICIAL (vars); - pushdecl (vars); - - reconsider |= walk_vtables ((void (*) PROTO((tree, tree))) 0, - finish_vtable_vardecl); - - while (*p) - { - tree decl = TREE_VALUE (*p); - - if (DECL_ARTIFICIAL (decl) && ! DECL_INITIAL (decl) - && TREE_USED (decl) - && (! DECL_REALLY_EXTERN (decl) || DECL_INLINE (decl))) - { - if (DECL_MUTABLE_P (decl)) - synthesize_tinfo_fn (decl); - else - synthesize_method (decl); - reconsider = 1; - } - - /* Catch new template instantiations. */ - if (decl != TREE_VALUE (*p)) - continue; - - if (TREE_ASM_WRITTEN (decl) - || (DECL_SAVED_INSNS (decl) == 0 && ! DECL_ARTIFICIAL (decl))) - *p = TREE_CHAIN (*p); - else if (DECL_INITIAL (decl) == 0) - p = &TREE_CHAIN (*p); - else if ((TREE_PUBLIC (decl) && ! DECL_COMDAT (decl)) - || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)) - || flag_keep_inline_functions) - { - if (DECL_NOT_REALLY_EXTERN (decl)) - { - DECL_EXTERNAL (decl) = 0; - reconsider = 1; - /* We can't inline this function after it's been - emitted. We want a variant of - output_inline_function that doesn't prevent - subsequent integration... */ - DECL_INLINE (decl) = 0; - output_inline_function (decl); - permanent_allocation (1); - } - - *p = TREE_CHAIN (*p); - } - else - p = &TREE_CHAIN (*p); - } - } - - /* It's possible that some of the remaining inlines will still be - needed. For example, a static inline whose address is used in - the initializer for a file-scope static variable will be - needed. Code in compile_file will handle this, but we mustn't - pretend that there are no definitions for the inlines, or it - won't be able to. - - FIXME: This won't catch member functions. We should really - unify this stuff with the compile_file stuff. */ - for (vars = saved_inlines; vars != NULL_TREE; vars = TREE_CHAIN (vars)) - { - tree decl = TREE_VALUE (vars); - - if (DECL_NOT_REALLY_EXTERN (decl) - && !DECL_COMDAT (decl) - && DECL_INITIAL (decl) != NULL_TREE) - DECL_EXTERNAL (decl) = 0; - } - } - - /* Now delete from the chain of variables all virtual function tables. - We output them all ourselves, because each will be treated specially. */ - - walk_vtables ((void (*) PROTO((tree, tree))) 0, - prune_vtable_vardecl); - - finish_repo (); - - this_time = get_run_time (); - parse_time -= this_time - start_time; - varconst_time += this_time - start_time; - - if (flag_detailed_statistics) - { - dump_tree_statistics (); - dump_time_statistics (); - } -} - -/* This is something of the form 'A()()()()()+1' that has turned out to be an - expr. Since it was parsed like a type, we need to wade through and fix - that. Unfortunately, since operator() is left-associative, we can't use - tail recursion. In the above example, TYPE is `A', and DECL is - `()()()()()'. - - Maybe this shouldn't be recursive, but how often will it actually be - used? (jason) */ - -tree -reparse_absdcl_as_expr (type, decl) - tree type, decl; -{ - /* do build_functional_cast (type, NULL_TREE) at bottom */ - if (TREE_OPERAND (decl, 0) == NULL_TREE) - return build_functional_cast (type, NULL_TREE); - - /* recurse */ - decl = reparse_absdcl_as_expr (type, TREE_OPERAND (decl, 0)); - - decl = build_x_function_call (decl, NULL_TREE, current_class_ref); - - if (TREE_CODE (decl) == CALL_EXPR && TREE_TYPE (decl) != void_type_node) - decl = require_complete_type (decl); - - return decl; -} - -/* This is something of the form `int ((int)(int)(int)1)' that has turned - out to be an expr. Since it was parsed like a type, we need to wade - through and fix that. Since casts are right-associative, we are - reversing the order, so we don't have to recurse. - - In the above example, DECL is the `(int)(int)(int)', and EXPR is the - `1'. */ - -tree -reparse_absdcl_as_casts (decl, expr) - tree decl, expr; -{ - tree type; - - if (TREE_CODE (expr) == CONSTRUCTOR - && TREE_TYPE (expr) == 0) - { - type = groktypename (TREE_VALUE (TREE_OPERAND (decl, 1))); - decl = TREE_OPERAND (decl, 0); - - if (IS_SIGNATURE (type)) - { - error ("cast specifies signature type"); - return error_mark_node; - } - - expr = digest_init (type, expr, (tree *) 0); - if (TREE_CODE (type) == ARRAY_TYPE && TYPE_SIZE (type) == 0) - { - int failure = complete_array_type (type, expr, 1); - if (failure) - my_friendly_abort (78); - } - } - - while (decl) - { - type = groktypename (TREE_VALUE (TREE_OPERAND (decl, 1))); - decl = TREE_OPERAND (decl, 0); - expr = build_c_cast (type, expr); - } - - if (warn_old_style_cast) - warning ("use of old-style cast"); - - return expr; -} - -/* Given plain tree nodes for an expression, build up the full semantics. */ - -tree -build_expr_from_tree (t) - tree t; -{ - if (t == NULL_TREE || t == error_mark_node) - return t; - - switch (TREE_CODE (t)) - { - case IDENTIFIER_NODE: - return do_identifier (t, 0, NULL_TREE); - - case LOOKUP_EXPR: - if (LOOKUP_EXPR_GLOBAL (t)) - return do_scoped_id (TREE_OPERAND (t, 0), 0); - else - return do_identifier (TREE_OPERAND (t, 0), 0, NULL_TREE); - - case TEMPLATE_ID_EXPR: - return (lookup_template_function - (build_expr_from_tree (TREE_OPERAND (t, 0)), - build_expr_from_tree (TREE_OPERAND (t, 1)))); - - case INDIRECT_REF: - return build_x_indirect_ref - (build_expr_from_tree (TREE_OPERAND (t, 0)), "unary *"); - - case CAST_EXPR: - return build_functional_cast - (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0))); - - case REINTERPRET_CAST_EXPR: - return build_reinterpret_cast - (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0))); - - case CONST_CAST_EXPR: - return build_const_cast - (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0))); - - case DYNAMIC_CAST_EXPR: - return build_dynamic_cast - (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0))); - - case STATIC_CAST_EXPR: - return build_static_cast - (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0))); - - case PREDECREMENT_EXPR: - case PREINCREMENT_EXPR: - case POSTDECREMENT_EXPR: - case POSTINCREMENT_EXPR: - case NEGATE_EXPR: - case BIT_NOT_EXPR: - case ABS_EXPR: - case TRUTH_NOT_EXPR: - case ADDR_EXPR: - case CONVERT_EXPR: /* Unary + */ - if (TREE_TYPE (t)) - return t; - return build_x_unary_op (TREE_CODE (t), - build_expr_from_tree (TREE_OPERAND (t, 0))); - - case PLUS_EXPR: - case MINUS_EXPR: - case MULT_EXPR: - case TRUNC_DIV_EXPR: - case CEIL_DIV_EXPR: - case FLOOR_DIV_EXPR: - case ROUND_DIV_EXPR: - case EXACT_DIV_EXPR: - case BIT_AND_EXPR: - case BIT_ANDTC_EXPR: - case BIT_IOR_EXPR: - case BIT_XOR_EXPR: - case TRUNC_MOD_EXPR: - case FLOOR_MOD_EXPR: - case TRUTH_ANDIF_EXPR: - case TRUTH_ORIF_EXPR: - case TRUTH_AND_EXPR: - case TRUTH_OR_EXPR: - case RSHIFT_EXPR: - case LSHIFT_EXPR: - case RROTATE_EXPR: - case LROTATE_EXPR: - case EQ_EXPR: - case NE_EXPR: - case MAX_EXPR: - case MIN_EXPR: - case LE_EXPR: - case GE_EXPR: - case LT_EXPR: - case GT_EXPR: - case MEMBER_REF: - return build_x_binary_op - (TREE_CODE (t), - build_expr_from_tree (TREE_OPERAND (t, 0)), - build_expr_from_tree (TREE_OPERAND (t, 1))); - - case DOTSTAR_EXPR: - return build_m_component_ref - (build_expr_from_tree (TREE_OPERAND (t, 0)), - build_expr_from_tree (TREE_OPERAND (t, 1))); - - case SCOPE_REF: - return build_offset_ref (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1)); - - case ARRAY_REF: - if (TREE_OPERAND (t, 0) == NULL_TREE) - /* new-type-id */ - return build_parse_node (ARRAY_REF, NULL_TREE, - build_expr_from_tree (TREE_OPERAND (t, 1))); - return grok_array_decl (build_expr_from_tree (TREE_OPERAND (t, 0)), - build_expr_from_tree (TREE_OPERAND (t, 1))); - - case SIZEOF_EXPR: - case ALIGNOF_EXPR: - { - tree r = build_expr_from_tree (TREE_OPERAND (t, 0)); - if (TREE_CODE_CLASS (TREE_CODE (r)) != 't') - r = TREE_TYPE (r); - return TREE_CODE (t) == SIZEOF_EXPR ? c_sizeof (r) : c_alignof (r); - } - - case MODOP_EXPR: - return build_x_modify_expr - (build_expr_from_tree (TREE_OPERAND (t, 0)), - TREE_CODE (TREE_OPERAND (t, 1)), - build_expr_from_tree (TREE_OPERAND (t, 2))); - - case ARROW_EXPR: - return build_x_arrow - (build_expr_from_tree (TREE_OPERAND (t, 0))); - - case NEW_EXPR: - return build_new - (build_expr_from_tree (TREE_OPERAND (t, 0)), - build_expr_from_tree (TREE_OPERAND (t, 1)), - build_expr_from_tree (TREE_OPERAND (t, 2)), - NEW_EXPR_USE_GLOBAL (t)); - - case DELETE_EXPR: - return delete_sanity - (build_expr_from_tree (TREE_OPERAND (t, 0)), - build_expr_from_tree (TREE_OPERAND (t, 1)), - DELETE_EXPR_USE_VEC (t), DELETE_EXPR_USE_GLOBAL (t)); - - case COMPOUND_EXPR: - if (TREE_OPERAND (t, 1) == NULL_TREE) - return build_x_compound_expr - (build_expr_from_tree (TREE_OPERAND (t, 0))); - else - my_friendly_abort (42); - - case METHOD_CALL_EXPR: - if (TREE_CODE (TREE_OPERAND (t, 0)) == SCOPE_REF) - { - tree ref = TREE_OPERAND (t, 0); - return build_scoped_method_call - (build_expr_from_tree (TREE_OPERAND (t, 1)), - build_expr_from_tree (TREE_OPERAND (ref, 0)), - TREE_OPERAND (ref, 1), - build_expr_from_tree (TREE_OPERAND (t, 2))); - } - else - { - tree fn = TREE_OPERAND (t, 0); - - /* We can get a TEMPLATE_ID_EXPR here on code like: - - x->f<2>(); - - so we must resolve that. However, we can also get things - like a BIT_NOT_EXPR here, when referring to a destructor, - and things like that are not correctly resolved by - build_expr_from_tree. So, just use build_expr_from_tree - when we really need it. */ - if (TREE_CODE (fn) == TEMPLATE_ID_EXPR) - fn = build_expr_from_tree (fn); - - return build_method_call - (build_expr_from_tree (TREE_OPERAND (t, 1)), - fn, - build_expr_from_tree (TREE_OPERAND (t, 2)), - NULL_TREE, LOOKUP_NORMAL); - } - - case CALL_EXPR: - if (TREE_CODE (TREE_OPERAND (t, 0)) == SCOPE_REF) - { - tree ref = TREE_OPERAND (t, 0); - return build_member_call - (build_expr_from_tree (TREE_OPERAND (ref, 0)), - TREE_OPERAND (ref, 1), - build_expr_from_tree (TREE_OPERAND (t, 1))); - } - else - { - tree name = TREE_OPERAND (t, 0); - tree id; - tree args = build_expr_from_tree (TREE_OPERAND (t, 1)); - if (args != NULL_TREE && TREE_CODE (name) == LOOKUP_EXPR - && !LOOKUP_EXPR_GLOBAL (name) - && TREE_CODE ((id = TREE_OPERAND (name, 0))) == IDENTIFIER_NODE - && (!current_class_type - || !lookup_member (current_class_type, id, 0, 0))) - { - /* Do Koenig lookup if there are no class members. */ - name = do_identifier (id, 0, args); - } - else if (TREE_CODE (name) == TEMPLATE_ID_EXPR - || ! really_overloaded_fn (name)) - name = build_expr_from_tree (name); - return build_x_function_call (name, args, current_class_ref); - } - - case COND_EXPR: - return build_x_conditional_expr - (build_expr_from_tree (TREE_OPERAND (t, 0)), - build_expr_from_tree (TREE_OPERAND (t, 1)), - build_expr_from_tree (TREE_OPERAND (t, 2))); - - case TREE_LIST: - { - tree purpose, value, chain; - - if (t == void_list_node) - return t; - - purpose = TREE_PURPOSE (t); - if (purpose) - purpose = build_expr_from_tree (purpose); - value = TREE_VALUE (t); - if (value) - value = build_expr_from_tree (value); - chain = TREE_CHAIN (t); - if (chain && chain != void_type_node) - chain = build_expr_from_tree (chain); - return expr_tree_cons (purpose, value, chain); - } - - case COMPONENT_REF: - return build_x_component_ref - (build_expr_from_tree (TREE_OPERAND (t, 0)), - TREE_OPERAND (t, 1), NULL_TREE, 1); - - case THROW_EXPR: - return build_throw (build_expr_from_tree (TREE_OPERAND (t, 0))); - - case CONSTRUCTOR: - { - tree r; - - /* digest_init will do the wrong thing if we let it. */ - if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t))) - return t; - - r = build_nt (CONSTRUCTOR, NULL_TREE, - build_expr_from_tree (CONSTRUCTOR_ELTS (t))); - TREE_HAS_CONSTRUCTOR (r) = TREE_HAS_CONSTRUCTOR (t); - - if (TREE_TYPE (t)) - return digest_init (TREE_TYPE (t), r, 0); - return r; - } - - case TYPEID_EXPR: - if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t, 0))) == 't') - return get_typeid (TREE_OPERAND (t, 0)); - return build_x_typeid (build_expr_from_tree (TREE_OPERAND (t, 0))); - - case VAR_DECL: - return convert_from_reference (t); - - default: - return t; - } -} - -/* This is something of the form `int (*a)++' that has turned out to be an - expr. It was only converted into parse nodes, so we need to go through - and build up the semantics. Most of the work is done by - build_expr_from_tree, above. - - In the above example, TYPE is `int' and DECL is `*a'. */ - -tree -reparse_decl_as_expr (type, decl) - tree type, decl; -{ - decl = build_expr_from_tree (decl); - if (type) - return build_functional_cast (type, build_expr_list (NULL_TREE, decl)); - else - return decl; -} - -/* This is something of the form `int (*a)' that has turned out to be a - decl. It was only converted into parse nodes, so we need to do the - checking that make_{pointer,reference}_declarator do. */ - -tree -finish_decl_parsing (decl) - tree decl; -{ - extern int current_class_depth; - - switch (TREE_CODE (decl)) - { - case IDENTIFIER_NODE: - return decl; - case INDIRECT_REF: - return make_pointer_declarator - (NULL_TREE, finish_decl_parsing (TREE_OPERAND (decl, 0))); - case ADDR_EXPR: - return make_reference_declarator - (NULL_TREE, finish_decl_parsing (TREE_OPERAND (decl, 0))); - case BIT_NOT_EXPR: - TREE_OPERAND (decl, 0) = finish_decl_parsing (TREE_OPERAND (decl, 0)); - return decl; - case SCOPE_REF: - push_nested_class (TREE_TYPE (TREE_OPERAND (decl, 0)), 3); - TREE_COMPLEXITY (decl) = current_class_depth; - return decl; - case ARRAY_REF: - TREE_OPERAND (decl, 0) = finish_decl_parsing (TREE_OPERAND (decl, 0)); - return decl; - case TREE_LIST: - /* For attribute handling. */ - TREE_VALUE (decl) = finish_decl_parsing (TREE_VALUE (decl)); - return decl; - default: - my_friendly_abort (5); - return NULL_TREE; - } -} - -tree -check_cp_case_value (value) - tree value; -{ - if (value == NULL_TREE) - return value; - - /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */ - STRIP_TYPE_NOPS (value); - - if (TREE_READONLY_DECL_P (value)) - { - value = decl_constant_value (value); - STRIP_TYPE_NOPS (value); - } - value = fold (value); - - if (TREE_CODE (value) != INTEGER_CST - && value != error_mark_node) - { - cp_error ("case label `%E' does not reduce to an integer constant", - value); - value = error_mark_node; - } - else - /* Promote char or short to int. */ - value = default_conversion (value); - - constant_expression_warning (value); - - return value; -} - -/* Return 1 if root encloses child. */ - -static int -is_namespace_ancestor (root, child) - tree root, child; -{ - if (root == child) - return 1; - if (root == global_namespace) - return 1; - if (child == global_namespace) - return 0; - return is_namespace_ancestor (root, CP_DECL_CONTEXT (child)); -} - - -/* Return the namespace that is the common ancestor - of two given namespaces. */ - -tree -namespace_ancestor (ns1, ns2) - tree ns1, ns2; -{ - if (is_namespace_ancestor (ns1, ns2)) - return ns1; - return namespace_ancestor (CP_DECL_CONTEXT (ns1), ns2); -} - -/* Insert used into the using list of user. Set indirect_flag if this - directive is not directly from the source. Also find the common - ancestor and let our users know about the new namespace */ -static void -add_using_namespace (user, used, indirect) - tree user; - tree used; - int indirect; -{ - tree t; - /* Using oneself is a no-op. */ - if (user == used) - return; - my_friendly_assert (TREE_CODE (user) == NAMESPACE_DECL, 380); - my_friendly_assert (TREE_CODE (used) == NAMESPACE_DECL, 380); - /* Check if we already have this. */ - t = purpose_member (used, DECL_NAMESPACE_USING (user)); - if (t != NULL_TREE) - { - if (!indirect) - /* Promote to direct usage. */ - TREE_INDIRECT_USING (t) = 0; - return; - } - - /* Add used to the user's using list. */ - DECL_NAMESPACE_USING (user) - = perm_tree_cons (used, namespace_ancestor (user, used), - DECL_NAMESPACE_USING (user)); - - TREE_INDIRECT_USING (DECL_NAMESPACE_USING (user)) = indirect; - - /* Add user to the used's users list. */ - DECL_NAMESPACE_USERS (used) - = perm_tree_cons (user, 0, DECL_NAMESPACE_USERS (used)); - - /* Recursively add all namespaces used. */ - for (t = DECL_NAMESPACE_USING (used); t; t = TREE_CHAIN (t)) - /* indirect usage */ - add_using_namespace (user, TREE_PURPOSE (t), 1); - - /* Tell everyone using us about the new used namespaces. */ - for (t = DECL_NAMESPACE_USERS (user); t; t = TREE_CHAIN (t)) - add_using_namespace (TREE_PURPOSE (t), used, 1); -} - -/* Combines two sets of overloaded functions into an OVERLOAD chain, removing - duplicates. The first list becomes the tail of the result. - - The algorithm is O(n^2). We could get this down to O(n log n) by - doing a sort on the addresses of the functions, if that becomes - necessary. */ - -static tree -merge_functions (s1, s2) - tree s1; - tree s2; -{ - for (; s2; s2 = OVL_NEXT (s2)) - { - tree fn = OVL_CURRENT (s2); - if (! ovl_member (fn, s1)) - s1 = build_overload (fn, s1); - } - return s1; -} - -/* This should return an error not all definitions define functions. - It is not an error if we find two functions with exactly the - same signature, only if these are selected in overload resolution. - old is the current set of bindings, new the freshly-found binding. - XXX Do we want to give *all* candidates in case of ambiguity? - XXX In what way should I treat extern declarations? - XXX I don't want to repeat the entire duplicate_decls here */ - -static tree -ambiguous_decl (name, old, new, flags) - tree name; - tree old; - tree new; - int flags; -{ - tree val, type; - my_friendly_assert (old != NULL_TREE, 393); - /* Copy the value. */ - val = BINDING_VALUE (new); - if (val) - switch (TREE_CODE (val)) - { - case TEMPLATE_DECL: - /* If we expect types or namespaces, and not templates, - or this is not a template class. */ - if (LOOKUP_QUALIFIERS_ONLY (flags) - && (!(flags & LOOKUP_TEMPLATES_EXPECTED) - || !DECL_CLASS_TEMPLATE_P (val))) - val = NULL_TREE; - break; - case TYPE_DECL: - if (LOOKUP_NAMESPACES_ONLY (flags)) - val = NULL_TREE; - break; - case NAMESPACE_DECL: - if (LOOKUP_TYPES_ONLY (flags)) - val = NULL_TREE; - break; - default: - if (LOOKUP_QUALIFIERS_ONLY (flags)) - val = NULL_TREE; - } - - if (!BINDING_VALUE (old)) - BINDING_VALUE (old) = val; - else if (val && val != BINDING_VALUE (old)) - { - if (is_overloaded_fn (BINDING_VALUE (old)) - && is_overloaded_fn (val)) - { - BINDING_VALUE (old) = merge_functions (BINDING_VALUE (old), - val); - } - else - { - /* Some declarations are functions, some are not. */ - if (flags & LOOKUP_COMPLAIN) - { - /* If we've already given this error for this lookup, - BINDING_VALUE (old) is error_mark_node, so let's not - repeat ourselves. */ - if (BINDING_VALUE (old) != error_mark_node) - { - cp_error ("use of `%D' is ambiguous", name); - cp_error_at (" first declared as `%#D' here", - BINDING_VALUE (old)); - } - cp_error_at (" also declared as `%#D' here", val); - } - return error_mark_node; - } - } - /* ... and copy the type. */ - type = BINDING_TYPE (new); - if (LOOKUP_NAMESPACES_ONLY (flags)) - type = NULL_TREE; - if (!BINDING_TYPE (old)) - BINDING_TYPE (old) = type; - else if (type && BINDING_TYPE (old) != type) - { - if (flags & LOOKUP_COMPLAIN) - { - cp_error ("`%D' denotes an ambiguous type",name); - cp_error_at (" first type here", BINDING_TYPE (old)); - cp_error_at (" other type here", type); - } - } - return old; -} - -/* Add the bindings of name in used namespaces to val. - The using list is defined by usings, and the lookup goes to scope. - Returns zero on errors. */ - -int -lookup_using_namespace (name, val, usings, scope, flags) - tree name, val, usings, scope; - int flags; -{ - tree iter; - tree val1; - /* Iterate over all used namespaces in current, searching for using - directives of scope. */ - for (iter = usings; iter; iter = TREE_CHAIN (iter)) - if (TREE_VALUE (iter) == scope) - { - val1 = binding_for_name (name, TREE_PURPOSE (iter)); - /* Resolve ambiguities. */ - val = ambiguous_decl (name, val, val1, flags); - } - return val != error_mark_node; -} - -/* [namespace.qual] - Excepts the name to lookup and its qualifying scope. - Returns the name/type pair found into the CPLUS_BINDING result, - or 0 on error. */ - -int -qualified_lookup_using_namespace (name, scope, result, flags) - tree name; - tree scope; - tree result; - int flags; -{ - /* Maintain a list of namespaces visited... */ - tree seen = NULL_TREE; - /* ... and a list of namespace yet to see. */ - tree todo = NULL_TREE; - tree usings; - while (scope && (result != error_mark_node)) - { - seen = temp_tree_cons (scope, NULL_TREE, seen); - result = ambiguous_decl (name, result, - binding_for_name (name, scope), flags); - if (!BINDING_VALUE (result) && !BINDING_TYPE (result)) - /* Consider using directives. */ - for (usings = DECL_NAMESPACE_USING (scope); usings; - usings = TREE_CHAIN (usings)) - /* If this was a real directive, and we have not seen it. */ - if (!TREE_INDIRECT_USING (usings) - && !purpose_member (TREE_PURPOSE (usings), seen)) - todo = temp_tree_cons (TREE_PURPOSE (usings), NULL_TREE, todo); - if (todo) - { - scope = TREE_PURPOSE (todo); - todo = TREE_CHAIN (todo); - } - else - scope = NULL_TREE; /* If there never was a todo list. */ - } - return result != error_mark_node; -} - -/* [namespace.memdef]/2 */ - -/* Set the context of a declaration to scope. Complain if we are not - outside scope. */ - -void -set_decl_namespace (decl, scope) - tree decl; - tree scope; -{ - tree old; - if (scope == std_node) - scope = global_namespace; - /* Get rid of namespace aliases. */ - scope = ORIGINAL_NAMESPACE (scope); - - if (!is_namespace_ancestor (current_namespace, scope)) - cp_error ("declaration of `%D' not in a namespace surrounding `%D'", - decl, scope); - DECL_CONTEXT (decl) = FROB_CONTEXT (scope); - if (scope != current_namespace) - { - /* See whether this has been declared in the namespace. */ - old = namespace_binding (DECL_NAME (decl), scope); - if (!old) - /* No old declaration at all. */ - goto complain; - if (!is_overloaded_fn (decl)) - /* Don't compare non-function decls with decls_match here, - since it can't check for the correct constness at this - point. pushdecl will find those errors later. */ - return; - /* Since decl is a function, old should contain a function decl. */ - if (!is_overloaded_fn (old)) - goto complain; - for (; old; old = OVL_NEXT (old)) - if (decls_match (decl, OVL_CURRENT (old))) - return; - } - else - return; - complain: - cp_error ("`%D' should have been declared inside `%D'", - decl, scope); -} - -/* Compute the namespace where a declaration is defined. */ - -tree -decl_namespace (decl) - tree decl; -{ - while (DECL_CONTEXT (decl)) - { - decl = DECL_CONTEXT (decl); - if (TREE_CODE (decl) == NAMESPACE_DECL) - return decl; - if (TREE_CODE_CLASS (TREE_CODE (decl)) == 't') - decl = TYPE_STUB_DECL (decl); - my_friendly_assert (TREE_CODE_CLASS (TREE_CODE (decl)) == 'd', 390); - } - - return global_namespace; -} - -/* Return the namespace where the current declaration is declared. */ - -tree -current_decl_namespace () -{ - tree result; - /* If we have been pushed into a different namespace, use it. */ - if (decl_namespace_list) - return TREE_PURPOSE (decl_namespace_list); - - if (current_class_type) - result = decl_namespace (TYPE_STUB_DECL (current_class_type)); - else if (current_function_decl) - result = decl_namespace (current_function_decl); - else - result = current_namespace; - return result; -} - -/* Temporarily set the namespace for the current declaration. */ - -void -push_decl_namespace (decl) - tree decl; -{ - if (TREE_CODE (decl) != NAMESPACE_DECL) - decl = decl_namespace (decl); - decl_namespace_list = tree_cons (decl, NULL_TREE, decl_namespace_list); -} - -void -pop_decl_namespace () -{ - decl_namespace_list = TREE_CHAIN (decl_namespace_list); -} - -static void -check_decl_namespace () -{ - my_friendly_assert (decl_namespace_list == NULL_TREE, 980711); -} - -/* Enter a class or namespace scope. */ - -void -push_scope (t) - tree t; -{ - if (TREE_CODE (t) == NAMESPACE_DECL) - push_decl_namespace (t); - else - pushclass (t, 2); -} - -/* Leave scope pushed by push_scope. */ - -void -pop_scope (t) - tree t; -{ - if (TREE_CODE (t) == NAMESPACE_DECL) - pop_decl_namespace (); - else - popclass (1); -} - -/* [basic.lookup.koenig] */ -/* A non-zero return value in the functions below indicates an error. - All nodes allocated in the procedure are on the scratch obstack. */ - -struct arg_lookup -{ - tree name; - tree namespaces; - tree classes; - tree functions; -}; - -static int arg_assoc PROTO((struct arg_lookup*, tree)); -static int arg_assoc_args PROTO((struct arg_lookup*, tree)); -static int arg_assoc_type PROTO((struct arg_lookup*, tree)); - -/* Add a function to the lookup structure. - Returns 1 on error. */ - -static int -add_function (k, fn) - struct arg_lookup *k; - tree fn; -{ - if (ovl_member (fn, k->functions)) - return 0; - /* We must find only functions, or exactly one non-function. */ - if (k->functions && is_overloaded_fn (k->functions) - && is_overloaded_fn (fn)) - k->functions = build_overload (fn, k->functions); - else - if(k->functions) - { - tree f1 = OVL_CURRENT (k->functions); - tree f2 = fn; - if (is_overloaded_fn (f1)) - { - fn = f1; f1 = f2; f2 = fn; - } - cp_error_at ("`%D' is not a function,", f1); - cp_error_at (" conflict with `%D'", f2); - cp_error (" in call to `%D'", k->name); - return 1; - } - else - k->functions = fn; - return 0; -} - -/* Add functions of a namespace to the lookup structure. - Returns 1 on error. */ - -static int -arg_assoc_namespace (k, scope) - struct arg_lookup *k; - tree scope; -{ - tree value; - - if (purpose_member (scope, k->namespaces)) - return 0; - k->namespaces = tree_cons (scope, NULL_TREE, k->namespaces); - - value = namespace_binding (k->name, scope); - if (!value) - return 0; - - for (; value; value = OVL_NEXT (value)) - if (add_function (k, OVL_CURRENT (value))) - return 1; - - return 0; -} - -/* Adds everything associated with class to the lookup structure. - Returns 1 on error. */ - -static int -arg_assoc_class (k, type) - struct arg_lookup* k; - tree type; -{ - tree list, friends, context; - int i; - - if (purpose_member (type, k->classes)) - return 0; - k->classes = tree_cons (type, NULL_TREE, k->classes); - - context = decl_namespace (TYPE_MAIN_DECL (type)); - if (arg_assoc_namespace (k, context)) - return 1; - - /* Process baseclasses. */ - for (i = 0; i < CLASSTYPE_N_BASECLASSES (type); i++) - if (arg_assoc_class (k, TYPE_BINFO_BASETYPE (type, i))) - return 1; - - /* Process friends. */ - for (list = DECL_FRIENDLIST (TYPE_MAIN_DECL (type)); list; - list = TREE_CHAIN (list)) - if (k->name == TREE_PURPOSE (list)) - for (friends = TREE_VALUE (list); friends; - friends = TREE_CHAIN (friends)) - /* Only interested in global functions with potentially hidden - (i.e. unqualified) declarations. */ - if (TREE_PURPOSE (list) == error_mark_node && TREE_VALUE (list) - && decl_namespace (TREE_VALUE (list)) == context) - if (add_function (k, TREE_VALUE (list))) - return 1; - - /* Process template arguments. */ - if (CLASSTYPE_TEMPLATE_INFO (type)) - { - list = innermost_args (CLASSTYPE_TI_ARGS (type)); - for (i = 0; i < TREE_VEC_LENGTH (list); ++i) - arg_assoc (k, TREE_VEC_ELT (list, i)); - } - - return 0; -} - -/* Adds everything associated with a given type. - Returns 1 on error. */ - -static int -arg_assoc_type (k, type) - struct arg_lookup *k; - tree type; -{ - switch (TREE_CODE (type)) - { - case VOID_TYPE: - case INTEGER_TYPE: - case REAL_TYPE: - case COMPLEX_TYPE: - case CHAR_TYPE: - case BOOLEAN_TYPE: - return 0; - case RECORD_TYPE: - if (TYPE_PTRMEMFUNC_P (type)) - return arg_assoc_type (k, TYPE_PTRMEMFUNC_FN_TYPE (type)); - return arg_assoc_class (k, type); - case POINTER_TYPE: - case REFERENCE_TYPE: - case ARRAY_TYPE: - return arg_assoc_type (k, TREE_TYPE (type)); - case UNION_TYPE: - case ENUMERAL_TYPE: - return arg_assoc_namespace (k, decl_namespace (TYPE_MAIN_DECL (type))); - case OFFSET_TYPE: - /* Pointer to member: associate class type and value type. */ - if (arg_assoc_type (k, TYPE_OFFSET_BASETYPE (type))) - return 1; - return arg_assoc_type (k, TREE_TYPE (type)); - case METHOD_TYPE: - /* The basetype is referenced in the first arg type, so just - fall through. */ - case FUNCTION_TYPE: - /* Associate the parameter types. */ - if (arg_assoc_args (k, TYPE_ARG_TYPES (type))) - return 1; - /* Associate the return type. */ - return arg_assoc_type (k, TREE_TYPE (type)); - case TEMPLATE_TYPE_PARM: - return 0; - case LANG_TYPE: - if (type == unknown_type_node) - return 0; - /* else fall through */ - default: - my_friendly_abort (390); - } - return 0; -} - -/* Adds everything associated with arguments. Returns 1 on error. */ - -static int -arg_assoc_args (k, args) - struct arg_lookup* k; - tree args; -{ - for (; args; args = TREE_CHAIN (args)) - if (arg_assoc (k, TREE_VALUE (args))) - return 1; - return 0; -} - -/* Adds everything associated with a given tree_node. Returns 1 on error. */ - -static int -arg_assoc (k, n) - struct arg_lookup* k; - tree n; -{ - if (n == error_mark_node) - return 0; - - if (TREE_CODE_CLASS (TREE_CODE (n)) == 't') - return arg_assoc_type (k, n); - - if (! type_unknown_p (n)) - return arg_assoc_type (k, TREE_TYPE (n)); - - if (TREE_CODE (n) == ADDR_EXPR) - n = TREE_OPERAND (n, 0); - if (TREE_CODE (n) == COMPONENT_REF) - n = TREE_OPERAND (n, 1); - while (TREE_CODE (n) == TREE_LIST) - n = TREE_VALUE (n); - - if (TREE_CODE (n) == FUNCTION_DECL) - return arg_assoc_type (k, TREE_TYPE (n)); - if (TREE_CODE (n) == TEMPLATE_ID_EXPR) - { - /* [basic.lookup.koenig] - - If T is a template-id, its associated namespaces and classes - are the namespace in which the template is defined; for - member templates, the member template's class; the namespaces - and classes associated with the types of the template - arguments provided for template type parameters (excluding - template template parameters); the namespaces in which any - template template arguments are defined; and the classes in - which any member templates used as template template - arguments are defined. [Note: non-type template arguments do - not contribute to the set of associated namespaces. ] */ - tree template = TREE_OPERAND (n, 0); - tree args = TREE_OPERAND (n, 1); - tree ctx; - tree arg; - - /* First, the template. There may actually be more than one if - this is an overloaded function template. But, in that case, - we only need the first; all the functions will be in the same - namespace. */ - template = OVL_CURRENT (template); - - ctx = CP_DECL_CONTEXT (template); - - if (TREE_CODE (ctx) == NAMESPACE_DECL) - { - if (arg_assoc_namespace (k, ctx) == 1) - return 1; - } - /* It must be a member template. */ - else if (arg_assoc_class (k, ctx) == 1) - return 1; - - /* Now the arguments. */ - for (arg = args; arg != NULL_TREE; arg = TREE_CHAIN (arg)) - { - tree t = TREE_VALUE (arg); - - if (TREE_CODE (t) == TEMPLATE_DECL) - { - ctx = CP_DECL_CONTEXT (t); - if (TREE_CODE (ctx) == NAMESPACE_DECL) - { - if (arg_assoc_namespace (k, ctx) == 1) - return 1; - } - else if (arg_assoc_class (k, ctx) == 1) - return 1; - } - else if (TREE_CODE_CLASS (TREE_CODE (t)) == 't' - && arg_assoc_type (k, t) == 1) - return 1; - } - } - else - { - my_friendly_assert (TREE_CODE (n) == OVERLOAD, 980715); - - for (; n; n = OVL_CHAIN (n)) - if (arg_assoc_type (k, TREE_TYPE (OVL_FUNCTION (n)))) - return 1; - } - - return 0; -} - -/* Performs Koenig lookup depending on arguments, where fns - are the functions found in normal lookup. */ - -tree -lookup_arg_dependent (name, fns, args) - tree name; - tree fns; - tree args; -{ - struct arg_lookup k; - k.name = name; - k.functions = fns; - k.namespaces = NULL_TREE; - k.classes = NULL_TREE; - - push_scratch_obstack (); - arg_assoc_args (&k, args); - pop_obstacks (); - return k.functions; -} - -/* Process a namespace-alias declaration. */ - -void -do_namespace_alias (alias, namespace) - tree alias, namespace; -{ - if (TREE_CODE (namespace) != NAMESPACE_DECL) - { - /* The parser did not find it, so it's not there. */ - cp_error ("unknown namespace `%D'", namespace); - return; - } - - namespace = ORIGINAL_NAMESPACE (namespace); - - /* Build the alias. */ - alias = build_lang_decl (NAMESPACE_DECL, alias, void_type_node); - DECL_NAMESPACE_ALIAS (alias) = namespace; - pushdecl (alias); -} - -/* Check a non-member using-declaration. Return the name and scope - being used, and the USING_DECL, or NULL_TREE on failure. */ - -static tree -validate_nonmember_using_decl (decl, scope, name) - tree decl; - tree *scope; - tree *name; -{ - if (TREE_CODE (decl) == SCOPE_REF - && TREE_OPERAND (decl, 0) == std_node) - { - if (namespace_bindings_p () - && current_namespace == global_namespace) - /* There's no need for a using declaration at all, here, - since `std' is the same as `::'. We can't just pass this - on because we'll complain later about declaring something - in the same scope as a using declaration with the same - name. We return NULL_TREE which indicates to the caller - that there's no need to do any further processing. */ - return NULL_TREE; - - *scope = global_namespace; - *name = TREE_OPERAND (decl, 1); - } - else if (TREE_CODE (decl) == SCOPE_REF) - { - *scope = TREE_OPERAND (decl, 0); - *name = TREE_OPERAND (decl, 1); - - /* [namespace.udecl] - - A using-declaration for a class member shall be a - member-declaration. */ - if (TREE_CODE (*scope) != NAMESPACE_DECL) - { - cp_error ("`%D' is not a namespace", *scope); - return NULL_TREE; - } - } - else if (TREE_CODE (decl) == IDENTIFIER_NODE - || TREE_CODE (decl) == TYPE_DECL - || TREE_CODE (decl) == TEMPLATE_DECL) - { - *scope = global_namespace; - *name = decl; - } - else - my_friendly_abort (382); - if (TREE_CODE_CLASS (TREE_CODE (*name)) == 'd') - *name = DECL_NAME (*name); - /* Make a USING_DECL. */ - return push_using_decl (*scope, *name); -} - -/* Process local and global using-declarations. */ - -static void -do_nonmember_using_decl (scope, name, oldval, oldtype, newval, newtype) - tree scope, name; - tree oldval, oldtype; - tree *newval, *newtype; -{ - tree decls; - struct tree_binding _decls; - - *newval = *newtype = NULL_TREE; - decls = binding_init (&_decls); - if (!qualified_lookup_using_namespace (name, scope, decls, 0)) - /* Lookup error */ - return; - - if (!BINDING_VALUE (decls) && !BINDING_TYPE (decls)) - { - cp_error ("`%D' not declared", name); - return; - } - - /* Check for using functions. */ - if (BINDING_VALUE (decls) && is_overloaded_fn (BINDING_VALUE (decls))) - { - tree tmp, tmp1; - - if (oldval && !is_overloaded_fn (oldval)) - { - duplicate_decls (OVL_CURRENT (BINDING_VALUE (decls)), oldval); - oldval = NULL_TREE; - } - - *newval = oldval; - for (tmp = BINDING_VALUE (decls); tmp; tmp = OVL_NEXT (tmp)) - { - tree new_fn = OVL_CURRENT (tmp); - - /* [namespace.udecl] - - If a function declaration in namespace scope or block - scope has the same name and the same parameter types as a - function introduced by a using declaration the program is - ill-formed. */ - for (tmp1 = oldval; tmp1; tmp1 = OVL_NEXT (tmp1)) - { - tree old_fn = OVL_CURRENT (tmp1); - - if (!OVL_USED (tmp1) - && compparms (TYPE_ARG_TYPES (TREE_TYPE (new_fn)), - TYPE_ARG_TYPES (TREE_TYPE (old_fn)))) - { - /* There was already a non-using declaration in - this scope with the same parameter types. */ - cp_error ("`%D' is already declared in this scope", - name); - break; - } - else if (duplicate_decls (new_fn, old_fn)) - /* We're re-using something we already used - before. We don't need to add it again. */ - break; - } - - /* If we broke out of the loop, there's no reason to add - this function to the using declarations for this - scope. */ - if (tmp1) - continue; - - *newval = build_overload (OVL_CURRENT (tmp), *newval); - if (TREE_CODE (*newval) != OVERLOAD) - *newval = ovl_cons (*newval, NULL_TREE); - OVL_USED (*newval) = 1; - } - } - else - { - *newval = BINDING_VALUE (decls); - if (oldval) - duplicate_decls (*newval, oldval); - } - - *newtype = BINDING_TYPE (decls); - if (oldtype && *newtype && oldtype != *newtype) - { - cp_error ("using directive `%D' introduced ambiguous type `%T'", - name, oldtype); - return; - } -} - -/* Process a using-declaration not appearing in class or local scope. */ - -void -do_toplevel_using_decl (decl) - tree decl; -{ - tree scope, name, binding; - tree oldval, oldtype, newval, newtype; - - decl = validate_nonmember_using_decl (decl, &scope, &name); - if (decl == NULL_TREE) - return; - - binding = binding_for_name (name, current_namespace); - - oldval = BINDING_VALUE (binding); - oldtype = BINDING_TYPE (binding); - - do_nonmember_using_decl (scope, name, oldval, oldtype, &newval, &newtype); - - /* Copy declarations found. */ - if (newval) - BINDING_VALUE (binding) = newval; - if (newtype) - BINDING_TYPE (binding) = newtype; - return; -} - -/* Process a using-declaration at function scope. */ - -void -do_local_using_decl (decl) - tree decl; -{ - tree scope, name; - tree oldval, oldtype, newval, newtype; - - decl = validate_nonmember_using_decl (decl, &scope, &name); - if (decl == NULL_TREE) - return; - - oldval = lookup_name_current_level (name); - oldtype = lookup_type_current_level (name); - - do_nonmember_using_decl (scope, name, oldval, oldtype, &newval, &newtype); - - if (newval) - { - if (is_overloaded_fn (newval)) - { - tree fn; - - /* We only need to push declarations for those functions - that were not already bound in the current level. */ - for (fn = newval; fn != oldval; fn = OVL_NEXT (fn)) - push_overloaded_decl (OVL_CURRENT (fn), - PUSH_LOCAL | PUSH_USING); - } - else - push_local_binding (name, newval, PUSH_USING); - } - if (newtype) - set_identifier_type_value (name, newtype); -} - -tree -do_class_using_decl (decl) - tree decl; -{ - tree name, value; - - if (TREE_CODE (decl) != SCOPE_REF - || TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (decl, 0))) != 't') - { - cp_error ("using-declaration for non-member at class scope"); - return NULL_TREE; - } - name = TREE_OPERAND (decl, 1); - if (TREE_CODE (name) == BIT_NOT_EXPR) - { - cp_error ("using-declaration for destructor"); - return NULL_TREE; - } - if (TREE_CODE (name) == TYPE_DECL) - name = DECL_NAME (name); - - my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 980716); - - value = build_lang_field_decl (USING_DECL, name, void_type_node); - DECL_INITIAL (value) = TREE_OPERAND (decl, 0); - return value; -} - -/* Process a using-directive. */ - -void -do_using_directive (namespace) - tree namespace; -{ - if (namespace == std_node) - return; - /* using namespace A::B::C; */ - if (TREE_CODE (namespace) == SCOPE_REF) - namespace = TREE_OPERAND (namespace, 1); - if (TREE_CODE (namespace) == IDENTIFIER_NODE) - { - /* Lookup in lexer did not find a namespace. */ - cp_error ("namespace `%T' undeclared", namespace); - return; - } - if (TREE_CODE (namespace) != NAMESPACE_DECL) - { - cp_error ("`%T' is not a namespace", namespace); - return; - } - namespace = ORIGINAL_NAMESPACE (namespace); - if (!toplevel_bindings_p ()) - push_using_directive (namespace); - else - /* direct usage */ - add_using_namespace (current_namespace, namespace, 0); -} - -void -check_default_args (x) - tree x; -{ - tree arg = TYPE_ARG_TYPES (TREE_TYPE (x)); - int saw_def = 0, i = 0 - (TREE_CODE (TREE_TYPE (x)) == METHOD_TYPE); - for (; arg && arg != void_list_node; arg = TREE_CHAIN (arg), ++i) - { - if (TREE_PURPOSE (arg)) - saw_def = 1; - else if (saw_def) - { - cp_error_at ("default argument missing for parameter %P of `%+#D'", - i, x); - break; - } - } -} - -void -mark_used (decl) - tree decl; -{ - TREE_USED (decl) = 1; - if (processing_template_decl) - return; - assemble_external (decl); - - /* Is it a synthesized method that needs to be synthesized? */ - if (TREE_CODE (decl) == FUNCTION_DECL && DECL_CLASS_CONTEXT (decl) - && DECL_ARTIFICIAL (decl) && ! DECL_INITIAL (decl) - /* Kludge: don't synthesize for default args. */ - && current_function_decl) - synthesize_method (decl); - - /* If this is a function or variable that is an instance of some - template, we now know that we will need to actually do the - instantiation. A TEMPLATE_DECL may also have DECL_TEMPLATE_INFO, - if it's a partial instantiation, but there's no need to - instantiate such a thing. We check that DECL is not an explicit - instantiation because that is not checked in instantiate_decl. */ - if (TREE_CODE (decl) != TEMPLATE_DECL - && DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl) - && !DECL_EXPLICIT_INSTANTIATION (decl)) - instantiate_decl (decl); -} - -/* Helper function for named_class_head_sans_basetype nonterminal. */ - -tree -handle_class_head (aggr, scope, id) - tree aggr, scope, id; -{ - if (TREE_CODE (id) == TYPE_DECL) - return id; - if (DECL_CLASS_TEMPLATE_P (id)) - return DECL_TEMPLATE_RESULT (id); - - if (scope) - cp_error ("`%T' does not have a nested type named `%D'", scope, id); - else - cp_error ("no file-scope type named `%D'", id); - - id = xref_tag - (aggr, make_anon_name (), 1); - return TYPE_MAIN_DECL (id); -} diff --git a/gcc/cp/errfn.c b/gcc/cp/errfn.c deleted file mode 100755 index fd8a6d4..0000000 --- a/gcc/cp/errfn.c +++ /dev/null @@ -1,343 +0,0 @@ -/* Provide a call-back mechanism for handling error output. - Copyright (C) 1993, 94-98, 1999 Free Software Foundation, Inc. - Contributed by Jason Merrill (jason@cygnus.com) - - 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 -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "config.h" -#include "system.h" -#include "tree.h" -#include "toplev.h" - -/* cp_printer is the type of a function which converts an argument into - a string for digestion by printf. The cp_printer function should deal - with all memory management; the functions in this file will not free - the char*s returned. See error.c for an example use of this code. */ - -typedef char* cp_printer PROTO((tree, int)); -extern cp_printer * cp_printers[256]; - -/* Whether or not we should try to be quiet for errors and warnings; this is - used to avoid being too talkative about problems with tentative choices - when we're computing the conversion costs for a method call. */ -int cp_silent = 0; - -typedef void errorfn (); /* deliberately vague */ - -extern char* cp_file_of PROTO((tree)); -extern int cp_line_of PROTO((tree)); - -#define STRDUP(f) (ap = (char *) alloca (strlen (f) +1), strcpy (ap, (f)), ap) - -/* This function supports only `%s', `%d', `%%', and the C++ print - codes. */ - -static void -cp_thing (errfn, atarg1, format, ap) - errorfn *errfn; - int atarg1; - const char *format; - va_list ap; -{ - static char *buf; - static long buflen; - int nargs = 0; - long len; - long offset; - const char *f; - tree atarg = 0; - - len = strlen (format) + 1; - if (len > buflen) - { - buflen = len; - buf = xrealloc (buf, buflen); - } - offset = 0; - - for (f = format; *f; ++f) - { - cp_printer * function; - int alternate; - int maybe_here; - - /* ignore text */ - if (*f != '%') - { - buf[offset++] = *f; - continue; - } - - ++f; - - alternate = 0; - maybe_here = 0; - - /* Check for '+' and '#' (in that order). */ - if (*f == '+') - { - maybe_here = 1; - ++f; - } - if (*f == '#') - { - alternate = 1; - ++f; - } - - /* no field width or precision */ - - function = cp_printers[(int)*f]; - - if (function || *f == 's') - { - char *p; - int plen; - - if (*f == 's') - { - p = va_arg (ap, char *); - nargs++; - } - else - { - tree t = va_arg (ap, tree); - nargs++; - - /* This indicates that ATARG comes from a different - location than normal. */ - if (maybe_here && atarg1) - atarg = t; - - /* If atarg1 is set and this is the first argument, then - set ATARG appropriately. */ - if (atarg1 && nargs == 1) - atarg = t; - - p = (*function) (t, alternate); - } - - plen = strlen (p); - len += plen; - if (len > buflen) - { - buflen = len; - buf = xrealloc (buf, len); - } - strcpy (buf + offset, p); - offset += plen; - } - else if (*f == '%') - { - /* A `%%' has occurred in the input string. Replace it with - a `%' in the formatted message buf. */ - - if (++len > buflen) - { - buflen = len; - buf = xrealloc (buf, len); - } - buf[offset++] = '%'; - } - else - { - if (*f != 'd') - abort (); - len += HOST_BITS_PER_INT / 2; - if (len > buflen) - { - buflen = len; - buf = xrealloc (buf, len); - } - sprintf (buf + offset, "%d", va_arg (ap, int)); - nargs++; - offset += strlen (buf + offset); - /* With an ANSI C library one could write - out += sprintf (...); */ - } - } - buf[offset] = '\0'; - - /* If ATARG1 is set, but we haven't extracted any arguments, then - extract one tree argument for ATARG. */ - if (nargs == 0 && atarg1) - atarg = va_arg (ap, tree); - - if (atarg) - { - char *file = cp_file_of (atarg); - int line = cp_line_of (atarg); - (*errfn) (file, line, "%s", buf); - } - else - (*errfn) ("%s", buf); - -} - -void -cp_error VPROTO((const char *format, ...)) -{ -#ifndef ANSI_PROTOTYPES - char *format; -#endif - va_list ap; - - VA_START (ap, format); - -#ifndef ANSI_PROTOTYPES - format = va_arg (ap, char *); -#endif - - if (! cp_silent) - cp_thing ((errorfn *) error, 0, format, ap); - va_end (ap); -} - -void -cp_warning VPROTO((const char *format, ...)) -{ -#ifndef ANSI_PROTOTYPES - char *format; -#endif - va_list ap; - - VA_START (ap, format); - -#ifndef ANSI_PROTOTYPES - format = va_arg (ap, char *); -#endif - - if (! cp_silent) - cp_thing ((errorfn *) warning, 0, format, ap); - va_end (ap); -} - -void -cp_pedwarn VPROTO((const char *format, ...)) -{ -#ifndef ANSI_PROTOTYPES - char *format; -#endif - va_list ap; - - VA_START (ap, format); - -#ifndef ANSI_PROTOTYPES - format = va_arg (ap, char *); -#endif - - if (! cp_silent) - cp_thing ((errorfn *) pedwarn, 0, format, ap); - va_end (ap); -} - -extern errorfn compiler_error; - -void -cp_compiler_error VPROTO((const char *format, ...)) -{ -#ifndef ANSI_PROTOTYPES - char *format; -#endif - va_list ap; - - VA_START (ap, format); - -#ifndef ANSI_PROTOTYPES - format = va_arg (ap, char *); -#endif - - if (! cp_silent) - cp_thing (compiler_error, 0, format, ap); - va_end (ap); -} - -void -cp_sprintf VPROTO((const char *format, ...)) -{ -#ifndef ANSI_PROTOTYPES - char *format; -#endif - va_list ap; - - VA_START (ap, format); - -#ifndef ANSI_PROTOTYPES - format = va_arg (ap, char *); -#endif - - cp_thing ((errorfn *) sprintf, 0, format, ap); - va_end (ap); -} - -void -cp_error_at VPROTO((const char *format, ...)) -{ -#ifndef ANSI_PROTOTYPES - char *format; -#endif - va_list ap; - - VA_START (ap, format); - -#ifndef ANSI_PROTOTYPES - format = va_arg (ap, char *); -#endif - - if (! cp_silent) - cp_thing ((errorfn *) error_with_file_and_line, 1, format, ap); - va_end (ap); -} - -void -cp_warning_at VPROTO((const char *format, ...)) -{ -#ifndef ANSI_PROTOTYPES - char *format; -#endif - va_list ap; - - VA_START (ap, format); - -#ifndef ANSI_PROTOTYPES - format = va_arg (ap, char *); -#endif - - if (! cp_silent) - cp_thing ((errorfn *) warning_with_file_and_line, 1, format, ap); - va_end (ap); -} - -void -cp_pedwarn_at VPROTO((const char *format, ...)) -{ -#ifndef ANSI_PROTOTYPES - char *format; -#endif - va_list ap; - - VA_START (ap, format); - -#ifndef ANSI_PROTOTYPES - format = va_arg (ap, char *); -#endif - - if (! cp_silent) - cp_thing ((errorfn *) pedwarn_with_file_and_line, 1, format, ap); - va_end (ap); -} diff --git a/gcc/cp/error.c b/gcc/cp/error.c deleted file mode 100755 index ec3bf71..0000000 --- a/gcc/cp/error.c +++ /dev/null @@ -1,2007 +0,0 @@ -/* Call-backs for C++ error reporting. - This code is non-reentrant. - Copyright (C) 1993, 94-97, 1998 Free Software Foundation, Inc. - - 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 -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "config.h" -#include "system.h" -#include "tree.h" -#include "cp-tree.h" -#include "obstack.h" -#include "toplev.h" - -typedef char* cp_printer (); - -#define A args_as_string -#define C code_as_string -#define D decl_as_string -#define E expr_as_string -#define L language_as_string -#define O op_as_string -#define P parm_as_string -#define Q assop_as_string -#define T type_as_string -#define V cv_as_string - -#define o (cp_printer *) 0 -cp_printer * cp_printers[256] = -{ -/*0 1 2 3 4 5 6 7 8 9 A B C D E F */ - o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, /* 0x00 */ - o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, /* 0x10 */ - o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, /* 0x20 */ - o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, /* 0x30 */ - o, A, o, C, D, E, o, o, o, o, o, o, L, o, o, O, /* 0x40 */ - P, Q, o, o, T, o, V, o, o, o, o, o, o, o, o, o, /* 0x50 */ - o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, /* 0x60 */ - o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, /* 0x70 */ -}; -#undef C -#undef D -#undef E -#undef L -#undef O -#undef P -#undef Q -#undef T -#undef V -#undef o - -#define obstack_chunk_alloc xmalloc -#define obstack_chunk_free free - -/* Obstack where we build text strings for overloading, etc. */ -static struct obstack scratch_obstack; -static char *scratch_firstobj; - -# define OB_INIT() (scratch_firstobj ? (obstack_free (&scratch_obstack, scratch_firstobj), 0) : 0) -# define OB_PUTC(C) (obstack_1grow (&scratch_obstack, (C))) -# define OB_PUTC2(C1,C2) \ - (obstack_1grow (&scratch_obstack, (C1)), obstack_1grow (&scratch_obstack, (C2))) -# define OB_PUTS(S) (obstack_grow (&scratch_obstack, (S), sizeof (S) - 1)) -# define OB_PUTID(ID) \ - (obstack_grow (&scratch_obstack, IDENTIFIER_POINTER (ID), \ - IDENTIFIER_LENGTH (ID))) -# define OB_PUTCP(S) (obstack_grow (&scratch_obstack, (S), strlen (S))) -# define OB_FINISH() (obstack_1grow (&scratch_obstack, '\0')) -# define OB_PUTI(CST) do { sprintf (digit_buffer, HOST_WIDE_INT_PRINT_DEC, (HOST_WIDE_INT)(CST)); \ - OB_PUTCP (digit_buffer); } while (0) -# define OB_UNPUT(N) obstack_blank (&scratch_obstack, - (N)); - -# define NEXT_CODE(t) (TREE_CODE (TREE_TYPE (t))) - -enum pad { none, before, after }; - -static void dump_type PROTO((tree, int)); -static void dump_type_real PROTO((tree, int, int)); -static void dump_simple_decl PROTO((tree, tree, int)); -static void dump_decl PROTO((tree, int)); -static void dump_function_decl PROTO((tree, int)); -static void dump_expr PROTO((tree, int)); -static void dump_unary_op PROTO((char *, tree, int)); -static void dump_binary_op PROTO((char *, tree)); -static void dump_aggr_type PROTO((tree, int, int)); -static void dump_type_prefix PROTO((tree, int, int)); -static void dump_type_suffix PROTO((tree, int, int)); -static void dump_function_name PROTO((tree)); -static void dump_expr_list PROTO((tree)); -static void dump_global_iord PROTO((tree)); -static void dump_qualifiers PROTO((tree, enum pad)); -static void dump_char PROTO((int)); -static char *aggr_variety PROTO((tree)); -static tree ident_fndecl PROTO((tree)); - -void -init_error () -{ - gcc_obstack_init (&scratch_obstack); - scratch_firstobj = (char *)obstack_alloc (&scratch_obstack, 0); -} - -/* Returns nonzero if SCOPE is something we want to print for random decls. */ - -static int -interesting_scope_p (scope) - tree scope; -{ - if (scope == NULL_TREE - || scope == global_namespace) - return 0; - - return (TREE_CODE (scope) == NAMESPACE_DECL - || AGGREGATE_TYPE_P (scope)); -} - -static void -dump_qualifiers (t, p) - tree t; - enum pad p; -{ - if (TYPE_QUALS (t)) - { - if (p == before) OB_PUTC (' '); - switch (TYPE_QUALS (t)) - { - case TYPE_QUAL_CONST: - OB_PUTS ("const"); - break; - - case TYPE_QUAL_VOLATILE: - OB_PUTS ("volatile"); - break; - - case TYPE_QUAL_RESTRICT: - OB_PUTS ("__restrict"); - break; - - case TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE: - OB_PUTS ("const volatile"); - break; - - case TYPE_QUAL_CONST | TYPE_QUAL_RESTRICT: - OB_PUTS ("const __restrict"); - break; - - case TYPE_QUAL_VOLATILE | TYPE_QUAL_RESTRICT: - OB_PUTS ("volatile __restrict"); - break; - - case TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE | TYPE_QUAL_RESTRICT: - OB_PUTS ("const volatile __restrict"); - break; - - default: - my_friendly_abort (0); - } - if (p == after) OB_PUTC (' '); - } -} - -/* This must be large enough to hold any printed integer or floating-point - value. */ -static char digit_buffer[128]; - -/* Dump into the obstack a human-readable equivalent of TYPE. */ - -static void -dump_type_real (t, v, canonical_name) - tree t; - int v; /* verbose? */ - int canonical_name; -{ - if (t == NULL_TREE) - return; - - if (TYPE_PTRMEMFUNC_P (t)) - goto offset_type; - - switch (TREE_CODE (t)) - { - case ERROR_MARK: - OB_PUTS ("{error}"); - break; - - case UNKNOWN_TYPE: - OB_PUTS ("{unknown type}"); - break; - - case TREE_LIST: - /* i.e. function taking no arguments */ - if (t != void_list_node) - { - dump_type_real (TREE_VALUE (t), v, canonical_name); - /* Can this happen other than for default arguments? */ - if (TREE_PURPOSE (t) && v) - { - OB_PUTS (" = "); - dump_expr (TREE_PURPOSE (t), 0); - } - if (TREE_CHAIN (t)) - { - if (TREE_CHAIN (t) != void_list_node) - { - OB_PUTC2 (',', ' '); - dump_type_real (TREE_CHAIN (t), v, canonical_name); - } - } - else OB_PUTS (" ..."); - } - break; - - case IDENTIFIER_NODE: - OB_PUTID (t); - break; - - case TREE_VEC: - dump_type_real (BINFO_TYPE (t), v, canonical_name); - break; - - case RECORD_TYPE: - case UNION_TYPE: - case ENUMERAL_TYPE: - if (TYPE_LANG_SPECIFIC (t) - && (IS_SIGNATURE_POINTER (t) || IS_SIGNATURE_REFERENCE (t))) - { - dump_qualifiers (t, after); - dump_type_real (SIGNATURE_TYPE (t), v, canonical_name); - if (IS_SIGNATURE_POINTER (t)) - OB_PUTC ('*'); - else - OB_PUTC ('&'); - } - else - dump_aggr_type (t, v, canonical_name); - break; - - case TYPE_DECL: - case TEMPLATE_DECL: - case NAMESPACE_DECL: - dump_decl (t, v); - break; - - case COMPLEX_TYPE: - OB_PUTS ("complex "); - dump_type_real (TREE_TYPE (t), v, canonical_name); - break; - - case INTEGER_TYPE: - if (!TREE_UNSIGNED (TYPE_MAIN_VARIANT (t)) && TREE_UNSIGNED (t)) - OB_PUTS ("unsigned "); - else if (TREE_UNSIGNED (TYPE_MAIN_VARIANT (t)) && !TREE_UNSIGNED (t)) - OB_PUTS ("signed "); - - /* fall through. */ - case REAL_TYPE: - case VOID_TYPE: - case BOOLEAN_TYPE: - { - tree type; - dump_qualifiers (t, after); - type = canonical_name ? TYPE_MAIN_VARIANT (t) : t; - if (TYPE_NAME (type) && TYPE_IDENTIFIER (type)) - OB_PUTID (TYPE_IDENTIFIER (type)); - else - /* Types like intQI_type_node and friends have no names. - These don't come up in user error messages, but it's nice - to be able to print them from the debugger. */ - OB_PUTS ("{anonymous}"); - } - break; - - case TEMPLATE_TEMPLATE_PARM: - if (!TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (t)) - { - /* For parameters inside template signature. */ - if (TYPE_IDENTIFIER (t)) - OB_PUTID (TYPE_IDENTIFIER (t)); - else - OB_PUTS ("{anonymous template template parm}"); - } - else - { - int i; - tree args = TYPE_TI_ARGS (t); - OB_PUTID (TYPE_IDENTIFIER (t)); - OB_PUTC ('<'); - for (i = 0; i < TREE_VEC_LENGTH (args); i++) - { - tree arg = TREE_VEC_ELT (args, i); - if (TREE_CODE_CLASS (TREE_CODE (arg)) == 't' - || TREE_CODE (arg) == TEMPLATE_DECL) - dump_type_real (arg, 0, canonical_name); - else - dump_expr (arg, 0); - if (i < TREE_VEC_LENGTH (args)-1) - OB_PUTC2 (',', ' '); - } - OB_PUTC ('>'); - } - break; - - case TEMPLATE_TYPE_PARM: - dump_qualifiers (t, after); - if (TYPE_IDENTIFIER (t)) - OB_PUTID (TYPE_IDENTIFIER (t)); - else - OB_PUTS ("{anonymous template type parm}"); - break; - - /* This is not always necessary for pointers and such, but doing this - reduces code size. */ - case ARRAY_TYPE: - case POINTER_TYPE: - case REFERENCE_TYPE: - case OFFSET_TYPE: - offset_type: - case FUNCTION_TYPE: - case METHOD_TYPE: - dump_type_prefix (t, v, canonical_name); - dump_type_suffix (t, v, canonical_name); - break; - - case TYPENAME_TYPE: - OB_PUTS ("typename "); - dump_type_real (TYPE_CONTEXT (t), 0, canonical_name); - OB_PUTS ("::"); - OB_PUTID (TYPE_IDENTIFIER (t)); - break; - - case TYPEOF_TYPE: - OB_PUTS ("__typeof ("); - dump_expr (TYPE_FIELDS (t), 1); - OB_PUTC (')'); - break; - - default: - sorry ("`%s' not supported by dump_type", - tree_code_name[(int) TREE_CODE (t)]); - } -} - -static char * -aggr_variety (t) - tree t; -{ - if (TREE_CODE (t) == ENUMERAL_TYPE) - return "enum"; - else if (TREE_CODE (t) == UNION_TYPE) - return "union"; - else if (TYPE_LANG_SPECIFIC (t) && CLASSTYPE_DECLARED_CLASS (t)) - return "class"; - else if (TYPE_LANG_SPECIFIC (t) && IS_SIGNATURE (t)) - return "signature"; - else - return "struct"; -} - -static void -dump_type (t, v) - tree t; - int v; /* verbose? */ -{ - dump_type_real (t, v, 0); -} - -/* Print out a class declaration, in the form `class foo'. */ - -static void -dump_aggr_type (t, v, canonical_name) - tree t; - int v; /* verbose? */ - int canonical_name; -{ - tree name; - char *variety = aggr_variety (t); - - dump_qualifiers (t, after); - - if (v > 0) - { - OB_PUTCP (variety); - OB_PUTC (' '); - } - - name = TYPE_NAME (canonical_name ? TYPE_MAIN_VARIANT (t) : t); - - if (name && CP_DECL_CONTEXT (name) != global_namespace) - { - /* FUNCTION_DECL or RECORD_TYPE */ - dump_decl (DECL_CONTEXT (name), 0); - OB_PUTC2 (':', ':'); - } - - /* kludge around weird behavior on g++.brendan/line1.C */ - if (name && TREE_CODE (name) != IDENTIFIER_NODE) - name = DECL_NAME (name); - - if (name == 0 || ANON_AGGRNAME_P (name)) - { - OB_PUTS ("{anonymous"); - if (!v) - { - OB_PUTC (' '); - OB_PUTCP (variety); - } - OB_PUTC ('}'); - } - else - OB_PUTID (name); -} - -/* Dump into the obstack the initial part of the output for a given type. - This is necessary when dealing with things like functions returning - functions. Examples: - - return type of `int (* fee ())()': pointer -> function -> int. Both - pointer (and reference and offset) and function (and member) types must - deal with prefix and suffix. - - Arrays must also do this for DECL nodes, like int a[], and for things like - int *[]&. */ - -static void -dump_type_prefix (t, v, canonical_name) - tree t; - int v; /* verbosity */ - int canonical_name; -{ - if (TYPE_PTRMEMFUNC_P (t)) - { - t = TYPE_PTRMEMFUNC_FN_TYPE (t); - goto offset_type; - } - - switch (TREE_CODE (t)) - { - case POINTER_TYPE: - case REFERENCE_TYPE: - { - tree sub = TREE_TYPE (t); - - dump_type_prefix (sub, v, canonical_name); - /* A tree for a member pointer looks like pointer to offset, - so let the OFFSET_TYPE case handle it. */ - if (!TYPE_PTRMEM_P (t)) - { - switch (TREE_CODE (sub)) - { - /* We don't want int ( *)() */ - case FUNCTION_TYPE: - case METHOD_TYPE: - break; - - case ARRAY_TYPE: - OB_PUTC2 (' ', '('); - break; - - case POINTER_TYPE: - /* We don't want "char * *" */ - if (TYPE_QUALS (sub) == TYPE_UNQUALIFIED) - break; - /* But we do want "char *const *" */ - - default: - OB_PUTC (' '); - } - if (TREE_CODE (t) == POINTER_TYPE) - OB_PUTC ('*'); - else - OB_PUTC ('&'); - dump_qualifiers (t, none); - } - } - break; - - case OFFSET_TYPE: - offset_type: - dump_type_prefix (TREE_TYPE (t), v, canonical_name); - if (TREE_CODE (t) == OFFSET_TYPE) /* pmfs deal with this in d_t_p */ - { - OB_PUTC (' '); - dump_type_real (TYPE_OFFSET_BASETYPE (t), 0, canonical_name); - OB_PUTC2 (':', ':'); - } - OB_PUTC ('*'); - dump_qualifiers (t, none); - break; - - /* Can only be reached through function pointer -- this would not be - correct if FUNCTION_DECLs used it. */ - case FUNCTION_TYPE: - dump_type_prefix (TREE_TYPE (t), v, canonical_name); - OB_PUTC2 (' ', '('); - break; - - case METHOD_TYPE: - dump_type_prefix (TREE_TYPE (t), v, canonical_name); - OB_PUTC2 (' ', '('); - dump_aggr_type (TYPE_METHOD_BASETYPE (t), 0, canonical_name); - OB_PUTC2 (':', ':'); - break; - - case ARRAY_TYPE: - dump_type_prefix (TREE_TYPE (t), v, canonical_name); - break; - - case ENUMERAL_TYPE: - case ERROR_MARK: - case IDENTIFIER_NODE: - case INTEGER_TYPE: - case BOOLEAN_TYPE: - case REAL_TYPE: - case RECORD_TYPE: - case TEMPLATE_TYPE_PARM: - case TEMPLATE_TEMPLATE_PARM: - case TREE_LIST: - case TYPE_DECL: - case TREE_VEC: - case UNION_TYPE: - case UNKNOWN_TYPE: - case VOID_TYPE: - case TYPENAME_TYPE: - case COMPLEX_TYPE: - dump_type_real (t, v, canonical_name); - break; - - default: - sorry ("`%s' not supported by dump_type_prefix", - tree_code_name[(int) TREE_CODE (t)]); - } -} - -static void -dump_type_suffix (t, v, canonical_name) - tree t; - int v; /* verbose? */ - int canonical_name; -{ - if (TYPE_PTRMEMFUNC_P (t)) - t = TYPE_PTRMEMFUNC_FN_TYPE (t); - - switch (TREE_CODE (t)) - { - case POINTER_TYPE: - case REFERENCE_TYPE: - case OFFSET_TYPE: - if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE) - OB_PUTC (')'); - dump_type_suffix (TREE_TYPE (t), v, canonical_name); - break; - - /* Can only be reached through function pointer */ - case FUNCTION_TYPE: - case METHOD_TYPE: - { - tree arg; - OB_PUTC2 (')', '('); - arg = TYPE_ARG_TYPES (t); - if (TREE_CODE (t) == METHOD_TYPE) - arg = TREE_CHAIN (arg); - - if (arg) - dump_type (arg, v); - else - OB_PUTS ("..."); - OB_PUTC (')'); - if (TREE_CODE (t) == METHOD_TYPE) - dump_qualifiers - (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))), before); - dump_type_suffix (TREE_TYPE (t), v, canonical_name); - break; - } - - case ARRAY_TYPE: - OB_PUTC ('['); - if (TYPE_DOMAIN (t)) - { - if (TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (t))) == INTEGER_CST) - OB_PUTI (TREE_INT_CST_LOW (TYPE_MAX_VALUE (TYPE_DOMAIN (t))) + 1); - else if (TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (t))) == MINUS_EXPR) - dump_expr (TREE_OPERAND (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0), 0); - else - dump_expr (fold (build_binary_op - (PLUS_EXPR, TYPE_MAX_VALUE (TYPE_DOMAIN (t)), - integer_one_node, 1)), 0); - } - OB_PUTC (']'); - dump_type_suffix (TREE_TYPE (t), v, canonical_name); - break; - - case ENUMERAL_TYPE: - case ERROR_MARK: - case IDENTIFIER_NODE: - case INTEGER_TYPE: - case BOOLEAN_TYPE: - case REAL_TYPE: - case RECORD_TYPE: - case TEMPLATE_TYPE_PARM: - case TEMPLATE_TEMPLATE_PARM: - case TREE_LIST: - case TYPE_DECL: - case TREE_VEC: - case UNION_TYPE: - case UNKNOWN_TYPE: - case VOID_TYPE: - case TYPENAME_TYPE: - case COMPLEX_TYPE: - break; - - default: - sorry ("`%s' not supported by dump_type_suffix", - tree_code_name[(int) TREE_CODE (t)]); - } -} - -/* Return a function declaration which corresponds to the IDENTIFIER_NODE - argument. */ - -static tree -ident_fndecl (t) - tree t; -{ - tree n = lookup_name (t, 0); - - if (n == NULL_TREE) - return NULL_TREE; - - if (TREE_CODE (n) == FUNCTION_DECL) - return n; - else if (TREE_CODE (n) == TREE_LIST - && TREE_CODE (TREE_VALUE (n)) == FUNCTION_DECL) - return TREE_VALUE (n); - - my_friendly_abort (66); - return NULL_TREE; -} - -#ifndef NO_DOLLAR_IN_LABEL -# define GLOBAL_THING "_GLOBAL_$" -#else -# ifndef NO_DOT_IN_LABEL -# define GLOBAL_THING "_GLOBAL_." -# else -# define GLOBAL_THING "_GLOBAL__" -# endif -#endif - -#define GLOBAL_IORD_P(NODE) \ - ! strncmp (IDENTIFIER_POINTER(NODE), GLOBAL_THING, sizeof (GLOBAL_THING) - 1) - -static void -dump_global_iord (t) - tree t; -{ - char *name = IDENTIFIER_POINTER (t); - - OB_PUTS ("(static "); - if (name [sizeof (GLOBAL_THING) - 1] == 'I') - OB_PUTS ("initializers"); - else if (name [sizeof (GLOBAL_THING) - 1] == 'D') - OB_PUTS ("destructors"); - else - my_friendly_abort (352); - - OB_PUTS (" for "); - OB_PUTCP (input_filename); - OB_PUTC (')'); -} - -static void -dump_simple_decl (t, type, v) - tree t; - tree type; - int v; -{ - if (v > 0) - { - dump_type_prefix (type, v, 0); - OB_PUTC (' '); - } - if (interesting_scope_p (DECL_CONTEXT (t))) - { - dump_decl (DECL_CONTEXT (t), 0); - OB_PUTC2 (':',':'); - } - if (DECL_NAME (t)) - dump_decl (DECL_NAME (t), v); - else - OB_PUTS ("{anon}"); - if (v > 0) - dump_type_suffix (type, v, 0); -} - -static void -dump_decl (t, v) - tree t; - int v; /* verbosity */ -{ - if (t == NULL_TREE) - return; - - switch (TREE_CODE (t)) - { - case ERROR_MARK: - OB_PUTS (" /* decl error */ "); - break; - - case TYPE_DECL: - { - /* Don't say 'typedef class A' */ - if (DECL_ARTIFICIAL (t)) - { - if (v > 0 && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM) - /* Say `class T' not just `T'. */ - OB_PUTS ("class "); - - dump_type (TREE_TYPE (t), v); - break; - } - } - if (v > 0) - OB_PUTS ("typedef "); - dump_simple_decl (t, DECL_ORIGINAL_TYPE (t) - ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), v); - break; - - case VAR_DECL: - if (DECL_NAME (t) && VTABLE_NAME_P (DECL_NAME (t))) - { - OB_PUTS ("vtable for "); - if (TYPE_P (DECL_CONTEXT (t))) - dump_type (DECL_CONTEXT (t), v); - else - /* This case can arise with -fno-vtable-thunks. See - expand_upcast_fixups. It's not clear what to print - here. */ - OB_PUTS ("{unknown type}"); - break; - } - /* else fall through */ - case FIELD_DECL: - case PARM_DECL: - dump_simple_decl (t, TREE_TYPE (t), v); - break; - - case NAMESPACE_DECL: - if (CP_DECL_CONTEXT (t) != global_namespace) - { - dump_decl (DECL_CONTEXT (t), v); - OB_PUTC2 (':',':'); - } - if (DECL_NAME (t) == anonymous_namespace_name) - OB_PUTS ("{anonymous}"); - else - OB_PUTID (DECL_NAME (t)); - break; - - case SCOPE_REF: - dump_decl (TREE_OPERAND (t, 0), 0); - OB_PUTS ("::"); - dump_decl (TREE_OPERAND (t, 1), 0); - break; - - case ARRAY_REF: - dump_decl (TREE_OPERAND (t, 0), v); - OB_PUTC ('['); - dump_decl (TREE_OPERAND (t, 1), v); - OB_PUTC (']'); - break; - - /* So that we can do dump_decl in dump_aggr_type and have it work for - both class and function scope. */ - case RECORD_TYPE: - case UNION_TYPE: - case ENUMERAL_TYPE: - dump_type (t, v); - break; - - case TYPE_EXPR: - my_friendly_abort (69); - break; - - /* These special cases are duplicated here so that other functions - can feed identifiers to cp_error and get them demangled properly. */ - case IDENTIFIER_NODE: - { tree f; - if (DESTRUCTOR_NAME_P (t) - && (f = ident_fndecl (t)) - && DECL_LANGUAGE (f) == lang_cplusplus) - { - OB_PUTC ('~'); - dump_decl (DECL_NAME (f), 0); - } - else if (IDENTIFIER_TYPENAME_P (t)) - { - OB_PUTS ("operator "); - /* Not exactly IDENTIFIER_TYPE_VALUE. */ - dump_type (TREE_TYPE (t), 0); - break; - } - else if (IDENTIFIER_OPNAME_P (t)) - { - char *name_string = operator_name_string (t); - OB_PUTS ("operator "); - OB_PUTCP (name_string); - } - else - OB_PUTID (t); - } - break; - - case FUNCTION_DECL: - if (GLOBAL_IORD_P (DECL_ASSEMBLER_NAME (t))) - dump_global_iord (DECL_ASSEMBLER_NAME (t)); - else if (! DECL_LANG_SPECIFIC (t)) - OB_PUTS ("{internal}"); - else - dump_function_decl (t, v); - break; - - case TEMPLATE_DECL: - { - tree orig_args = DECL_TEMPLATE_PARMS (t); - tree args; - int i; - for (args = orig_args = nreverse (orig_args); - args; - args = TREE_CHAIN (args)) - { - int len = TREE_VEC_LENGTH (TREE_VALUE (args)); - - OB_PUTS ("template <"); - for (i = 0; i < len; i++) - { - tree arg = TREE_VEC_ELT (TREE_VALUE (args), i); - tree defval = TREE_PURPOSE (arg); - arg = TREE_VALUE (arg); - if (TREE_CODE (arg) == TYPE_DECL) - { - if (DECL_NAME (arg)) - { - OB_PUTS ("class "); - OB_PUTID (DECL_NAME (arg)); - } - else - OB_PUTS ("class"); - } - else - dump_decl (arg, 1); - - if (defval) - { - OB_PUTS (" = "); - if (TREE_CODE (arg) == TYPE_DECL - || TREE_CODE (arg) == TEMPLATE_DECL) - dump_type (defval, 1); - else - dump_expr (defval, 1); - } - - OB_PUTC2 (',', ' '); - } - if (len != 0) - OB_UNPUT (2); - OB_PUTC2 ('>', ' '); - } - nreverse(orig_args); - - if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL) - dump_type (TREE_TYPE (t), v); - else if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == VAR_DECL) - dump_decl (DECL_TEMPLATE_RESULT (t), v); - else if (TREE_TYPE (t) == NULL_TREE) - my_friendly_abort (353); - else switch (NEXT_CODE (t)) - { - case METHOD_TYPE: - case FUNCTION_TYPE: - dump_function_decl (t, v); - break; - - default: - /* This case can occur with some illegal code. */ - dump_type (TREE_TYPE (t), v); - } - } - break; - - case TEMPLATE_ID_EXPR: - { - tree args; - tree name = TREE_OPERAND (t, 0); - if (is_overloaded_fn (name)) - name = DECL_NAME (get_first_fn (name)); - dump_decl (name, v); - OB_PUTC ('<'); - for (args = TREE_OPERAND (t, 1); args; args = TREE_CHAIN (args)) - { - if (TREE_CODE_CLASS (TREE_CODE (TREE_VALUE (args))) == 't' - || TREE_CODE (TREE_VALUE (args)) == TEMPLATE_DECL) - dump_type (TREE_VALUE (args), 0); - else - dump_expr (TREE_VALUE (args), 0); - if (TREE_CHAIN (args)) - OB_PUTC2 (',', ' '); - } - OB_PUTC ('>'); - } - break; - - case LOOKUP_EXPR: - dump_decl (TREE_OPERAND (t, 0), v); - break; - - case LABEL_DECL: - OB_PUTID (DECL_NAME (t)); - break; - - case CONST_DECL: - if ((TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == ENUMERAL_TYPE) - || (DECL_INITIAL (t) && - TREE_CODE (DECL_INITIAL (t)) == TEMPLATE_PARM_INDEX)) - dump_simple_decl (t, TREE_TYPE (t), v); - else if (DECL_NAME (t)) - dump_decl (DECL_NAME (t), v); - else if (DECL_INITIAL (t)) - dump_expr (DECL_INITIAL (t), 0); - else - OB_PUTS ("enumerator"); - break; - - case USING_DECL: - OB_PUTS ("using "); - dump_type (DECL_INITIAL (t), 0); - OB_PUTS ("::"); - OB_PUTID (DECL_NAME (t)); - break; - - default: - sorry ("`%s' not supported by dump_decl", - tree_code_name[(int) TREE_CODE (t)]); - } -} - -/* Pretty printing for announce_function. T is the declaration of the - function we are interested in seeing. If V is zero, we print the - argument types. If V is positive, we also print the return types. - If V is negative, we do not even print the argument types. */ - -static void -dump_function_decl (t, v) - tree t; - int v; -{ - tree name; - tree fntype; - tree parmtypes; - tree cname = NULL_TREE; - - if (TREE_CODE (t) == TEMPLATE_DECL) - t = DECL_TEMPLATE_RESULT (t); - - name = DECL_ASSEMBLER_NAME (t); - fntype = TREE_TYPE (t); - parmtypes = TYPE_ARG_TYPES (fntype); - - /* Friends have DECL_CLASS_CONTEXT set, but not DECL_CONTEXT. */ - if (DECL_CLASS_SCOPE_P (t)) - cname = DECL_CLASS_CONTEXT (t); - /* this is for partially instantiated template methods */ - else if (TREE_CODE (fntype) == METHOD_TYPE) - cname = TREE_TYPE (TREE_VALUE (parmtypes)); - - /* Print the return type. */ - if (v > 0) - { - if (DECL_STATIC_FUNCTION_P (t)) - OB_PUTS ("static "); - - if (! DECL_CONV_FN_P (t) - && ! DECL_CONSTRUCTOR_P (t) - && ! DECL_DESTRUCTOR_P (t)) - { - dump_type_prefix (TREE_TYPE (fntype), 1, 0); - OB_PUTC (' '); - } - } - - /* Print the function name. */ - if (cname) - { - dump_type (cname, 0); - OB_PUTC2 (':', ':'); - if (TREE_CODE (fntype) == METHOD_TYPE && parmtypes) - parmtypes = TREE_CHAIN (parmtypes); - if (DECL_CONSTRUCTOR_FOR_VBASE_P (t)) - /* Skip past "in_charge" identifier. */ - parmtypes = TREE_CHAIN (parmtypes); - } - else if (CP_DECL_CONTEXT (t) != global_namespace) - { - dump_decl (DECL_CONTEXT (t), 0); - OB_PUTC2 (':',':'); - } - - if (DESTRUCTOR_NAME_P (name) && DECL_LANGUAGE (t) == lang_cplusplus) - parmtypes = TREE_CHAIN (parmtypes); - - dump_function_name (t); - - /* If V is negative, we don't print the argument types. */ - if (v < 0) - return; - - OB_PUTC ('('); - - if (parmtypes) - dump_type (parmtypes, v); - else - OB_PUTS ("..."); - - OB_PUTC (')'); - - if (v && ! DECL_CONV_FN_P (t)) - dump_type_suffix (TREE_TYPE (fntype), 1, 0); - - if (TREE_CODE (fntype) == METHOD_TYPE) - { - if (IS_SIGNATURE (cname)) - /* We look at the type pointed to by the `optr' field of `this.' */ - dump_qualifiers - (TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_VALUE (TYPE_ARG_TYPES (fntype))))), before); - else - dump_qualifiers - (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))), before); - } -} - -/* Handle the function name for a FUNCTION_DECL node, grokking operators - and destructors properly. */ - -static void -dump_function_name (t) - tree t; -{ - tree name = DECL_NAME (t); - - if (DECL_DESTRUCTOR_P (t)) - { - OB_PUTC ('~'); - dump_decl (name, 0); - } - else if (DECL_CONV_FN_P (t)) - { - /* This cannot use the hack that the operator's return - type is stashed off of its name because it may be - used for error reporting. In the case of conflicting - declarations, both will have the same name, yet - the types will be different, hence the TREE_TYPE field - of the first name will be clobbered by the second. */ - OB_PUTS ("operator "); - dump_type (TREE_TYPE (TREE_TYPE (t)), 0); - } - else if (IDENTIFIER_OPNAME_P (name)) - { - char *name_string = operator_name_string (name); - OB_PUTS ("operator "); - OB_PUTCP (name_string); - } - else - dump_decl (name, 0); - - if (DECL_LANG_SPECIFIC (t) && DECL_USE_TEMPLATE (t) - && DECL_TEMPLATE_INFO (t) - && (DECL_TEMPLATE_SPECIALIZATION (t) - || TREE_CODE (DECL_TI_TEMPLATE (t)) != TEMPLATE_DECL - || DECL_TEMPLATE_SPECIALIZATION (DECL_TI_TEMPLATE (t)) - || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t)))) - { - tree args = DECL_TEMPLATE_INFO (t) ? DECL_TI_ARGS (t) : NULL_TREE; - OB_PUTC ('<'); - - /* Be careful only to print things when we have them, so as not - to crash producing error messages. */ - if (args) - { - if (TREE_CODE (args) == TREE_LIST) - { - tree arg; - int need_comma = 0; - - for (arg = args; arg; arg = TREE_CHAIN (arg)) - { - tree a = TREE_VALUE (arg); - - if (need_comma) - OB_PUTS (", "); - - if (a) - { - if (TREE_CODE_CLASS (TREE_CODE (a)) == 't' - || TREE_CODE (a) == TEMPLATE_DECL) - dump_type (a, 0); - else - dump_expr (a, 0); - } - - need_comma = 1; - } - } - else if (TREE_CODE (args) == TREE_VEC) - { - int i; - int need_comma = 0; - - if (TREE_VEC_LENGTH (args) > 0 - && TREE_CODE (TREE_VEC_ELT (args, 0)) == TREE_VEC) - args = TREE_VEC_ELT (args, - TREE_VEC_LENGTH (args) - 1); - - for (i = 0; i < TREE_VEC_LENGTH (args); i++) - { - tree a = TREE_VEC_ELT (args, i); - - if (need_comma) - OB_PUTS (", "); - - if (a) - { - if (TREE_CODE_CLASS (TREE_CODE (a)) == 't' - || TREE_CODE (a) == TEMPLATE_DECL) - dump_type (a, 0); - else - dump_expr (a, 0); - } - - need_comma = 1; - } - } - } - OB_PUTC ('>'); - } -} - -static void -dump_char (c) - int c; -{ - switch (c) - { - case TARGET_NEWLINE: - OB_PUTS ("\\n"); - break; - case TARGET_TAB: - OB_PUTS ("\\t"); - break; - case TARGET_VT: - OB_PUTS ("\\v"); - break; - case TARGET_BS: - OB_PUTS ("\\b"); - break; - case TARGET_CR: - OB_PUTS ("\\r"); - break; - case TARGET_FF: - OB_PUTS ("\\f"); - break; - case TARGET_BELL: - OB_PUTS ("\\a"); - break; - case '\\': - OB_PUTS ("\\\\"); - break; - case '\'': - OB_PUTS ("\\'"); - break; - case '\"': - OB_PUTS ("\\\""); - break; - default: - if (ISPRINT (c)) - OB_PUTC (c); - else - { - sprintf (digit_buffer, "\\%03o", (int) c); - OB_PUTCP (digit_buffer); - } - } -} - -/* Print out a list of initializers (subr of dump_expr) */ - -static void -dump_expr_list (l) - tree l; -{ - while (l) - { - dump_expr (TREE_VALUE (l), 0); - if (TREE_CHAIN (l)) - OB_PUTC2 (',', ' '); - l = TREE_CHAIN (l); - } -} - -/* Print out an expression */ - -static void -dump_expr (t, nop) - tree t; - int nop; /* suppress parens */ -{ - switch (TREE_CODE (t)) - { - case VAR_DECL: - case PARM_DECL: - case FIELD_DECL: - case CONST_DECL: - case FUNCTION_DECL: - case TEMPLATE_DECL: - case NAMESPACE_DECL: - dump_decl (t, -1); - break; - - case INTEGER_CST: - { - tree type = TREE_TYPE (t); - my_friendly_assert (type != 0, 81); - - /* If it's an enum, output its tag, rather than its value. */ - if (TREE_CODE (type) == ENUMERAL_TYPE) - { - char *p = enum_name_string (t, type); - OB_PUTCP (p); - } - else if (type == boolean_type_node) - { - if (t == boolean_false_node - || (TREE_INT_CST_LOW (t) == 0 - && TREE_INT_CST_HIGH (t) == 0)) - OB_PUTS ("false"); - else if (t == boolean_true_node) - OB_PUTS ("true"); - } - else if (type == char_type_node) - { - OB_PUTC ('\''); - dump_char (TREE_INT_CST_LOW (t)); - OB_PUTC ('\''); - } - else if (TREE_INT_CST_HIGH (t) - != (TREE_INT_CST_LOW (t) >> (HOST_BITS_PER_WIDE_INT - 1))) - { - tree val = t; - if (TREE_INT_CST_HIGH (val) < 0) - { - OB_PUTC ('-'); - val = build_int_2 (~TREE_INT_CST_LOW (val), - -TREE_INT_CST_HIGH (val)); - } - /* Would "%x%0*x" or "%x%*0x" get zero-padding on all - systems? */ - { - static char format[10]; /* "%x%09999x\0" */ - if (!format[0]) - sprintf (format, "%%x%%0%dx", HOST_BITS_PER_INT / 4); - sprintf (digit_buffer, format, TREE_INT_CST_HIGH (val), - TREE_INT_CST_LOW (val)); - OB_PUTCP (digit_buffer); - } - } - else - OB_PUTI (TREE_INT_CST_LOW (t)); - } - break; - - case REAL_CST: -#ifndef REAL_IS_NOT_DOUBLE - sprintf (digit_buffer, "%g", TREE_REAL_CST (t)); -#else - { - unsigned char *p = (unsigned char *) &TREE_REAL_CST (t); - size_t i; - strcpy (digit_buffer, "0x"); - for (i = 0; i < sizeof TREE_REAL_CST (t); i++) - sprintf (digit_buffer + 2 + 2*i, "%02x", *p++); - } -#endif - OB_PUTCP (digit_buffer); - break; - - case PTRMEM_CST: - OB_PUTC ('&'); - dump_type (PTRMEM_CST_CLASS (t), 0); - OB_PUTS ("::"); - OB_PUTID (DECL_NAME (PTRMEM_CST_MEMBER (t))); - break; - - case STRING_CST: - { - char *p = TREE_STRING_POINTER (t); - int len = TREE_STRING_LENGTH (t) - 1; - int i; - - OB_PUTC ('\"'); - for (i = 0; i < len; i++) - dump_char (p[i]); - OB_PUTC ('\"'); - } - break; - - case COMPOUND_EXPR: - dump_binary_op (",", t); - break; - - case COND_EXPR: - OB_PUTC ('('); - dump_expr (TREE_OPERAND (t, 0), 0); - OB_PUTS (" ? "); - dump_expr (TREE_OPERAND (t, 1), 0); - OB_PUTS (" : "); - dump_expr (TREE_OPERAND (t, 2), 0); - OB_PUTC (')'); - break; - - case SAVE_EXPR: - if (TREE_HAS_CONSTRUCTOR (t)) - { - OB_PUTS ("new "); - dump_type (TREE_TYPE (TREE_TYPE (t)), 0); - } - else - { - dump_expr (TREE_OPERAND (t, 0), 0); - } - break; - - case AGGR_INIT_EXPR: - OB_PUTID (TYPE_IDENTIFIER (TREE_TYPE (t))); - OB_PUTC ('('); - if (TREE_OPERAND (t, 1)) - dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1))); - OB_PUTC (')'); - break; - - case CALL_EXPR: - { - tree fn = TREE_OPERAND (t, 0); - tree args = TREE_OPERAND (t, 1); - - if (TREE_CODE (fn) == ADDR_EXPR) - fn = TREE_OPERAND (fn, 0); - - if (TREE_TYPE (fn) != NULL_TREE && NEXT_CODE (fn) == METHOD_TYPE) - { - tree ob = TREE_VALUE (args); - if (TREE_CODE (ob) == ADDR_EXPR) - { - dump_expr (TREE_OPERAND (ob, 0), 0); - OB_PUTC ('.'); - } - else if (TREE_CODE (ob) != PARM_DECL - || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this")) - { - dump_expr (ob, 0); - OB_PUTC2 ('-', '>'); - } - args = TREE_CHAIN (args); - } - dump_expr (fn, 0); - OB_PUTC ('('); - dump_expr_list (args); - OB_PUTC (')'); - } - break; - - case NEW_EXPR: - { - tree type = TREE_OPERAND (t, 1); - if (NEW_EXPR_USE_GLOBAL (t)) - OB_PUTS ("::"); - OB_PUTS ("new "); - if (TREE_OPERAND (t, 0)) - { - OB_PUTC ('('); - dump_expr_list (TREE_OPERAND (t, 0)); - OB_PUTS (") "); - } - if (TREE_CODE (type) == ARRAY_REF) - type = build_cplus_array_type - (TREE_OPERAND (type, 0), - build_index_type (size_binop (MINUS_EXPR, TREE_OPERAND (type, 1), - integer_one_node))); - dump_type (type, 0); - if (TREE_OPERAND (t, 2)) - { - OB_PUTC ('('); - dump_expr_list (TREE_OPERAND (t, 2)); - OB_PUTC (')'); - } - } - break; - - case TARGET_EXPR: - /* Note that this only works for G++ target exprs. If somebody - builds a general TARGET_EXPR, there's no way to represent that - it initializes anything other that the parameter slot for the - default argument. Note we may have cleared out the first - operand in expand_expr, so don't go killing ourselves. */ - if (TREE_OPERAND (t, 1)) - dump_expr (TREE_OPERAND (t, 1), 0); - break; - - case MODIFY_EXPR: - case PLUS_EXPR: - case MINUS_EXPR: - case MULT_EXPR: - case TRUNC_DIV_EXPR: - case TRUNC_MOD_EXPR: - case MIN_EXPR: - case MAX_EXPR: - case LSHIFT_EXPR: - case RSHIFT_EXPR: - case BIT_IOR_EXPR: - case BIT_XOR_EXPR: - case BIT_AND_EXPR: - case BIT_ANDTC_EXPR: - case TRUTH_ANDIF_EXPR: - case TRUTH_ORIF_EXPR: - case LT_EXPR: - case LE_EXPR: - case GT_EXPR: - case GE_EXPR: - case EQ_EXPR: - case NE_EXPR: - dump_binary_op (opname_tab[(int) TREE_CODE (t)], t); - break; - - case CEIL_DIV_EXPR: - case FLOOR_DIV_EXPR: - case ROUND_DIV_EXPR: - dump_binary_op ("/", t); - break; - - case CEIL_MOD_EXPR: - case FLOOR_MOD_EXPR: - case ROUND_MOD_EXPR: - dump_binary_op ("%", t); - break; - - case COMPONENT_REF: - { - tree ob = TREE_OPERAND (t, 0); - if (TREE_CODE (ob) == INDIRECT_REF) - { - ob = TREE_OPERAND (ob, 0); - if (TREE_CODE (ob) != PARM_DECL - || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this")) - { - dump_expr (ob, 0); - OB_PUTC2 ('-', '>'); - } - } - else - { - dump_expr (ob, 0); - OB_PUTC ('.'); - } - dump_expr (TREE_OPERAND (t, 1), 1); - } - break; - - case ARRAY_REF: - dump_expr (TREE_OPERAND (t, 0), 0); - OB_PUTC ('['); - dump_expr (TREE_OPERAND (t, 1), 0); - OB_PUTC (']'); - break; - - case CONVERT_EXPR: - dump_unary_op ("+", t, nop); - break; - - case ADDR_EXPR: - if (TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL - || TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST) - dump_expr (TREE_OPERAND (t, 0), 0); - else - dump_unary_op ("&", t, nop); - break; - - case INDIRECT_REF: - if (TREE_HAS_CONSTRUCTOR (t)) - { - t = TREE_OPERAND (t, 0); - my_friendly_assert (TREE_CODE (t) == CALL_EXPR, 237); - dump_expr (TREE_OPERAND (t, 0), 0); - OB_PUTC ('('); - dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1))); - OB_PUTC (')'); - } - else - { - if (TREE_OPERAND (t,0) != NULL_TREE - && NEXT_CODE (TREE_OPERAND (t, 0)) == REFERENCE_TYPE) - dump_expr (TREE_OPERAND (t, 0), nop); - else - dump_unary_op ("*", t, nop); - } - break; - - case NEGATE_EXPR: - case BIT_NOT_EXPR: - case TRUTH_NOT_EXPR: - case PREDECREMENT_EXPR: - case PREINCREMENT_EXPR: - dump_unary_op (opname_tab [(int)TREE_CODE (t)], t, nop); - break; - - case POSTDECREMENT_EXPR: - case POSTINCREMENT_EXPR: - OB_PUTC ('('); - dump_expr (TREE_OPERAND (t, 0), 0); - OB_PUTCP (opname_tab[(int)TREE_CODE (t)]); - OB_PUTC (')'); - break; - - case NON_LVALUE_EXPR: - /* FIXME: This is a KLUDGE workaround for a parsing problem. There - should be another level of INDIRECT_REF so that I don't have to do - this. */ - if (TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == POINTER_TYPE) - { - tree next = TREE_TYPE (TREE_TYPE (t)); - - while (TREE_CODE (next) == POINTER_TYPE) - next = TREE_TYPE (next); - - if (TREE_CODE (next) == FUNCTION_TYPE) - { - if (!nop) OB_PUTC ('('); - OB_PUTC ('*'); - dump_expr (TREE_OPERAND (t, 0), 1); - if (!nop) OB_PUTC (')'); - break; - } - /* else FALLTHRU */ - } - dump_expr (TREE_OPERAND (t, 0), 0); - break; - - case NOP_EXPR: - dump_expr (TREE_OPERAND (t, 0), nop); - break; - - case CONSTRUCTOR: - if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t))) - { - tree idx = build_component_ref (t, index_identifier, NULL_TREE, 0); - - if (integer_all_onesp (idx)) - { - tree pfn = PFN_FROM_PTRMEMFUNC (t); - dump_unary_op ("&", pfn, 0); - break; - } - if (TREE_CODE (idx) == INTEGER_CST - && TREE_INT_CST_HIGH (idx) == 0) - { - tree virtuals; - unsigned HOST_WIDE_INT n; - - t = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t))); - t = TYPE_METHOD_BASETYPE (t); - virtuals = BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t))); - - n = TREE_INT_CST_LOW (idx); - - /* Map vtable index back one, to allow for the null pointer to - member. */ - --n; - - while (n > 0 && virtuals) - { - --n; - virtuals = TREE_CHAIN (virtuals); - } - if (virtuals) - { - dump_expr (FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (virtuals)), 0); - break; - } - } - } - OB_PUTC ('{'); - dump_expr_list (CONSTRUCTOR_ELTS (t)); - OB_PUTC ('}'); - break; - - case OFFSET_REF: - { - tree ob = TREE_OPERAND (t, 0); - if (is_dummy_object (ob)) - { - if (TREE_CODE (TREE_OPERAND (t, 1)) == FUNCTION_DECL) - /* A::f */ - dump_expr (TREE_OPERAND (t, 1), 0); - else - dump_decl (TREE_OPERAND (t, 1), 0); - } - else - { - if (TREE_CODE (ob) == INDIRECT_REF) - { - dump_expr (TREE_OPERAND (ob, 0), 0); - OB_PUTS (" ->* "); - } - else - { - dump_expr (ob, 0); - OB_PUTS (" .* "); - } - dump_expr (TREE_OPERAND (t, 1), 0); - } - break; - } - - case TEMPLATE_PARM_INDEX: - dump_decl (TEMPLATE_PARM_DECL (t), -1); - break; - - case IDENTIFIER_NODE: - OB_PUTID (t); - break; - - case SCOPE_REF: - dump_type (TREE_OPERAND (t, 0), 0); - OB_PUTS ("::"); - dump_expr (TREE_OPERAND (t, 1), 0); - break; - - case CAST_EXPR: - if (TREE_OPERAND (t, 0) == NULL_TREE - || TREE_CHAIN (TREE_OPERAND (t, 0))) - { - dump_type (TREE_TYPE (t), 0); - OB_PUTC ('('); - dump_expr_list (TREE_OPERAND (t, 0)); - OB_PUTC (')'); - } - else - { - OB_PUTC ('('); - dump_type (TREE_TYPE (t), 0); - OB_PUTC (')'); - OB_PUTC ('('); - dump_expr_list (TREE_OPERAND (t, 0)); - OB_PUTC (')'); - } - break; - - case LOOKUP_EXPR: - OB_PUTID (TREE_OPERAND (t, 0)); - break; - - case ARROW_EXPR: - dump_expr (TREE_OPERAND (t, 0), nop); - OB_PUTS ("->"); - break; - - case SIZEOF_EXPR: - case ALIGNOF_EXPR: - if (TREE_CODE (t) == SIZEOF_EXPR) - OB_PUTS ("sizeof ("); - else - { - my_friendly_assert (TREE_CODE (t) == ALIGNOF_EXPR, 0); - OB_PUTS ("__alignof__ ("); - } - if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t, 0))) == 't') - dump_type (TREE_OPERAND (t, 0), 0); - else - dump_unary_op ("*", t, 0); - OB_PUTC (')'); - break; - - case DEFAULT_ARG: - OB_PUTS ("{unparsed}"); - break; - - case TRY_CATCH_EXPR: - case WITH_CLEANUP_EXPR: - case CLEANUP_POINT_EXPR: - dump_expr (TREE_OPERAND (t, 0), nop); - break; - - case TREE_LIST: - if (TREE_VALUE (t) && TREE_CODE (TREE_VALUE (t)) == FUNCTION_DECL) - { - OB_PUTID (DECL_NAME (TREE_VALUE (t))); - break; - } - /* else fall through */ - - /* This list is incomplete, but should suffice for now. - It is very important that `sorry' does not call - `report_error_function'. That could cause an infinite loop. */ - default: - sorry ("`%s' not supported by dump_expr", - tree_code_name[(int) TREE_CODE (t)]); - - /* fall through to ERROR_MARK... */ - case ERROR_MARK: - OB_PUTCP ("{error}"); - break; - } -} - -static void -dump_binary_op (opstring, t) - char *opstring; - tree t; -{ - OB_PUTC ('('); - dump_expr (TREE_OPERAND (t, 0), 1); - OB_PUTC (' '); - OB_PUTCP (opstring); - OB_PUTC (' '); - dump_expr (TREE_OPERAND (t, 1), 1); - OB_PUTC (')'); -} - -static void -dump_unary_op (opstring, t, nop) - char *opstring; - tree t; - int nop; -{ - if (!nop) OB_PUTC ('('); - OB_PUTCP (opstring); - dump_expr (TREE_OPERAND (t, 0), 1); - if (!nop) OB_PUTC (')'); -} - -char * -fndecl_as_string (fndecl, print_ret_type_p) - tree fndecl; - int print_ret_type_p; -{ - return decl_as_string (fndecl, print_ret_type_p); -} - -/* Same, but handle a _TYPE. - Called from convert_to_reference, mangle_class_name_for_template, - build_unary_op, and GNU_xref_decl. If CANONICAL_NAME is non-zero, - when describing a typedef, we use the name of the type described, - rather than the name of the typedef. */ - -char * -type_as_string_real (typ, v, canonical_name) - tree typ; - int v; - int canonical_name; -{ - OB_INIT (); - - dump_type_real (typ, v, canonical_name); - - OB_FINISH (); - - return (char *)obstack_base (&scratch_obstack); -} - - -char * -type_as_string (typ, v) - tree typ; - int v; -{ - return type_as_string_real (typ, v, 0); -} - -char * -expr_as_string (decl, v) - tree decl; - int v ATTRIBUTE_UNUSED; -{ - OB_INIT (); - - dump_expr (decl, 1); - - OB_FINISH (); - - return (char *)obstack_base (&scratch_obstack); -} - -/* A cross between type_as_string and fndecl_as_string. - Only called from substitute_nice_name. */ - -char * -decl_as_string (decl, v) - tree decl; - int v; -{ - OB_INIT (); - - dump_decl (decl, v); - - OB_FINISH (); - - return (char *)obstack_base (&scratch_obstack); -} - -/* Generate the three forms of printable names for lang_printable_name. */ - -char * -lang_decl_name (decl, v) - tree decl; - int v; -{ - if (v >= 2) - return decl_as_string (decl, 1); - - OB_INIT (); - - if (v == 1 && DECL_CLASS_SCOPE_P (decl)) - { - tree cname; - if (TREE_CODE (decl) == FUNCTION_DECL) - cname = DECL_CLASS_CONTEXT (decl); - else - cname = DECL_CONTEXT (decl); - dump_type (cname, 0); - OB_PUTC2 (':', ':'); - } - - if (TREE_CODE (decl) == FUNCTION_DECL) - dump_function_name (decl); - else - dump_decl (DECL_NAME (decl), 0); - - OB_FINISH (); - - return (char *)obstack_base (&scratch_obstack); -} - - -char * -cp_file_of (t) - tree t; -{ - if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t)) - return DECL_SOURCE_FILE (DECL_CONTEXT (t)); - else if (TREE_CODE_CLASS (TREE_CODE (t)) == 't') - return DECL_SOURCE_FILE (TYPE_MAIN_DECL (t)); - else - return DECL_SOURCE_FILE (t); -} - -int -cp_line_of (t) - tree t; -{ - int line = 0; - if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t)) - line = DECL_SOURCE_LINE (DECL_CONTEXT (t)); - if (TREE_CODE (t) == TYPE_DECL && DECL_ARTIFICIAL (t) - && TYPE_MAIN_DECL (TREE_TYPE (t))) - t = TREE_TYPE (t); - - if (TREE_CODE_CLASS (TREE_CODE (t)) == 't') - line = DECL_SOURCE_LINE (TYPE_MAIN_DECL (t)); - else - line = DECL_SOURCE_LINE (t); - - if (line == 0) - return lineno; - - return line; -} - -char * -code_as_string (c, v) - enum tree_code c; - int v ATTRIBUTE_UNUSED; -{ - return tree_code_name [c]; -} - -char * -language_as_string (c, v) - enum languages c; - int v ATTRIBUTE_UNUSED; -{ - switch (c) - { - case lang_c: - return "C"; - - case lang_cplusplus: - return "C++"; - - case lang_java: - return "Java"; - - default: - my_friendly_abort (355); - return 0; - } -} - -/* Return the proper printed version of a parameter to a C++ function. */ - -char * -parm_as_string (p, v) - int p; - int v ATTRIBUTE_UNUSED; -{ - if (p < 0) - return "`this'"; - - sprintf (digit_buffer, "%d", p+1); - return digit_buffer; -} - -char * -op_as_string (p, v) - enum tree_code p; - int v ATTRIBUTE_UNUSED; -{ - static char buf[] = "operator "; - - if (p == 0) - return "{unknown}"; - - strcpy (buf + 9, opname_tab [p]); - return buf; -} - -char * -assop_as_string (p, v) - enum tree_code p; - int v ATTRIBUTE_UNUSED; -{ - static char buf[] = "operator "; - - if (p == 0) - return "{unknown}"; - - strcpy (buf + 9, assignop_tab [p]); - return buf; -} - -char * -args_as_string (p, v) - tree p; - int v; -{ - if (p == NULL_TREE) - return ""; - - if (TREE_CODE_CLASS (TREE_CODE (TREE_VALUE (p))) == 't') - return type_as_string (p, v); - - OB_INIT (); - for (; p; p = TREE_CHAIN (p)) - { - if (TREE_VALUE (p) == null_node) - OB_PUTS ("NULL"); - else - dump_type (error_type (TREE_VALUE (p)), v); - if (TREE_CHAIN (p)) - OB_PUTS (", "); - } - OB_FINISH (); - return (char *)obstack_base (&scratch_obstack); -} - -char * -cv_as_string (p, v) - tree p; - int v ATTRIBUTE_UNUSED; -{ - OB_INIT (); - - dump_qualifiers (p, before); - - OB_FINISH (); - - return (char *)obstack_base (&scratch_obstack); -} diff --git a/gcc/cp/except.c b/gcc/cp/except.c deleted file mode 100755 index aa1ff92..0000000 --- a/gcc/cp/except.c +++ /dev/null @@ -1,1161 +0,0 @@ -/* Handle exceptional things in C++. - Copyright (C) 1989, 92-97, 1998, 1999 Free Software Foundation, Inc. - Contributed by Michael Tiemann - Rewritten by Mike Stump , based upon an - initial re-implementation courtesy Tad Hunt. - -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 -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - - -#include "config.h" -#include "system.h" -#include "tree.h" -#include "rtl.h" -#include "cp-tree.h" -#include "flags.h" -#include "obstack.h" -#include "expr.h" -#include "output.h" -#include "except.h" -#include "function.h" -#include "defaults.h" -#include "toplev.h" -#include "eh-common.h" - -rtx expand_builtin_return_addr PROTO((enum built_in_function, int, rtx)); - -/* Holds the fndecl for __builtin_return_address. */ -tree builtin_return_address_fndecl; - -/* A couple of backend routines from m88k.c */ - -static void push_eh_cleanup PROTO((void)); -static tree build_eh_type_type PROTO((tree)); -static tree build_eh_type PROTO((tree)); -static void expand_end_eh_spec PROTO((tree)); -static tree call_eh_info PROTO((void)); -static void push_eh_info PROTO((void)); -static tree get_eh_info PROTO((void)); -static tree get_eh_value PROTO((void)); -#if 0 -static tree get_eh_type PROTO((void)); -static tree get_eh_caught PROTO((void)); -static tree get_eh_handlers PROTO((void)); -#endif -static tree do_pop_exception PROTO((void)); -static void process_start_catch_block PROTO((tree, tree)); -static tree build_eh_type_type_ref PROTO((tree)); -static tree build_terminate_handler PROTO((void)); -static tree alloc_eh_object PROTO((tree)); - -#if 0 -/* This is the startup, and finish stuff per exception table. */ - -/* XXX - Tad: exception handling section */ -#ifndef EXCEPT_SECTION_ASM_OP -#define EXCEPT_SECTION_ASM_OP "section\t.gcc_except_table,\"a\",@progbits" -#endif - -#ifdef EXCEPT_SECTION_ASM_OP - - /* on machines which support it, the exception table lives in another section, - but it needs a label so we can reference it... This sets up that - label! */ -asm (EXCEPT_SECTION_ASM_OP); -exception_table __EXCEPTION_TABLE__[1] = { (void*)0, (void*)0, (void*)0 }; -asm (TEXT_SECTION_ASM_OP); - -#endif /* EXCEPT_SECTION_ASM_OP */ - -#ifdef EXCEPT_SECTION_ASM_OP - - /* we need to know where the end of the exception table is... so this - is how we do it! */ - -asm (EXCEPT_SECTION_ASM_OP); -exception_table __EXCEPTION_END__[1] = { (void*)-1, (void*)-1, (void*)-1 }; -asm (TEXT_SECTION_ASM_OP); - -#endif /* EXCEPT_SECTION_ASM_OP */ - -#endif - -#include "decl.h" -#include "insn-flags.h" -#include "obstack.h" - -/* ====================================================================== - Briefly the algorithm works like this: - - When a constructor or start of a try block is encountered, - push_eh_entry (&eh_stack) is called. Push_eh_entry () creates a - new entry in the unwind protection stack and returns a label to - output to start the protection for that block. - - When a destructor or end try block is encountered, pop_eh_entry - (&eh_stack) is called. Pop_eh_entry () returns the eh_entry it - created when push_eh_entry () was called. The eh_entry structure - contains three things at this point. The start protect label, - the end protect label, and the exception handler label. The end - protect label should be output before the call to the destructor - (if any). If it was a destructor, then its parse tree is stored - in the finalization variable in the eh_entry structure. Otherwise - the finalization variable is set to NULL to reflect the fact that - it is the end of a try block. Next, this modified eh_entry node - is enqueued in the finalizations queue by calling - enqueue_eh_entry (&queue,entry). - - +---------------------------------------------------------------+ - |XXX: Will need modification to deal with partially | - | constructed arrays of objects | - | | - | Basically, this consists of keeping track of how many | - | of the objects have been constructed already (this | - | should be in a register though, so that shouldn't be a | - | problem. | - +---------------------------------------------------------------+ - - When a catch block is encountered, there is a lot of work to be - done. - - Since we don't want to generate the catch block inline with the - regular flow of the function, we need to have some way of doing - so. Luckily, we can use sequences to defer the catch sections. - When the start of a catch block is encountered, we start the - sequence. After the catch block is generated, we end the - sequence. - - Next we must insure that when the catch block is executed, all - finalizations for the matching try block have been completed. If - any of those finalizations throw an exception, we must call - terminate according to the ARM (section r.15.6.1). What this - means is that we need to dequeue and emit finalizations for each - entry in the eh_queue until we get to an entry with a NULL - finalization field. For any of the finalization entries, if it - is not a call to terminate (), we must protect it by giving it - another start label, end label, and exception handler label, - setting its finalization tree to be a call to terminate (), and - enqueue'ing this new eh_entry to be output at an outer level. - Finally, after all that is done, we can get around to outputting - the catch block which basically wraps all the "catch (...) {...}" - statements in a big if/then/else construct that matches the - correct block to call. - - ===================================================================== */ - -/* local globals for function calls - ====================================================================== */ - -/* Used to cache "terminate" and "__throw_type_match*". */ -static tree Terminate, CatchMatch; - -/* Used to cache __find_first_exception_table_match for throw. */ -static tree FirstExceptionMatch; - -/* Used to cache a call to __unwind_function. */ -static tree Unwind; - -/* ====================================================================== */ - - -/* ========================================================================= */ - - - -/* local globals - these local globals are for storing data necessary for - generating the exception table and code in the correct order. - - ========================================================================= */ - -extern rtx catch_clauses; -extern tree const_ptr_type_node; - -/* ========================================================================= */ - -/* sets up all the global eh stuff that needs to be initialized at the - start of compilation. - - This includes: - - Setting up all the function call trees. */ - -void -init_exception_processing () -{ - /* void vtype () */ - tree vtype = build_function_type (void_type_node, void_list_node); - - if (flag_honor_std) - push_namespace (get_identifier ("std")); - Terminate = auto_function (get_identifier ("terminate"), - vtype, NOT_BUILT_IN); - TREE_THIS_VOLATILE (Terminate) = 1; - if (flag_honor_std) - pop_namespace (); - - push_lang_context (lang_name_c); - - set_exception_lang_code (EH_LANG_C_plus_plus); - set_exception_version_code (1); - - CatchMatch - = builtin_function (flag_rtti - ? "__throw_type_match_rtti" - : "__throw_type_match", - build_function_type (ptr_type_node, - tree_cons (NULL_TREE, const_ptr_type_node, - tree_cons (NULL_TREE, const_ptr_type_node, - tree_cons (NULL_TREE, ptr_type_node, - void_list_node)))), - NOT_BUILT_IN, NULL_PTR); - FirstExceptionMatch - = builtin_function ("__find_first_exception_table_match", - build_function_type (ptr_type_node, - tree_cons (NULL_TREE, ptr_type_node, - void_list_node)), - NOT_BUILT_IN, NULL_PTR); - Unwind - = builtin_function ("__unwind_function", - build_function_type (void_type_node, - tree_cons (NULL_TREE, ptr_type_node, - void_list_node)), - NOT_BUILT_IN, NULL_PTR); - - pop_lang_context (); - - /* If we use setjmp/longjmp EH, arrange for all cleanup actions to - be protected with __terminate. */ - protect_cleanup_actions_with_terminate = 1; -} - -/* Retrieve a pointer to the cp_eh_info node for the current exception. */ - -static tree -call_eh_info () -{ - tree fn; - - fn = get_identifier ("__start_cp_handler"); - if (IDENTIFIER_GLOBAL_VALUE (fn)) - fn = IDENTIFIER_GLOBAL_VALUE (fn); - else - { - tree t1, t, fields[7]; - - /* Declare cp_eh_info * __start_cp_handler (void), - as defined in exception.cc. */ - push_obstacks_nochange (); - end_temporary_allocation (); - - /* struct cp_eh_info. This must match exception.cc. Note that this - type is not pushed anywhere. */ - t1= make_lang_type (RECORD_TYPE); - fields[0] = build_lang_field_decl (FIELD_DECL, - get_identifier ("handler_label"), ptr_type_node); - fields[1] = build_lang_field_decl (FIELD_DECL, - get_identifier ("dynamic_handler_chain"), ptr_type_node); - fields[2] = build_lang_field_decl (FIELD_DECL, - get_identifier ("info"), ptr_type_node); - fields[3] = build_lang_field_decl (FIELD_DECL, - get_identifier ("table_index"), ptr_type_node); - /* N.B.: The fourth field LEN is expected to be - the number of fields - 1, not the total number of fields. */ - finish_builtin_type (t1, "eh_context", fields, 3, ptr_type_node); - t1 = build_pointer_type (t1); - - t1= make_lang_type (RECORD_TYPE); - fields[0] = build_lang_field_decl (FIELD_DECL, - get_identifier ("match_function"), ptr_type_node); - fields[1] = build_lang_field_decl (FIELD_DECL, - get_identifier ("language"), short_integer_type_node); - fields[2] = build_lang_field_decl (FIELD_DECL, - get_identifier ("version"), short_integer_type_node); - /* N.B.: The fourth field LEN is expected to be - the number of fields - 1, not the total number of fields. */ - finish_builtin_type (t1, "__eh_info", fields, 2, ptr_type_node); - t = make_lang_type (RECORD_TYPE); - fields[0] = build_lang_field_decl (FIELD_DECL, - get_identifier ("eh_info"), t1); - fields[1] = build_lang_field_decl (FIELD_DECL, get_identifier ("value"), - ptr_type_node); - fields[2] = build_lang_field_decl (FIELD_DECL, get_identifier ("type"), - ptr_type_node); - fields[3] = build_lang_field_decl - (FIELD_DECL, get_identifier ("cleanup"), - build_pointer_type (build_function_type - (ptr_type_node, tree_cons - (NULL_TREE, ptr_type_node, void_list_node)))); - fields[4] = build_lang_field_decl (FIELD_DECL, get_identifier ("caught"), - boolean_type_node); - fields[5] = build_lang_field_decl (FIELD_DECL, get_identifier ("next"), - build_pointer_type (t)); - fields[6] = build_lang_field_decl - (FIELD_DECL, get_identifier ("handlers"), long_integer_type_node); - /* N.B.: The fourth field LEN is expected to be - the number of fields - 1, not the total number of fields. */ - finish_builtin_type (t, "cp_eh_info", fields, 6, ptr_type_node); - t = build_pointer_type (t); - - /* And now the function. */ - fn = build_lang_decl (FUNCTION_DECL, fn, - build_function_type (t, void_list_node)); - DECL_EXTERNAL (fn) = 1; - TREE_PUBLIC (fn) = 1; - DECL_ARTIFICIAL (fn) = 1; - pushdecl_top_level (fn); - make_function_rtl (fn); - pop_obstacks (); - } - mark_used (fn); - return build_function_call (fn, NULL_TREE); -} - -/* Retrieve a pointer to the cp_eh_info node for the current exception - and save it in the current binding level. */ - -static void -push_eh_info () -{ - tree decl, fn = call_eh_info (); - - /* Remember the pointer to the current exception info; it won't change - during this catch block. */ - decl = build_decl (VAR_DECL, get_identifier ("__exception_info"), - TREE_TYPE (fn)); - DECL_ARTIFICIAL (decl) = 1; - DECL_INITIAL (decl) = fn; - decl = pushdecl (decl); - cp_finish_decl (decl, fn, NULL_TREE, 0, 0); -} - -/* Returns a reference to the cp_eh_info node for the current exception. */ - -static tree -get_eh_info () -{ - /* Look for the pointer pushed in push_eh_info. */ - tree t = lookup_name (get_identifier ("__exception_info"), 0); - return build_indirect_ref (t, NULL_PTR); -} - -/* Returns a reference to the current exception object. */ - -static tree -get_eh_value () -{ - return build_component_ref (get_eh_info (), get_identifier ("value"), - NULL_TREE, 0); -} - -/* Returns a reference to the current exception type. */ - -#if 0 -static tree -get_eh_type () -{ - return build_component_ref (get_eh_info (), get_identifier ("type"), - NULL_TREE, 0); -} - -/* Returns a reference to whether or not the current exception - has been caught. */ - -static tree -get_eh_caught () -{ - return build_component_ref (get_eh_info (), get_identifier ("caught"), - NULL_TREE, 0); -} - -/* Returns a reference to whether or not the current exception - has been caught. */ - -static tree -get_eh_handlers () -{ - return build_component_ref (get_eh_info (), get_identifier ("handlers"), - NULL_TREE, 0); -} -#endif - -/* Build a type value for use at runtime for a type that is matched - against by the exception handling system. */ - -static tree -build_eh_type_type (type) - tree type; -{ - char *typestring; - tree exp; - - if (type == error_mark_node) - return error_mark_node; - - /* peel back references, so they match. */ - if (TREE_CODE (type) == REFERENCE_TYPE) - type = TREE_TYPE (type); - - /* Peel off cv qualifiers. */ - type = TYPE_MAIN_VARIANT (type); - - if (flag_rtti) - return build1 (ADDR_EXPR, ptr_type_node, get_typeid_1 (type)); - - typestring = build_overload_name (type, 1, 1); - exp = combine_strings (build_string (strlen (typestring)+1, typestring)); - return build1 (ADDR_EXPR, ptr_type_node, exp); -} - -/* Build the address of a runtime type for use in the runtime matching - field of the new exception model */ - -static tree -build_eh_type_type_ref (type) - tree type; -{ - char *typestring; - tree exp; - - if (type == error_mark_node) - return error_mark_node; - - /* peel back references, so they match. */ - if (TREE_CODE (type) == REFERENCE_TYPE) - type = TREE_TYPE (type); - - /* Peel off cv qualifiers. */ - type = TYPE_MAIN_VARIANT (type); - - push_obstacks_nochange (); - end_temporary_allocation (); - - if (flag_rtti) - { - exp = get_tinfo_fn (type); - TREE_USED (exp) = 1; - mark_inline_for_output (exp); - exp = build1 (ADDR_EXPR, ptr_type_node, exp); - } - else - { - typestring = build_overload_name (type, 1, 1); - exp = combine_strings (build_string (strlen (typestring)+1, typestring)); - exp = build1 (ADDR_EXPR, ptr_type_node, exp); - } - pop_obstacks (); - return (exp); -} - - -/* Build a type value for use at runtime for a exp that is thrown or - matched against by the exception handling system. */ - -static tree -build_eh_type (exp) - tree exp; -{ - if (flag_rtti) - { - exp = build_typeid (exp); - return build1 (ADDR_EXPR, ptr_type_node, exp); - } - return build_eh_type_type (TREE_TYPE (exp)); -} - -/* This routine is called to mark all the symbols representing runtime - type functions in the exception table as haveing been referenced. - This will make sure code is emitted for them. Called from finish_file. */ -void -mark_all_runtime_matches () -{ - int x,num; - void **ptr; - tree exp; - - num = find_all_handler_type_matches (&ptr); - if (num == 0 || ptr == NULL) - return; - - for (x=0; x -#include "gansidecl.h" /* Needed to support macros used in eh-common.h. */ -#include "eh-common.h" - -/* Define terminate, unexpected, set_terminate, set_unexpected as - well as the default terminate func and default unexpected func. */ - -extern std::terminate_handler __terminate_func __attribute__((__noreturn__)); -using std::terminate; - -void -std::terminate () -{ - __terminate_func (); -} - -void -__default_unexpected () -{ - terminate (); -} - -static std::unexpected_handler __unexpected_func __attribute__((__noreturn__)) - = __default_unexpected; - -std::terminate_handler -std::set_terminate (std::terminate_handler func) -{ - std::terminate_handler old = __terminate_func; - - __terminate_func = func; - return old; -} - -std::unexpected_handler -std::set_unexpected (std::unexpected_handler func) -{ - std::unexpected_handler old = __unexpected_func; - - __unexpected_func = func; - return old; -} - -void -std::unexpected () -{ - __unexpected_func (); -} - -/* C++-specific state about the current exception. - This must match init_exception_processing(). - - Note that handlers and caught are not redundant; when rethrown, an - exception can have multiple active handlers and still be considered - uncaught. */ - -struct cp_eh_info -{ - __eh_info eh_info; - void *value; - void *type; - void (*cleanup)(void *, int); - bool caught; - cp_eh_info *next; - long handlers; - void *original_value; -}; - -/* Language-specific EH info pointer, defined in libgcc2. */ - -extern "C" cp_eh_info **__get_eh_info (); // actually void ** - -/* Is P the type_info node for a pointer of some kind? */ - -extern bool __is_pointer (void *); - - -/* OLD Compiler hook to return a pointer to the info for the current exception. - Used by get_eh_info (). This fudges the actualy returned value to - point to the beginning of what USE to be the cp_eh_info structure. - THis is so that old code that dereferences this pointer will find - things where it expects it to be.*/ -extern "C" void * -__cp_exception_info (void) -{ - return &((*__get_eh_info ())->value); -} - -#define CP_EH_INFO ((cp_eh_info *) *__get_eh_info ()) - -/* Old Compiler hook to return a pointer to the info for the current exception. - Used by get_eh_info (). */ - -extern "C" cp_eh_info * -__cp_eh_info (void) -{ - cp_eh_info *p = CP_EH_INFO; - return p; -} - -/* Compiler hook to return a pointer to the info for the current exception, - Set the caught bit, and increment the number of handlers that are - looking at this exception. This makes handlers smaller. */ - -extern "C" cp_eh_info * -__start_cp_handler (void) -{ - cp_eh_info *p = CP_EH_INFO; - p->caught = 1; - p->handlers++; - return p; -} - -/* Allocate a buffer for a cp_eh_info and an exception object of size SIZE, - and return a pointer to the beginning of the object's space. */ - -extern "C" void * malloc (size_t); -extern "C" void * -__eh_alloc (size_t size) -{ - void *p = malloc (size); - if (p == 0) - terminate (); - return p; -} - -/* Free the memory for an cp_eh_info and associated exception, given - a pointer to the cp_eh_info. */ - -extern "C" void free (void *); -extern "C" void -__eh_free (void *p) -{ - free (p); -} - - -typedef void * (* rtimetype) (void); - -extern "C" void * -__cplus_type_matcher (cp_eh_info *info, rtimetype match_info, - exception_descriptor *exception_table) -{ - void *ret; - - /* No exception table implies the old style mechanism, so don't check. */ - if (exception_table != NULL - && exception_table->lang.language != EH_LANG_C_plus_plus) - return NULL; - - if (match_info == CATCH_ALL_TYPE) - return info->value; - - /* we don't worry about version info yet, there is only one version! */ - - void *match_type = match_info (); - ret = __throw_type_match_rtti (match_type, info->type, info->original_value); - /* change value of exception */ - if (ret) - info->value = ret; - return ret; -} - - -/* Compiler hook to push a new exception onto the stack. - Used by expand_throw(). */ - -extern "C" void -__cp_push_exception (void *value, void *type, void (*cleanup)(void *, int)) -{ - cp_eh_info *p = (cp_eh_info *) __eh_alloc (sizeof (cp_eh_info)); - - p->value = value; - p->type = type; - p->cleanup = cleanup; - p->handlers = 0; - p->caught = false; - p->original_value = value; - - p->eh_info.match_function = __cplus_type_matcher; - p->eh_info.language = EH_LANG_C_plus_plus; - p->eh_info.version = 1; - - cp_eh_info **q = __get_eh_info (); - - p->next = *q; - *q = p; -} - -/* Compiler hook to pop an exception that has been finalized. Used by - push_eh_cleanup(). P is the info for the exception caught by the - current catch block. */ - -extern "C" void -__cp_pop_exception (cp_eh_info *p) -{ - cp_eh_info **q = __get_eh_info (); - - --p->handlers; - - /* Don't really pop if there are still active handlers for our exception, - or if our exception is being rethrown (i.e. if the active exception is - our exception and it is uncaught). */ - if (p->handlers != 0 - || (p == *q && !p->caught)) - return; - - for (; *q; q = &((*q)->next)) - if (*q == p) - break; - - if (! *q) - terminate (); - - *q = p->next; - - if (p->cleanup) - /* 2 is a magic value for destructors; see build_delete(). */ - p->cleanup (p->value, 2); - - if (! __is_pointer (p->type)) - __eh_free (p->original_value); // value may have been co-erced. - - __eh_free (p); -} - -extern "C" void -__uncatch_exception (void) -{ - cp_eh_info *p = CP_EH_INFO; - if (p == 0) - terminate (); - p->caught = false; -} - -/* As per [except.unexpected]: - If an exception is thrown, we check it against the spec. If it doesn't - match, we call unexpected (). If unexpected () throws, we check that - exception against the spec. If it doesn't match, if the spec allows - bad_exception we throw that; otherwise we call terminate (). - - The compiler treats an exception spec as a try block with a generic - handler that just calls this function with a list of the allowed - exception types, so we have an active exception that can be rethrown. - - This function does not return. */ - -extern "C" void -__check_eh_spec (int n, const void **spec) -{ - cp_eh_info *p = CP_EH_INFO; - - for (int i = 0; i < n; ++i) - { - if (__throw_type_match_rtti (spec[i], p->type, p->value)) - throw; - } - - try - { - std::unexpected (); - } - catch (...) - { - // __exception_info is an artificial var pushed into each catch block. - if (p != __exception_info) - { - p = __exception_info; - for (int i = 0; i < n; ++i) - { - if (__throw_type_match_rtti (spec[i], p->type, p->value)) - throw; - } - } - - const std::type_info &bad_exc = typeid (std::bad_exception); - for (int i = 0; i < n; ++i) - { - if (__throw_type_match_rtti (spec[i], &bad_exc, p->value)) - throw std::bad_exception (); - } - - terminate (); - } -} - -extern "C" void -__throw_bad_cast (void) -{ - throw std::bad_cast (); -} - -extern "C" void -__throw_bad_typeid (void) -{ - throw std::bad_typeid (); -} - -/* Has the current exception been caught? */ - -bool -std::uncaught_exception () -{ - cp_eh_info *p = CP_EH_INFO; - return p && ! p->caught; -} - -const char * std::exception:: -what () const -{ - return typeid (*this).name (); -} -#endif diff --git a/gcc/cp/expr.c b/gcc/cp/expr.c deleted file mode 100755 index 3dc8eae..0000000 --- a/gcc/cp/expr.c +++ /dev/null @@ -1,433 +0,0 @@ -/* Convert language-specific tree expression to rtl instructions, - for GNU compiler. - Copyright (C) 1988, 92-97, 1998 Free Software Foundation, Inc. - -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 -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - - -#include "config.h" -#include "system.h" -#include "rtl.h" -#include "tree.h" -#include "flags.h" -#include "expr.h" -#include "cp-tree.h" -#include "toplev.h" - -#if 0 -static tree extract_aggr_init PROTO((tree, tree)); -static tree extract_scalar_init PROTO((tree, tree)); -#endif -static rtx cplus_expand_expr PROTO((tree, rtx, enum machine_mode, - enum expand_modifier)); - -/* Hook used by expand_expr to expand language-specific tree codes. */ - -static rtx -cplus_expand_expr (exp, target, tmode, modifier) - tree exp; - rtx target; - enum machine_mode tmode; - enum expand_modifier modifier; -{ - tree type = TREE_TYPE (exp); - register enum machine_mode mode = TYPE_MODE (type); - register enum tree_code code = TREE_CODE (exp); - int ignore = target == const0_rtx; - - if (ignore) - target = 0; - - /* No sense saving up arithmetic to be done - if it's all in the wrong mode to form part of an address. - And force_operand won't know whether to sign-extend or zero-extend. */ - - if (mode != Pmode && modifier == EXPAND_SUM) - modifier = EXPAND_NORMAL; - - switch (code) - { - case AGGR_INIT_EXPR: - { - /* Something needs to be initialized, but we didn't know - where that thing was when building the tree. For example, - it could be the return value of a function, or a parameter - to a function which lays down in the stack, or a temporary - variable which must be passed by reference. - - Cleanups are handled in a language-specific way: they - might be run by the called function (true in GNU C++ - for parameters with cleanups), or they might be - run by the caller, after the call (true in GNU C++ - for other cleanup needs). */ - - tree func = TREE_OPERAND (exp, 0); - tree args = TREE_OPERAND (exp, 1); - tree type = TREE_TYPE (exp), slot; - tree call_exp; - rtx call_target, return_target; - int pcc_struct_return = 0; - - /* The expression `init' wants to initialize what - `target' represents. SLOT holds the slot for TARGET. */ - slot = TREE_OPERAND (exp, 2); - - /* Should always be called with a target. */ - my_friendly_assert (target != NULL_RTX, 205); - - /* The target the initializer will initialize (CALL_TARGET) - must now be directed to initialize the target we are - supposed to initialize (TARGET). The semantics for - choosing what CALL_TARGET is is language-specific, - as is building the call which will perform the - initialization. It is left here to show the choices that - exist for C++. */ - - if (TREE_CODE (func) == ADDR_EXPR - && TREE_CODE (TREE_OPERAND (func, 0)) == FUNCTION_DECL - && DECL_CONSTRUCTOR_P (TREE_OPERAND (func, 0))) - { - type = build_pointer_type (type); - /* Don't clobber a value that might be part of a default - parameter value. */ - mark_addressable (slot); - if (TREE_PERMANENT (args)) - args = expr_tree_cons (0, build1 (ADDR_EXPR, type, slot), - TREE_CHAIN (args)); - else - TREE_VALUE (args) = build1 (ADDR_EXPR, type, slot); - call_target = 0; - } - else - { - call_target = target; -#ifdef PCC_STATIC_STRUCT_RETURN - if (aggregate_value_p (type)) - { - pcc_struct_return = 1; - call_target = 0; - } -#endif - } - - call_exp = build (CALL_EXPR, type, func, args, NULL_TREE); - TREE_SIDE_EFFECTS (call_exp) = 1; - return_target = expand_call (call_exp, call_target, ignore); - - if (call_target) - /* Trust that the right thing has been done; it's too hard to - verify. */ - return return_target; - - /* If we're suffering under the ancient PCC_STATIC_STRUCT_RETURN - calling convention, we need to copy the return value out of - the static return buffer into slot. */ - if (pcc_struct_return) - { - extern int flag_access_control; - int old_ac = flag_access_control; - - tree init = build_decl (VAR_DECL, NULL_TREE, - build_reference_type (type)); - DECL_RTL (init) = XEXP (return_target, 0); - init = convert_from_reference (init); - - flag_access_control = 0; - expand_aggr_init (slot, init, LOOKUP_ONLYCONVERTING); - flag_access_control = old_ac; - - if (TYPE_NEEDS_DESTRUCTOR (type)) - { - init = maybe_build_cleanup (init); - if (init != NULL_TREE) - expand_expr (init, const0_rtx, VOIDmode, 0); - } - } - - return DECL_RTL (slot); - } - - case PTRMEM_CST: - { - tree member; - tree offset; - - /* Find the member. */ - member = PTRMEM_CST_MEMBER (exp); - - if (TREE_CODE (member) == FIELD_DECL) - { - /* Find the offset for the field. */ - offset = convert (sizetype, - size_binop (EASY_DIV_EXPR, - DECL_FIELD_BITPOS (member), - size_int (BITS_PER_UNIT))); - - /* We offset all pointer to data members by 1 so that we - can distinguish between a null pointer to data member - and the first data member of a structure. */ - offset = size_binop (PLUS_EXPR, offset, size_int (1)); - - return expand_expr (cp_convert (type, offset), target, tmode, - modifier); - } - else - { - /* We don't yet handle pointer-to-member functions this - way. */ - my_friendly_abort (0); - return 0; - } - } - - case OFFSET_REF: - { - return expand_expr (default_conversion (resolve_offset_ref (exp)), - target, tmode, EXPAND_NORMAL); - } - - case THUNK_DECL: - return DECL_RTL (exp); - - case THROW_EXPR: - expand_throw (TREE_OPERAND (exp, 0)); - return NULL; - - case VEC_INIT_EXPR: - return expand_expr - (expand_vec_init - (NULL_TREE, TREE_OPERAND (exp, 0), - build_binary_op (MINUS_EXPR, TREE_OPERAND (exp, 2), - integer_one_node, 1), - TREE_OPERAND (exp, 1), 0), target, tmode, modifier); - - case NEW_EXPR: - return expand_expr (build_new_1 (exp), target, tmode, modifier); - - default: - break; - } - my_friendly_abort (40); - /* NOTREACHED */ - return NULL; -} - -void -init_cplus_expand () -{ - lang_expand_expr = cplus_expand_expr; -} - -/* If DECL had its rtl moved from where callers expect it - to be, fix it up. RESULT is the nominal rtl for the RESULT_DECL, - which may be a pseudo instead of a hard register. */ - -void -fixup_result_decl (decl, result) - tree decl; - rtx result; -{ - if (REG_P (result)) - { - if (REGNO (result) >= FIRST_PSEUDO_REGISTER) - { - rtx real_decl_result; - -#ifdef FUNCTION_OUTGOING_VALUE - real_decl_result - = FUNCTION_OUTGOING_VALUE (TREE_TYPE (decl), current_function_decl); -#else - real_decl_result - = FUNCTION_VALUE (TREE_TYPE (decl), current_function_decl); -#endif - REG_FUNCTION_VALUE_P (real_decl_result) = 1; - result = real_decl_result; - } - store_expr (decl, result, 0); - emit_insn (gen_rtx (USE, VOIDmode, result)); - } -} - -#if 0 -/* Expand this initialization inline and see if it's simple enough that - it can be done at compile-time. */ - -static tree -extract_aggr_init (decl, init) - tree decl, init; -{ - return 0; -} - -static tree -extract_scalar_init (decl, init) - tree decl, init; -{ - rtx value, insns, insn; - extern struct obstack temporary_obstack; - tree t = NULL_TREE; - - push_obstacks (&temporary_obstack, &temporary_obstack); - start_sequence (); - value = expand_expr (init, NULL_RTX, VOIDmode, 0); - insns = get_insns (); - end_sequence (); - reg_scan (insns, max_reg_num (), 0); - jump_optimize (insns, 0, 0, 1); - pop_obstacks (); - - for (insn = insns; insn; insn = NEXT_INSN (insn)) - { - rtx r, to; - - if (GET_CODE (insn) == NOTE) - continue; - else if (GET_CODE (insn) != INSN) - return 0; - - r = PATTERN (insn); - if (GET_CODE (r) != SET) - return 0; - - to = XEXP (r, 0); - - if (! (to == value - || (GET_CODE (to) == SUBREG && XEXP (to, 0) == value))) - return 0; - - r = XEXP (r, 1); - - switch (GET_CODE (r)) - { - case CONST_INT: - t = build_int_2 (XEXP (r, 0), 0); - break; - default: - return 0; - } - } - - return t; -} -#endif - -int -extract_init (decl, init) - tree decl ATTRIBUTE_UNUSED, init ATTRIBUTE_UNUSED; -{ - return 0; - -#if 0 - if (IS_AGGR_TYPE (TREE_TYPE (decl)) - || TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE) - init = extract_aggr_init (decl, init); - else - init = extract_scalar_init (decl, init); - - if (init == NULL_TREE) - return 0; - - DECL_INITIAL (decl) = init; - return 1; -#endif -} - -void -do_case (start, end) - tree start, end; -{ - tree value1 = NULL_TREE, value2 = NULL_TREE, label; - - if (start != NULL_TREE && TREE_TYPE (start) != NULL_TREE - && POINTER_TYPE_P (TREE_TYPE (start))) - error ("pointers are not permitted as case values"); - - if (end && pedantic) - pedwarn ("ANSI C++ forbids range expressions in switch statement"); - - if (processing_template_decl) - { - add_tree (build_min_nt (CASE_LABEL, start, end)); - return; - } - - if (start) - value1 = check_cp_case_value (start); - if (end) - value2 = check_cp_case_value (end); - - label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); - - if (value1 != error_mark_node - && value2 != error_mark_node) - { - tree duplicate; - int success; - - if (end) - success = pushcase_range (value1, value2, convert_and_check, - label, &duplicate); - else if (start) - success = pushcase (value1, convert_and_check, label, &duplicate); - else - success = pushcase (NULL_TREE, 0, label, &duplicate); - - if (success == 1) - { - if (end) - error ("case label not within a switch statement"); - else if (start) - cp_error ("case label `%E' not within a switch statement", start); - else - error ("default label not within a switch statement"); - } - else if (success == 2) - { - if (end) - { - error ("duplicate (or overlapping) case value"); - cp_error_at ("this is the first entry overlapping that value", - duplicate); - } - else if (start) - { - cp_error ("duplicate case value `%E'", start); - cp_error_at ("previously used here", duplicate); - } - else - { - error ("multiple default labels in one switch"); - cp_error_at ("this is the first default label", duplicate); - } - } - else if (success == 3) - warning ("case value out of range"); - else if (success == 4) - warning ("empty range specified"); - else if (success == 5) - { - if (end) - error ("case label within scope of cleanup or variable array"); - else if (! start) - error ("`default' label within scope of cleanup or variable array"); - else - cp_error ("case label `%E' within scope of cleanup or variable array", start); - } - } - define_case_label (); -} diff --git a/gcc/cp/friend.c b/gcc/cp/friend.c deleted file mode 100755 index c26d695..0000000 --- a/gcc/cp/friend.c +++ /dev/null @@ -1,490 +0,0 @@ -/* Help friends in C++. - Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc. - -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 -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "config.h" -#include "system.h" -#include "tree.h" -#include "rtl.h" -#include "cp-tree.h" -#include "flags.h" -#include "output.h" -#include "toplev.h" - -static void add_friend PROTO((tree, tree)); -static void add_friends PROTO((tree, tree, tree)); - -/* Friend data structures are described in cp-tree.h. */ - -int -is_friend (type, supplicant) - tree type, supplicant; -{ - int declp; - register tree list; - tree context; - - if (supplicant == NULL_TREE || type == NULL_TREE) - return 0; - - declp = (TREE_CODE_CLASS (TREE_CODE (supplicant)) == 'd'); - - if (declp) - /* It's a function decl. */ - { - tree list = DECL_FRIENDLIST (TYPE_MAIN_DECL (type)); - tree name = DECL_NAME (supplicant); - tree ctype; - - if (DECL_FUNCTION_MEMBER_P (supplicant)) - ctype = DECL_CLASS_CONTEXT (supplicant); - else - ctype = NULL_TREE; - - for (; list ; list = TREE_CHAIN (list)) - { - if (name == TREE_PURPOSE (list)) - { - tree friends = TREE_VALUE (list); - for (; friends ; friends = TREE_CHAIN (friends)) - { - if (same_type_p (ctype, TREE_PURPOSE (friends))) - return 1; - - if (TREE_VALUE (friends) == NULL_TREE) - continue; - - if (supplicant == TREE_VALUE (friends)) - return 1; - - /* With -fguiding-decls we are more lenient about - friendship. This is bogus in general since two - specializations of a template with non-type - template parameters may have the same type, but - be different. - - Temporarily, we are also more lenient to deal - with nested friend functions, for which there can - be more than one FUNCTION_DECL, despite being the - same function. When that's fixed, the - FUNCTION_MEMBER_P bit can go. */ - if ((flag_guiding_decls - || DECL_FUNCTION_MEMBER_P (supplicant)) - && same_type_p (TREE_TYPE (supplicant), - TREE_TYPE (TREE_VALUE (friends)))) - return 1; - - if (TREE_CODE (TREE_VALUE (friends)) == TEMPLATE_DECL - && is_specialization_of (supplicant, - TREE_VALUE (friends))) - return 1; - } - break; - } - } - } - else - /* It's a type. */ - { - if (type == supplicant) - return 1; - - list = CLASSTYPE_FRIEND_CLASSES (TREE_TYPE (TYPE_MAIN_DECL (type))); - for (; list ; list = TREE_CHAIN (list)) - { - tree t = TREE_VALUE (list); - - if (TREE_CODE (t) == TEMPLATE_DECL ? - is_specialization_of (TYPE_MAIN_DECL (supplicant), t) : - same_type_p (supplicant, t)) - return 1; - } - } - - if (declp && DECL_FUNCTION_MEMBER_P (supplicant)) - context = DECL_CLASS_CONTEXT (supplicant); - else if (! declp) - /* Local classes have the same access as the enclosing function. */ - context = hack_decl_function_context (TYPE_MAIN_DECL (supplicant)); - else - context = NULL_TREE; - - /* A namespace is not friend to anybody. */ - if (context && TREE_CODE (context) == NAMESPACE_DECL) - context = NULL_TREE; - - if (context) - return is_friend (type, context); - - return 0; -} - -/* Add a new friend to the friends of the aggregate type TYPE. - DECL is the FUNCTION_DECL of the friend being added. */ - -static void -add_friend (type, decl) - tree type, decl; -{ - tree typedecl = TYPE_MAIN_DECL (type); - tree list = DECL_FRIENDLIST (typedecl); - tree name = DECL_NAME (decl); - - while (list) - { - if (name == TREE_PURPOSE (list)) - { - tree friends = TREE_VALUE (list); - for (; friends ; friends = TREE_CHAIN (friends)) - { - if (decl == TREE_VALUE (friends)) - { - cp_warning ("`%D' is already a friend of class `%T'", - decl, type); - cp_warning_at ("previous friend declaration of `%D'", - TREE_VALUE (friends)); - return; - } - } - TREE_VALUE (list) = tree_cons (error_mark_node, decl, - TREE_VALUE (list)); - return; - } - list = TREE_CHAIN (list); - } - DECL_FRIENDLIST (typedecl) - = tree_cons (DECL_NAME (decl), build_tree_list (error_mark_node, decl), - DECL_FRIENDLIST (typedecl)); - if (DECL_NAME (decl) == ansi_opname[(int) MODIFY_EXPR]) - { - tree parmtypes = TYPE_ARG_TYPES (TREE_TYPE (decl)); - TYPE_HAS_ASSIGNMENT (TREE_TYPE (typedecl)) = 1; - if (parmtypes && TREE_CHAIN (parmtypes)) - { - tree parmtype = TREE_VALUE (TREE_CHAIN (parmtypes)); - if (TREE_CODE (parmtype) == REFERENCE_TYPE - && TREE_TYPE (parmtypes) == TREE_TYPE (typedecl)) - TYPE_HAS_ASSIGN_REF (TREE_TYPE (typedecl)) = 1; - } - } -} - -/* Declare that every member function NAME in FRIEND_TYPE - (which may be NULL_TREE) is a friend of type TYPE. */ - -static void -add_friends (type, name, friend_type) - tree type, name, friend_type; -{ - tree typedecl = TYPE_MAIN_DECL (type); - tree list = DECL_FRIENDLIST (typedecl); - - while (list) - { - if (name == TREE_PURPOSE (list)) - { - tree friends = TREE_VALUE (list); - while (friends && TREE_PURPOSE (friends) != friend_type) - friends = TREE_CHAIN (friends); - if (friends) - { - if (friend_type) - warning ("method `%s::%s' is already a friend of class", - TYPE_NAME_STRING (friend_type), - IDENTIFIER_POINTER (name)); - else - warning ("function `%s' is already a friend of class `%s'", - IDENTIFIER_POINTER (name), - IDENTIFIER_POINTER (DECL_NAME (typedecl))); - } - else - TREE_VALUE (list) = tree_cons (friend_type, NULL_TREE, - TREE_VALUE (list)); - return; - } - list = TREE_CHAIN (list); - } - DECL_FRIENDLIST (typedecl) - = tree_cons (name, - build_tree_list (friend_type, NULL_TREE), - DECL_FRIENDLIST (typedecl)); - if (! strncmp (IDENTIFIER_POINTER (name), - IDENTIFIER_POINTER (ansi_opname[(int) MODIFY_EXPR]), - strlen (IDENTIFIER_POINTER (ansi_opname[(int) MODIFY_EXPR])))) - { - TYPE_HAS_ASSIGNMENT (TREE_TYPE (typedecl)) = 1; - sorry ("declaring \"friend operator =\" will not find \"operator = (X&)\" if it exists"); - } -} - -/* Make FRIEND_TYPE a friend class to TYPE. If FRIEND_TYPE has already - been defined, we make all of its member functions friends of - TYPE. If not, we make it a pending friend, which can later be added - when its definition is seen. If a type is defined, then its TYPE_DECL's - DECL_UNDEFINED_FRIENDS contains a (possibly empty) list of friend - classes that are not defined. If a type has not yet been defined, - then the DECL_WAITING_FRIENDS contains a list of types - waiting to make it their friend. Note that these two can both - be in use at the same time! */ - -void -make_friend_class (type, friend_type) - tree type, friend_type; -{ - tree classes; - int is_template_friend; - - if (IS_SIGNATURE (type)) - { - error ("`friend' declaration in signature definition"); - return; - } - if (IS_SIGNATURE (friend_type) || ! IS_AGGR_TYPE (friend_type)) - { - cp_error ("invalid type `%T' declared `friend'", friend_type); - return; - } - - if (CLASSTYPE_TEMPLATE_SPECIALIZATION (friend_type) - && uses_template_parms (friend_type)) - { - /* [temp.friend] - - Friend declarations shall not declare partial - specializations. */ - cp_error ("partial specialization `%T' declared `friend'", - friend_type); - return; - } - - if (processing_template_decl > template_class_depth (type)) - /* If the TYPE is a template then it makes sense for it to be - friends with itself; this means that each instantiation is - friends with all other instantiations. */ - is_template_friend = 1; - else if (same_type_p (type, friend_type)) - { - pedwarn ("class `%s' is implicitly friends with itself", - TYPE_NAME_STRING (type)); - return; - } - else - is_template_friend = 0; - - GNU_xref_hier (type, friend_type, 0, 0, 1); - - if (is_template_friend) - friend_type = CLASSTYPE_TI_TEMPLATE (friend_type); - - classes = CLASSTYPE_FRIEND_CLASSES (type); - while (classes - /* Stop if we find the same type on the list. */ - && !(TREE_CODE (TREE_VALUE (classes)) == TEMPLATE_DECL ? - friend_type == TREE_VALUE (classes) : - same_type_p (TREE_VALUE (classes), friend_type))) - classes = TREE_CHAIN (classes); - if (classes) - cp_warning ("`%T' is already a friend of `%T'", - TREE_VALUE (classes), type); - else - { - CLASSTYPE_FRIEND_CLASSES (type) - = tree_cons (NULL_TREE, friend_type, CLASSTYPE_FRIEND_CLASSES (type)); - } -} - -/* Main friend processor. This is large, and for modularity purposes, - has been removed from grokdeclarator. It returns `void_type_node' - to indicate that something happened, though a FIELD_DECL is - not returned. - - CTYPE is the class this friend belongs to. - - DECLARATOR is the name of the friend. - - DECL is the FUNCTION_DECL that the friend is. - - In case we are parsing a friend which is part of an inline - definition, we will need to store PARM_DECL chain that comes - with it into the DECL_ARGUMENTS slot of the FUNCTION_DECL. - - FLAGS is just used for `grokclassfn'. - - QUALS say what special qualifies should apply to the object - pointed to by `this'. */ - -tree -do_friend (ctype, declarator, decl, parmdecls, flags, quals, funcdef_flag) - tree ctype, declarator, decl, parmdecls; - enum overload_flags flags; - tree quals; - int funcdef_flag; -{ - int is_friend_template = 0; - - /* Every decl that gets here is a friend of something. */ - DECL_FRIEND_P (decl) = 1; - - if (TREE_CODE (declarator) == TEMPLATE_ID_EXPR) - { - declarator = TREE_OPERAND (declarator, 0); - if (TREE_CODE (declarator) == LOOKUP_EXPR) - declarator = TREE_OPERAND (declarator, 0); - if (is_overloaded_fn (declarator)) - declarator = DECL_NAME (get_first_fn (declarator)); - } - - if (TREE_CODE (decl) == FUNCTION_DECL) - is_friend_template = PROCESSING_REAL_TEMPLATE_DECL_P (); - - if (ctype) - { - tree cname = TYPE_NAME (ctype); - if (TREE_CODE (cname) == TYPE_DECL) - cname = DECL_NAME (cname); - - /* A method friend. */ - if (TREE_CODE (decl) == FUNCTION_DECL) - { - if (flags == NO_SPECIAL && ctype && declarator == cname) - DECL_CONSTRUCTOR_P (decl) = 1; - - /* This will set up DECL_ARGUMENTS for us. */ - grokclassfn (ctype, decl, flags, quals); - - if (is_friend_template) - decl = DECL_TI_TEMPLATE (push_template_decl (decl)); - else if (template_class_depth (current_class_type)) - decl = push_template_decl_real (decl, /*is_friend=*/1); - - /* We can't do lookup in a type that involves template - parameters. Instead, we rely on tsubst_friend_function - to check the validity of the declaration later. */ - if (uses_template_parms (ctype)) - add_friend (current_class_type, decl); - /* A nested class may declare a member of an enclosing class - to be a friend, so we do lookup here even if CTYPE is in - the process of being defined. */ - else if (TYPE_SIZE (ctype) != 0 || TYPE_BEING_DEFINED (ctype)) - { - decl = check_classfn (ctype, decl); - - if (decl) - add_friend (current_class_type, decl); - } - else - cp_error ("member `%D' declared as friend before type `%T' defined", - decl, ctype); - } - else - { - /* Possibly a bunch of method friends. */ - - /* Get the class they belong to. */ - tree ctype = IDENTIFIER_TYPE_VALUE (cname); - tree fields = lookup_fnfields (TYPE_BINFO (ctype), declarator, 0); - - if (fields) - add_friends (current_class_type, declarator, ctype); - else - cp_error ("method `%D' is not a member of class `%T'", - declarator, ctype); - decl = void_type_node; - } - } - /* A global friend. - @@ or possibly a friend from a base class ?!? */ - else if (TREE_CODE (decl) == FUNCTION_DECL) - { - /* Friends must all go through the overload machinery, - even though they may not technically be overloaded. - - Note that because classes all wind up being top-level - in their scope, their friend wind up in top-level scope as well. */ - DECL_ARGUMENTS (decl) = parmdecls; - if (funcdef_flag) - DECL_CLASS_CONTEXT (decl) = current_class_type; - - if (! DECL_USE_TEMPLATE (decl)) - { - /* We can call pushdecl here, because the TREE_CHAIN of this - FUNCTION_DECL is not needed for other purposes. Don't do - this for a template instantiation. However, we don't - call pushdecl() for a friend function of a template - class, since in general, such a declaration depends on - template parameters. Instead, we call pushdecl when the - class is instantiated. */ - if (!is_friend_template - && template_class_depth (current_class_type) == 0) - decl = pushdecl (decl); - else - decl = push_template_decl_real (decl, /*is_friend=*/1); - - if (warn_nontemplate_friend - && ! funcdef_flag && ! flag_guiding_decls && ! is_friend_template - && current_template_parms && uses_template_parms (decl)) - { - static int explained; - cp_warning ("friend declaration `%#D'", decl); - warning (" declares a non-template function"); - if (! explained) - { - warning (" (if this is not what you intended, make sure"); - warning (" the function template has already been declared,"); - warning (" and add <> after the function name here)"); - warning (" -Wno-non-template-friend disables this warning."); - explained = 1; - } - } - } - - make_decl_rtl (decl, NULL_PTR, 1); - add_friend (current_class_type, - is_friend_template ? DECL_TI_TEMPLATE (decl) : decl); - DECL_FRIEND_P (decl) = 1; - } - else - { - /* @@ Should be able to ingest later definitions of this function - before use. */ - tree decl = lookup_name_nonclass (declarator); - if (decl == NULL_TREE) - { - cp_warning ("implicitly declaring `%T' as struct", declarator); - decl = xref_tag (record_type_node, declarator, 1); - decl = TYPE_MAIN_DECL (decl); - } - - /* Allow abbreviated declarations of overloaded functions, - but not if those functions are really class names. */ - if (TREE_CODE (decl) == TREE_LIST && TREE_TYPE (TREE_PURPOSE (decl))) - { - cp_warning ("`friend %T' archaic, use `friend class %T' instead", - declarator, declarator); - decl = TREE_TYPE (TREE_PURPOSE (decl)); - } - - if (TREE_CODE (decl) == TREE_LIST) - add_friends (current_class_type, TREE_PURPOSE (decl), NULL_TREE); - else - make_friend_class (current_class_type, TREE_TYPE (decl)); - decl = void_type_node; - } - return decl; -} diff --git a/gcc/cp/g++.1 b/gcc/cp/g++.1 deleted file mode 100755 index 5101d5f..0000000 --- a/gcc/cp/g++.1 +++ /dev/null @@ -1,642 +0,0 @@ -.\" Copyright (c) 1991, 1992 Free Software Foundation -*-Text-*- -.\" See section COPYING for conditions for redistribution -.\" FIXME: no info here on predefines. Should there be? extra for C++... -.TH G++ 1 "30apr1993" "GNU Tools" "GNU Tools" -.de BP -.sp -.ti \-.2i -\(** -.. -.SH NAME -g++ \- GNU project C++ Compiler -.SH SYNOPSIS -.RB g++ " [" \c -.IR option " | " filename " ].\|.\|. -.SH DESCRIPTION -The C and C++ compilers are integrated; -.B g++ -is a script to call -.B gcc with options to recognize C++. -.B gcc -processes input files -through one or more of four stages: preprocessing, compilation, -assembly, and linking. This man page contains full descriptions for -.I only -C++ specific aspects of the compiler, though it also contains -summaries of some general-purpose options. For a fuller explanation -of the compiler, see -.BR gcc ( 1 ). - -C++ source files use one of the suffixes `\|\c -.B .C\c -\&\|', `\|\c -.B .cc\c -\&\|', `\|\c -.B .cxx\c -\&\|', `\|\c -.B .cpp\c -\&\|', or `\|\c -.B .c++\c -\&\|'; preprocessed C++ files use the suffix `\|\c -.B .ii\c -\&\|'. -.SH OPTIONS -There are many command-line options, including options to control -details of optimization, warnings, and code generation, which are -common to both -.B gcc -and -.B g++\c -\&. For full information on all options, see -.BR gcc ( 1 ). - -Options must be separate: `\|\c -.B \-dr\c -\&\|' is quite different from `\|\c -.B \-d \-r -\&\|'. - -Most `\|\c -.B \-f\c -\&\|' and `\|\c -.B \-W\c -\&\|' options have two contrary forms: -.BI \-f name -and -.BI \-fno\- name\c -\& (or -.BI \-W name -and -.BI \-Wno\- name\c -\&). Only the non-default forms are shown here. - -.TP -.B \-c -Compile or assemble the source files, but do not link. The compiler -output is an object file corresponding to each source file. -.TP -.BI \-D macro -Define macro \c -.I macro\c -\& with the string `\|\c -.B 1\c -\&\|' as its definition. -.TP -.BI \-D macro = defn -Define macro \c -.I macro\c -\& as \c -.I defn\c -\&. -.TP -.B \-E -Stop after the preprocessing stage; do not run the compiler proper. The -output is preprocessed source code, which is sent to the -standard output. -.TP -.B \-fall\-virtual -Treat all possible member functions as virtual, implicitly. All -member functions (except for constructor functions and -.B new -or -.B delete -member operators) are treated as virtual functions of the class where -they appear. - -This does not mean that all calls to these member functions will be -made through the internal table of virtual functions. Under some -circumstances, the compiler can determine that a call to a given -virtual function can be made directly; in these cases the calls are -direct in any case. -.TP -.B \-fdollars\-in\-identifiers -Permit the use of `\|\c -.B $\c -\&\|' in identifiers. -Traditional C allowed the character `\|\c -.B $\c -\&\|' to form part of identifiers; by default, GNU C also -allows this. However, ANSI C forbids `\|\c -.B $\c -\&\|' in identifiers, and GNU C++ also forbids it by default on most -platforms (though on some platforms it's enabled by default for GNU -C++ as well). -.TP -.B \-felide\-constructors -Use this option to instruct the compiler to be smarter about when it can -elide constructors. Without this flag, GNU C++ and cfront both -generate effectively the same code for: -.sp -.br -A\ foo\ (); -.br -A\ x\ (foo\ ());\ \ \ //\ x\ initialized\ by\ `foo\ ()',\ no\ ctor\ called -.br -A\ y\ =\ foo\ ();\ \ \ //\ call\ to\ `foo\ ()'\ heads\ to\ temporary, -.br -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ //\ y\ is\ initialized\ from\ the\ temporary. -.br -.sp -Note the difference! With this flag, GNU C++ initializes `\|\c -.B y\c -\&\|' directly -from the call to -.B foo () -without going through a temporary. -.TP -.B \-fenum\-int\-equiv -Normally GNU C++ allows conversion of -.B enum -to -.B int\c -\&, but not the other way around. Use this option if you want GNU C++ -to allow conversion of -.B int -to -.B enum -as well. -.TP -.B \-fexternal\-templates -Produce smaller code for template declarations, by generating only a -single copy of each template function where it is defined. -To use this option successfully, you must also mark all files that -use templates with either `\|\c -.B #pragma implementation\c -\&\|' (the definition) or -`\|\c -.B #pragma interface\c -\&\|' (declarations). - -When your code is compiled with `\|\c -.B \-fexternal\-templates\c -\&\|', all -template instantiations are external. You must arrange for all -necessary instantiations to appear in the implementation file; you can -do this with a \c -.B typedef\c -\& that references each instantiation needed. -Conversely, when you compile using the default option -`\|\c -.B \-fno\-external\-templates\c -\&\|', all template instantiations are -explicitly internal. -.TP -.B \-fno\-gnu\-linker -Do not output global initializations (such as C++ constructors and -destructors) in the form used by the GNU linker (on systems where the GNU -linker is the standard method of handling them). Use this option when -you want to use a non-GNU linker, which also requires using the -.B collect2 -program to make sure the system linker includes -constructors and destructors. (\c -.B collect2 -is included in the GNU CC distribution.) For systems which -.I must -use -.B collect2\c -\&, the compiler driver -.B gcc -is configured to do this automatically. -.TP -.B \-fmemoize\-lookups -.TP -.B \-fsave\-memoized -These flags are used to get the compiler to compile programs faster -using heuristics. They are not on by default since they are only effective -about half the time. The other half of the time programs compile more -slowly (and take more memory). - -The first time the compiler must build a call to a member function (or -reference to a data member), it must (1) determine whether the class -implements member functions of that name; (2) resolve which member -function to call (which involves figuring out what sorts of type -conversions need to be made); and (3) check the visibility of the member -function to the caller. All of this adds up to slower compilation. -Normally, the second time a call is made to that member function (or -reference to that data member), it must go through the same lengthy -process again. This means that code like this -.sp -.br -\ \ cout\ <<\ "This\ "\ <<\ p\ <<\ "\ has\ "\ <<\ n\ <<\ "\ legs.\en"; -.br -.sp -makes six passes through all three steps. By using a software cache, -a ``hit'' significantly reduces this cost. Unfortunately, using the -cache introduces another layer of mechanisms which must be implemented, -and so incurs its own overhead. `\|\c -.B \-fmemoize\-lookups\c -\&\|' enables -the software cache. - -Because access privileges (visibility) to members and member functions -may differ from one function context to the next, -.B g++ -may need to flush the cache. With the `\|\c -.B \-fmemoize\-lookups\c -\&\|' flag, the cache is flushed after every -function that is compiled. The `\|\c -\-fsave\-memoized\c -\&\|' flag enables the same software cache, but when the compiler -determines that the context of the last function compiled would yield -the same access privileges of the next function to compile, it -preserves the cache. -This is most helpful when defining many member functions for the same -class: with the exception of member functions which are friends of -other classes, each member function has exactly the same access -privileges as every other, and the cache need not be flushed. -.TP -.B \-fno\-default\-inline -Do not make member functions inline by default merely because they are -defined inside the class scope. Otherwise, when you specify -.B \-O\c -\&, member functions defined inside class scope are compiled -inline by default; i.e., you don't need to add `\|\c -.B inline\c -\&\|' in front of -the member function name. -.TP -.B \-fno\-strict\-prototype -Consider the declaration \c -.B int foo ();\c -\&. In C++, this means that the -function \c -.B foo\c -\& takes no arguments. In ANSI C, this is declared -.B int foo(void);\c -\&. With the flag `\|\c -.B \-fno\-strict\-prototype\c -\&\|', -declaring functions with no arguments is equivalent to declaring its -argument list to be untyped, i.e., \c -.B int foo ();\c -\& is equivalent to -saying \c -.B int foo (...);\c -\&. -.TP -.B \-fnonnull\-objects -Normally, GNU C++ makes conservative assumptions about objects reached -through references. For example, the compiler must check that `\|\c -.B a\c -\&\|' is not null in code like the following: -.br -\ \ \ \ obj\ &a\ =\ g\ (); -.br -\ \ \ \ a.f\ (2); -.br -Checking that references of this sort have non-null values requires -extra code, however, and it is unnecessary for many programs. You can -use `\|\c -.B \-fnonnull\-objects\c -\&\|' to omit the checks for null, if your program doesn't require the -default checking. -.TP -.B \-fhandle\-signatures -.TP -.B \-fno\-handle\-signatures -These options control the recognition of the \c -.B signature\c -\& and \c -.B sigof\c -\& constructs for specifying abstract types. By default, these -constructs are not recognized. -.TP -.B \-fthis\-is\-variable -The incorporation of user-defined free store management into C++ has -made assignment to \c -.B this\c -\& an anachronism. Therefore, by default GNU -C++ treats the type of \c -.B this\c -\& in a member function of \c -.B class X\c -\& -to be \c -.B X *const\c -\&. In other words, it is illegal to assign to -\c -.B this\c -\& within a class member function. However, for backwards -compatibility, you can invoke the old behavior by using -\&`\|\c -.B \-fthis\-is\-variable\c -\&\|'. -.TP -.B \-g -Produce debugging information in the operating system's native format -(for DBX or SDB or DWARF). GDB also can work with this debugging -information. On most systems that use DBX format, `\|\c -.B \-g\c -\&\|' enables use -of extra debugging information that only GDB can use. - -Unlike most other C compilers, GNU CC allows you to use `\|\c -.B \-g\c -\&\|' with -`\|\c -.B \-O\c -\&\|'. The shortcuts taken by optimized code may occasionally -produce surprising results: some variables you declared may not exist -at all; flow of control may briefly move where you did not expect it; -some statements may not be executed because they compute constant -results or their values were already at hand; some statements may -execute in different places because they were moved out of loops. - -Nevertheless it proves possible to debug optimized output. This makes -it reasonable to use the optimizer for programs that might have bugs. -.TP -.BI "\-I" "dir"\c -\& -Append directory \c -.I dir\c -\& to the list of directories searched for include files. -.TP -.BI "\-L" "dir"\c -\& -Add directory \c -.I dir\c -\& to the list of directories to be searched -for `\|\c -.B \-l\c -\&\|'. -.TP -.BI \-l library\c -\& -Use the library named \c -.I library\c -\& when linking. (C++ programs often require `\|\c -\-lg++\c -\&\|' for successful linking.) -.TP -.B \-nostdinc -Do not search the standard system directories for header files. Only -the directories you have specified with -.B \-I -options (and the current directory, if appropriate) are searched. -.TP -.B \-nostdinc++ -Do not search for header files in the standard directories specific to -C++, but do still search the other standard directories. (This option -is used when building libg++.) -.TP -.B \-O -Optimize. Optimizing compilation takes somewhat more time, and a lot -more memory for a large function. -.TP -.BI "\-o " file\c -\& -Place output in file \c -.I file\c -\&. -.TP -.B \-S -Stop after the stage of compilation proper; do not assemble. The output -is an assembler code file for each non-assembler input -file specified. -.TP -.B \-traditional -Attempt to support some aspects of traditional C compilers. - -Specifically, for both C and C++ programs: -.TP -\ \ \ \(bu -In the preprocessor, comments convert to nothing at all, rather than -to a space. This allows traditional token concatenation. -.TP -\ \ \ \(bu -In the preprocessor, macro arguments are recognized within string -constants in a macro definition (and their values are stringified, -though without additional quote marks, when they appear in such a -context). The preprocessor always considers a string constant to end -at a newline. -.TP -\ \ \ \(bu -The preprocessor does not predefine the macro \c -.B __STDC__\c -\& when you use -`\|\c -.B \-traditional\c -\&\|', but still predefines\c -.B __GNUC__\c -\& (since the GNU extensions indicated by -.B __GNUC__\c -\& are not affected by -`\|\c -.B \-traditional\c -\&\|'). If you need to write header files that work -differently depending on whether `\|\c -.B \-traditional\c -\&\|' is in use, by -testing both of these predefined macros you can distinguish four -situations: GNU C, traditional GNU C, other ANSI C compilers, and -other old C compilers. -.PP -.TP -\ \ \ \(bu -String ``constants'' are not necessarily constant; they are stored in -writable space, and identical looking constants are allocated -separately. - -For C++ programs only (not C), `\|\c -.B \-traditional\c -\&\|' has one additional effect: assignment to -.B this -is permitted. This is the same as the effect of `\|\c -.B \-fthis\-is\-variable\c -\&\|'. -.TP -.BI \-U macro -Undefine macro \c -.I macro\c -\&. -.TP -.B \-Wall -Issue warnings for conditions which pertain to usage that we recommend -avoiding and that we believe is easy to avoid, even in conjunction -with macros. -.TP -.B \-Wenum\-clash -Warn when converting between different enumeration types. -.TP -.B \-Woverloaded\-virtual -In a derived class, the definitions of virtual functions must match -the type signature of a virtual function declared in the base class. -Use this option to request warnings when a derived class declares a -function that may be an erroneous attempt to define a virtual -function: that is, warn when a function with the same name as a -virtual function in the base class, but with a type signature that -doesn't match any virtual functions from the base class. -.TP -.B \-Wtemplate\-debugging -When using templates in a C++ program, warn if debugging is not yet -fully available. -.TP -.B \-w -Inhibit all warning messages. -.TP -.BI +e N -Control how virtual function definitions are used, in a fashion -compatible with -.B cfront -1.x. -.PP - -.SH PRAGMAS -Two `\|\c -.B #pragma\c -\&\|' directives are supported for GNU C++, to permit using the same -header file for two purposes: as a definition of interfaces to a given -object class, and as the full definition of the contents of that object class. -.TP -.B #pragma interface -Use this directive in header files that define object classes, to save -space in most of the object files that use those classes. Normally, -local copies of certain information (backup copies of inline member -functions, debugging information, and the internal tables that -implement virtual functions) must be kept in each object file that -includes class definitions. You can use this pragma to avoid such -duplication. When a header file containing `\|\c -.B #pragma interface\c -\&\|' is included in a compilation, this auxiliary information -will not be generated (unless the main input source file itself uses -`\|\c -.B #pragma implementation\c -\&\|'). Instead, the object files will contain references to be -resolved at link time. -.tr !" -.TP -.B #pragma implementation -.TP -.BI "#pragma implementation !" objects .h! -Use this pragma in a main input file, when you want full output from -included header files to be generated (and made globally visible). -The included header file, in turn, should use `\|\c -.B #pragma interface\c -\&\|'. -Backup copies of inline member functions, debugging information, and -the internal tables used to implement virtual functions are all -generated in implementation files. - -If you use `\|\c -.B #pragma implementation\c -\&\|' with no argument, it applies to an include file with the same -basename as your source file; for example, in `\|\c -.B allclass.cc\c -\&\|', `\|\c -.B #pragma implementation\c -\&\|' by itself is equivalent to `\|\c -.B -#pragma implementation "allclass.h"\c -\&\|'. Use the string argument if you want a single implementation -file to include code from multiple header files. - -There is no way to split up the contents of a single header file into -multiple implementation files. -.SH FILES -.ta \w'LIBDIR/g++\-include 'u -file.h C header (preprocessor) file -.br -file.i preprocessed C source file -.br -file.C C++ source file -.br -file.cc C++ source file -.br -file.cxx C++ source file -.br -file.s assembly language file -.br -file.o object file -.br -a.out link edited output -.br -\fITMPDIR\fR/cc\(** temporary files -.br -\fILIBDIR\fR/cpp preprocessor -.br -\fILIBDIR\fR/cc1plus compiler -.br -\fILIBDIR\fR/collect linker front end needed on some machines -.br -\fILIBDIR\fR/libgcc.a GCC subroutine library -.br -/lib/crt[01n].o start-up routine -.br -\fILIBDIR\fR/ccrt0 additional start-up routine for C++ -.br -/lib/libc.a standard C library, see -.IR intro (3) -.br -/usr/include standard directory for -.B #include -files -.br -\fILIBDIR\fR/include standard gcc directory for -.B #include -files -.br -\fILIBDIR\fR/g++\-include additional g++ directory for -.B #include -.sp -.I LIBDIR -is usually -.B /usr/local/lib/\c -.IR machine / version . -.br -.I TMPDIR -comes from the environment variable -.B TMPDIR -(default -.B /usr/tmp -if available, else -.B /tmp\c -\&). -.SH "SEE ALSO" -gcc(1), cpp(1), as(1), ld(1), gdb(1), adb(1), dbx(1), sdb(1). -.br -.RB "`\|" gcc "\|', `\|" cpp \|', -.RB `\| as \|', `\| ld \|', -and -.RB `\| gdb \|' -entries in -.B info\c -\&. -.br -.I -Using and Porting GNU CC (for version 2.0)\c -, Richard M. Stallman; -.I -The C Preprocessor\c -, Richard M. Stallman; -.I -Debugging with GDB: the GNU Source-Level Debugger\c -, Richard M. Stallman and Roland H. Pesch; -.I -Using as: the GNU Assembler\c -, Dean Elsner, Jay Fenlason & friends; -.I -gld: the GNU linker\c -, Steve Chamberlain and Roland Pesch. - -.SH BUGS -For instructions on how to report bugs, see the GCC manual. - -.SH COPYING -Copyright (c) 1991, 1992, 1993 Free Software Foundation, Inc. -.PP -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. -.PP -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. -.PP -Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be included in -translations approved by the Free Software Foundation instead of in -the original English. -.SH AUTHORS -See the GNU CC Manual for the contributors to GNU CC. diff --git a/gcc/cp/g++FAQ.texi b/gcc/cp/g++FAQ.texi deleted file mode 100755 index 3cbec50..0000000 --- a/gcc/cp/g++FAQ.texi +++ /dev/null @@ -1,2423 +0,0 @@ -\input texinfo.tex @c -*-texinfo-*- -@c %**start of header -@setfilename g++FAQ.info -@settitle Frequently asked questions about the GNU C++ compiler -@setchapternewpage off -@c version: %W% %G% -@c %**end of header - -@iftex -@finalout -@end iftex -@titlepage -@title G++ FAQ -@subtitle Frequently asked questions about the GNU C++ compiler -@subtitle June 8, 1998 -@sp 1 -@author Joe Buck -@page -@end titlepage - -@ifinfo -@node Top, basics, (dir), (dir) -@top -@unnumbered FAQ for g++ and libg++, by Joe Buck (jbuck@@synopsys.com) -@end ifinfo - -@cindex FAQ for g++, latest version -@cindex Archive site for FAQ lists -@cindex rtfm.mit.edu -@cindex Joe Buck -@cindex FAQ for C++ - -This is a list of frequently asked questions (FAQ) for g++ users; thanks to -all those who sent suggestions for improvements. Thanks to Marcus Speh -for doing the index. A hypertext version is available on the World Wide -Web at @file{http://www.cygnus.com/misc/g++FAQ_toc.html}. - -Please send updates and corrections to the FAQ to -@code{jbuck@@synopsys.com}. Please do @emph{not} use me as a resource -to get your questions answered; that's what @file{gnu.g++.help} is for and I -don't have the time to support the net's use of g++. If you ignore this -request your message to me may be deleted without a reply. Sorry. - -Many FAQs, including this one, are available on the archive site -``rtfm.mit.edu''; see @* -@file{ftp://rtfm.mit.edu/pub/usenet/news.answers}. -This FAQ may be found in the subdirectory g++-FAQ. - -@cindex Marshall Cline -@cindex comp.lang.c++ -@cindex C++ FAQ -This FAQ is intended to supplement, not replace, Marshall Cline's -excellent FAQ for the C++ language and for the newsgroup -@file{comp.lang.c++}. Especially if g++ is the first C++ -compiler you've ever used, the question ``How do I do with g++?'' -is probably really ``How do I do in C++?''. -You can find this FAQ at -@file{ftp://rtfm.mit.edu/pub/usenet/comp.lang.c++}, -or in HTML form at @file{http://www.cerfnet.com/~mpcline/On-Line-C++-FAQs/}. - -@menu -* basics:: What is g++? How do I get it? -* egcs and 2.8.x:: The next generation(s) of g++ -* installation:: How to install, installation problems -* evolution:: The Evolution of g++ -* User Problems:: Commonly reported problems and bugs -* legalities:: Lawyer stuff, GPL, LGPL, etc. -* index:: Index of terms - - --- The Detailed Node Listing --- - -The basics: what is g++? - -* latest versions:: What are the latest versions of g++ and libraries? -* g++ for Unix:: How do I get g++ for Unix? -* getting-egcs:: How do I get egcs? -* g++ for HP:: -* g++ for Solaris 2.x:: -* g++ for other platforms:: -* 1.x vs 2.x versions:: - -The Next Generation(s) of g++ - -* new-in-2.8.x:: What's new in gcc 2.8.x? -* egcs-intro:: What is egcs? -* egcs-whats-new:: What's new in egcs vs 2.7.2? -* egcs-bug-fixes:: What was fixed in the latest egcs releases? -* egcs-linux:: If I install on Linux, will it overwrite my libraries? -* egcs-run-both:: How can I run both egcs and an FSF release? -* egcs-vs-2.8.x:: How will egcs affect 2.8.x? -* egcs-robustness:: How robust is egcs? - -Installation Issues and Problems - -* gcc-2 + g++-1:: -* what else do I need?:: -* use GNU linker?:: -* Use GNU assembler?:: -* shared libraries:: -* repository:: -* repo bugs:: -* Use GNU C library?:: -* Global constructor problems:: -* Strange assembler errors:: -* Other problems building libg++:: -* More size_t problems:: -* Rebuild libg++?:: -* co-existing versions:: -* Installing on Linux:: -* Linux Slackware 3.0:: - -The Evolution of g++ - -* version 2.7.x:: What's changed in 2.7.x from earlier versions -* libstdc++:: - -User Problems - -* missing virtual table:: -* for scope:: -* const constructor:: -* unused parameter warnings:: -* jump crosses initialization:: -* Demangler:: -* static data members:: -* internal compiler error:: -* bug reports:: -* porting to g++:: -* name mangling:: -* problems linking with other libraries:: -* documentation:: -* templates:: -* undefined templates:: -* redundant templates:: -* Standard Template Library:: -* STL and string:: -* exceptions:: -* namespaces:: -* agreement with standards:: -* compiling standard libraries:: -* debugging on SVR4 systems:: -* debugging problems on Solaris:: -* X11 conflicts with libg++:: -* assignment to streams:: -@end menu - -@node basics, egcs and 2.8.x, Top, Top -@chapter The basics: what is g++? - -@cindex Free Software Foundation -@cindex GNU Public License -@cindex GPL - -g++ is the traditional nickname of GNU C++, a freely redistributable -C++ compiler produced by the Free Software Foundation plus dozens of -skilled volunteers. I say ``traditional nickname'' because the GNU -compiler suite, gcc, bundles together compilers for C, Objective-C, -and C++ in one package. - -While the source code to gcc/g++ can be downloaded for free, -it is not public domain, but is protected by the GNU Public License, -or GPL (@pxref{legalities}). - -@menu -* latest versions:: What is the latest version of gcc/g++/libg++? -* g++ for Unix:: How do I get a copy of g++ for Unix? -* getting-egcs:: How do I get egcs? -* g++ for HP:: Getting g++ for the HP precision architecture -* g++ for Solaris 2.x:: Getting g++ for Solaris -* g++ for other platforms:: -* 1.x vs 2.x versions:: -@end menu - -@node latest versions, g++ for Unix, basics, basics -@section What is the latest version of gcc, g++, and libg++? - -@cindex egcs release - -The newest release from the egcs project (on the Web: -@file{http://www.cygnus.com/egcs/}) is egcs-1.0.3, released May 15, -1998. - -@cindex gcc/g++, version date -The current version of gcc/g++ is 2.8.1, released March 4, 1998. -This release fixes some bugs in the 2.8.x release from January. -It is a huge improvement over the 2.7.x releases. - -libg++ has now been deprecated (that is, it is no longer really -supported), so gcc2.8.1 users need to grab libstdc++-2.8.1 from -their favorite GNU site (egcs users don't need to get this separately -as it is bundled with egcs). However, there is an 'add-on' libg++ 2.8.1 -mini-release. If you want to use it, you need to combine it with -libstdc++ 2.8.1. - -I would strongly recommend that anyone using a g++ version earlier -than 2.7.2 should upgrade if at all possible (@pxref{version 2.7.x}). -Folks who need modern C++ features should upgrade to 2.8.1 or egcs. - -For some non-Unix platforms, the latest port of gcc may be an earlier -version (2.7.2, say). You'll need to use a version of libg++ that -has the same first two digits as the compiler version, e.g. use libg++ -2.7.x (for the latest x you can find) with gcc version 2.7.2.1. - -From version 2.8.0 on, you don't need libg++, you only need libstdc++ -(again, the latest version with the same two leading digits as the -version of g++ you use). - -The latest "1.x" version of gcc is 1.42, and the latest "1.x" version of -g++ is 1.42.0. -While gcc 1.42 is quite usable for C programs, g++ 1.x is only of -historical interest (since the C++ language has changed so much). - -@node g++ for Unix, getting-egcs, latest versions, basics -@section How do I get a copy of g++ for Unix? - -First, you may already have it if you have gcc for your platform; -g++ and gcc are combined now (as of gcc version 2.0). -@cindex GNU gcc, version -@cindex GNU g++ and gcc - -You can get g++ from a friend who has a copy, by anonymous FTP or -UUCP, or by ordering a tape or CD-ROM from the Free Software -Foundation. -@cindex g++, ordering -@cindex g++, getting a copy - -The Free Software Foundation is a nonprofit organization that -distributes software and manuals to raise funds for more GNU -development. Getting your copy from the FSF contributes directly to -paying staff to develop GNU software. CD-ROMs cost $400 if an -organization is buying, or $100 if an individual is buying. Tapes -cost around $200 depending on media type. I recommend asking for -version 2, not version 1, of g++. -@cindex FSF [Free Software Foundation] -@cindex GNU [GNU's not unix] - -For more information about ordering from the FSF, contact -gnu@@prep.ai.mit.edu, phone (617) 542-5942 or anonymous ftp file -@file{ftp://prep.ai.mit.edu/pub/gnu/GNUinfo/ORDERS} (you can -also use one of the sites listed below if you can't get into ``prep''). - -@cindex FSF, contact - -Here is a list of anonymous FTP archive sites for GNU software. -If no directory is given, look in @file{/pub/gnu}. - -@cindex GNUware, anonymous FTP sites - -@example -ASIA: ftp.cs.titech.ac.jp, tron.um.u-tokyo.ac.jp:/pub/GNU/prep -cair-archive.kaist.ac.kr, ftp.nectec.or.th:/pub/mirrors/gnu - -AUSTRALIA: archie.au:/gnu (archie.oz or archie.oz.au for ACSnet) - -AFRICA: ftp.sun.ac.za - -MIDDLE-EAST: ftp.technion.ac.il:/pub/unsupported/gnu - -EUROPE: irisa.irisa.fr, ftp.univ-lyon1.fr, -ftp.mcc.ac.uk, unix.hensa.ac.uk:/mirrors/uunet/systems/gnu, -src.doc.ic.ac.uk:/gnu, ftp.ieunet.ie, ftp.eunet.ch, -nic.switch.ch:/mirror/gnu, ftp.informatik.rwth-aachen.de, -ftp.informatik.tu-muenchen.de, ftp.win.tue.nl, ftp.nl.net, -ftp.etsimo.uniovi.es, ftp.funet.fi, ftp.denet.dk, -ftp.stacken.kth.se, isy.liu.se, ftp.luth.se:/pub/unix/gnu, -ftp.sunet.se, archive.eu.net - -SOUTH AMERICA: ftp.inf.utfsm.cl, ftp.unicamp.br - -WESTERN CANADA: ftp.cs.ubc.ca:/mirror2/gnu - -USA: wuarchive.wustl.edu:/systems/gnu, labrea.stanford.edu, -ftp.digex.net, ftp.kpc.com:/pub/mirror/gnu, f.ms.uky.edu:/pub3/gnu, -jaguar.utah.edu:/gnustuff, ftp.hawaii.edu:/mirrors/gnu, -uiarchive.cso.uiuc.edu, ftp.cs.columbia.edu:/archives/gnu/prep, -gatekeeper.dec.com:/pub/GNU, ftp.uu.net:/systems/gnu -@end example - -The ``official site'' is prep.ai.mit.edu, but your transfer will probably -go faster if you use one of the above machines. - -@cindex gzip -Most GNU utilities are compressed with ``gzip'', the GNU compression -utility. All GNU archive sites should have a copy of this program, -which you will need to uncompress the distributions. - -@cindex libstdc++ -Don't forget to retrieve libstdc++ as well! - -@node getting-egcs, g++ for HP, g++ for Unix, basics -@section How do I get egcs? - -See @xref{egcs-intro} to find out what egcs is. - -You can obtain egcs either by FTP or with a Web browser. To do the -latter, start from @file{http://egcs.cygnus.com/}. The master -FTP site is @file{ftp://ftp.cygnus.com/pub/egcs/releases}, however -you'll probably get a faster download if you use a mirror site. -Mirror sites also have egcs snapshots unless otherwise noted. -@itemize @bullet -@item -US (west coast): @file{ftp://go.cygnus.com/pub/ftp.cygnus.com/egcs/} -@item -US (east coast): @file{ftp://ftp.goof.com/pub/pcg/egcs/} -or (for releases only): @file{ftp://cambridge.cygnus.com/pub/egcs/} -@item -US (Arizona): @file{ftp://ftp.ninemoons.com/pub/mirrors/egcs/} -@item -UK: @file{ftp://sunsite.doc.ic.ac.uk/Mirrors/egcs.cygnus.com/pub/egcs/} -@item -Austria: @file{ftp://gd.tuwien.ac.at/gnu/egcs} -@item -France: @file{ftp://ftp.ilog.fr/pub/mirrors/egcs/} or -@file{ftp://ftp.lip6.fr/pub/egcs} -@item -Czech Republic: @file{ftp://sunsite.mff.cuni.cz/pub/GNU/egcs/} -@item -Denmark: @file{ftp://sunsite.auc.dk/pub/egcs/} -@item -Germany @file{ftp://ftp.fu-berlin.de/unix/languages/egcs/} or -@file{ftp://ftp.gwdg.de/pub/cygnus/egcs/} -@item -Poland: @file{ftp://sunsite.icm.edu.pl/pub/programming/egcs/} -@item -Sweden: @file{ftp://ftp.sunet.se/pub/gnu/egcs/} -@item -Brasil (releases only, no snapshots): -@file{ftp://ftp.unicamp.br/pub/gnu/=EXTRA=/cygnus/egcs/} -@item -Portugal: @file{ftp://ftp.lca.uevora.pt/pub/egcs/} -@item -Romania: @file{ftp://ftp.lbi.ro/pub/egcs/} -@item -Australia/NZ (release only): @file{ftp://moshpit.cygnus.com/pub/egcs/} -@end itemize - -@node g++ for HP, g++ for Solaris 2.x, getting-egcs, basics -@section Getting gcc/g++ for the HP Precision Architecture - -@cindex HP Precision Architecture -@cindex Hewlett-Packard -@cindex GNU GAS -@cindex GNU gdb - -If you use the HP Precision Architecture (HP-9000/7xx and HP-9000/8xx) -and you want to use debugging, you'll need to use the GNU assembler, GAS -(version 2.3 or later). If you build from source, you must tell the -configure program that you are using GAS or you won't get debugging -support. A non-standard debug format is used, since until recently HP -considered their debug format a trade secret. Thanks to the work of -lots of good folks both inside and outside HP, the company has seen the -error of its ways and has now released the required information. The -team at the University of Utah that did the gcc port now has code that -understands the native HP format. - -There are binaries for GNU tools in -@file{ftp://jaguar.cs.utah.edu/dist/}, -but these are older versions. - -Jeff Law has left the University of Utah, so the Utah prebuilt -binaries may be discontinued. - -@node g++ for Solaris 2.x, g++ for other platforms, g++ for HP, basics -@section Getting gcc/g++ binaries for Solaris 2.x - -``Sun took the C compiler out of Solaris 2.x. Am I stuck?'' - -@cindex Solaris -@cindex gcc/g++ binaries for Solaris - -You can obtain and install prebuilt binaries of gcc. - - -@cindex Solaris pkgadd utility -The WWW site @file{http://smc.vnet.net/} -contains various -GNU and freeware programs for Solaris 2.5 or 2.6, for either the Sparc -or Intel platforms. These are -packaged to enable easy installation using the Solaris ``pkgadd'' utility. -These include GNU emacs, gcc, gdb, perl, and others. - -You can find also find prebuilt binaries of many GNU tools, including the -compiler, at @file{http://sunsite.unc.edu/pub/solaris/}. - -@node g++ for other platforms, 1.x vs 2.x versions, g++ for Solaris 2.x, basics -@section How do I get a copy of g++ for (some other platform)? - -@cindex Windows NT support -As of gcc-2.7.x, there is Windows NT support in gcc. Some special -utilities are required. See the INSTALL file from the distribution. -If you're interested in GNU tools on Windows NT, see -@file{http://www.cygnus.com/misc/gnu-win32/} on the WWW, or the -anonymous FTP directory -@file{ftp://ftp.cygnus.com/pub/gnu-win32/}. - -@cindex VMS support -@cindex VAX -@cindex VMS, g++/libg++ precompiled - -The standard gcc/g++ distribution includes VMS support for the Vax. -Since the FSF people don't use VMS, it's likely to be somewhat less -solid than the Unix version. Precompiled copies of g++ and libg++ in -VMS-installable form for the Vax are available by FTP from -@file{ftp://mango.rsmas.miami.edu/pub/VMS-gcc/}. - -@cindex OpenVMS/Alpha -Klaus Kaempf (kkaempf@@progis.de) -has done a port to OpenVMS for the Alpha; this is not yet a -part of the official gcc/g++. -The port includes g++ and all libraries from the libg++ distribution. See -@file{http://www.progis.de} for more details. - -@cindex MS-DOS support -@cindex Delorie's gcc/g++ -@cindex DJGPP -@cindex EMX -There are two different versions of gcc/g++ for MS-DOS: EMX and DJGPP. -EMX also works for OS/2 and is described later. -DJGPP is DJ Delorie's port. It can be found on many FTP archive -sites; try -@file{ftp://ftp.coast.net/SimTel/vendors/djgpp/} -or, for a complete list, see -@file{http://www.delorie.com/djgpp/getting.html}. - - -The latest version of DJGPP is 2.00. See -@file{http://www.delorie.com/djgpp/v2/} for information on this version. - -FSF sells floppies with DJGPP on them; see above for ordering software -from the FSF. - -DJGPP has its own newsgroup: @file{comp.os.msdos.djgpp}. - -@cindex Amiga support -Development and porting efforts for GNU tools, including gcc/g++, for -the Amiga are maintained by an initiative named ADE (Amiga Developers -Environment. More information about ADE is available at -@file{http://www.ninemoons.com/}. - -For more information on Amiga ports of gcc/g++, retrieve the file -@file{ftp://prep.ai.mit.edu/pub/gnu/MicrosPorts/Amiga}. - -@cindex Atari ST support -A port of gcc to the Atari ST can be found at @* -@file{ftp://atari.archive.umich.edu/atari/Gnustuff/Tos} -along with many -other GNU programs. This version is usually the same as the latest FSF -release. See the ``Software FAQ'' for the Usenet group -@file{comp.sys.atari.st} for more information. - -@cindex EMX port -@cindex OS/2 support - -EMX is a port of gcc to OS/2; it can also be used on MS-DOS. In addition to -the compiler port, the EMX port's C library attempts to provide a -Unix-like environment. For more information ask around on -@file{comp.os.os2.programmer.porting}. Version 0.9c, based on gcc-2.7.2.1, -was released in -November 1996. It is available by FTP and the WWW from, among other -places - -@example -@file{http://www.os2ss.com/unix/emx09c/} -@file{ftp://ftp.cdrom.com/pub/os2/emx09c/} (US) -@file{ftp://ftp.leo.org/pub/comp/os/os2/leo/devtools/emx+gcc/} (Germany) -@end example - -Eberhard Mattes did the EMX port. His address is -mattes@@azu.informatik.uni-stuttgart.de. -Read the FAQ file included with the distribution before harrassing the author. - -@cindex Apple support -@cindex Macintosh support - -I'm looking for more information on gcc/g++ support on the Apple -Macintosh. Until recently, this FAQ did not provide such information, -but FSF is no longer boycotting Apple as the League for Programming -Freedom boycott has been dropped. - -Versions 1.37.1 and 2.3.3 of gcc were ported by Stan Shebs and are available -at @* -@file{ftp://ftp.cygnus.com/pub/mac} - -They are both interfaced to MPW. -Stan is working on a version using the current (post-2.7) sources, contact -him directly (shebs@@cygnus.com) for more information. - -@node 1.x vs 2.x versions, , g++ for other platforms, basics -@section But I can only find g++-1.42! - -``I keep hearing people talking about g++ 2.8.1 (or some other number -starting with 2), but the latest version I can find is g++ 1.42. Where -is it?'' - -@cindex Objective-C -@cindex g++, version number -As of gcc 2.0, C, C++, and Objective-C as well are all combined into a -single distribution called gcc. If you get gcc you already have g++. The -standard installation procedure for any gcc version 2 compiler will -install the C++ compiler as well. - -One could argue that we shouldn't even refer to "g++-2.x.y" but it's a -convention. It means ``the C++ compiler included with gcc-2.x.y.'' - -@node egcs and 2.8.x, installation, basics, Top -@chapter The Next Generation(s) of g++ - -@menu -* new-in-2.8.x:: What's new in gcc 2.8.x? -* egcs-intro:: What is egcs? -* egcs-whats-new:: What's new in egcs vs 2.7.2? -* egcs-bug-fixes:: What was fixed in the latest egcs releases? -* egcs-linux:: If I install on Linux, will it overwrite my libraries? -* egcs-run-both:: How can I run both egcs and an FSF release? -* egcs-vs-2.8.x:: How will egcs affect 2.8.x? -* egcs-robustness:: How robust is egcs? -@end menu - -@node new-in-2.8.x, egcs-intro, egcs and 2.8.x, egcs and 2.8.x -@section What's new in gcc/g++ 2.8.x? - -After a two-year wait, gcc 2.8.0 was released in January 1998, along -with libstdc++-2.8.0 and libg++-2.8.0. This has been followed up in -March by the 2.8.1 release of all three packages, though libg++-2.8.1 -is an "add-on" (it does not contain libstdc++ anymore). Note that -libstdc++ is required. - -For those familiar with egcs, the most obvious difference between -gcc-2.8.x and egcs is the packaging: egcs is bundled with -libstdc++, and gcc-2.8.x does not contain the class library. Otherwise, -except for the lack of the @code{-frepo} option and some bug fixes -that have not yet made it into gcc-2.8.x, C++ users will find the -two compilers to be almost the same at this stage, other than that 2.8.x -users may get more bogus warnings with -Wall and optimization because -some fixes to flow analysis in the presence of exceptions that egcs made -are not yet present in gcc 2.8.x (as of 2.8.1). - -The flow analysis problem in 2.8.1 produces bad code in some cases, not -just spurious errors. It only affects code that actually throws an -exception, and only the path corresponding to a thrown exception gets -misoptimized. If this happens, you can try reducing the level of -optimization. - -Because the new feature lists for egcs and gcc 2.8 are almost the same, -please see @xref{egcs-whats-new} for a list of new features. It is a -fairly long list. - -@node egcs-intro, egcs-whats-new, new-in-2.8.x, egcs and 2.8.x -@section What is egcs? - -egcs is the experimental GNU compiler system (see -@file{http://www.cygnus.com/egcs} on the Web). It is an effort to -accelerate development of new gcc features by providing a more open -development model than gcc has traditionally used. - -The first egcs release, egcs-1.0, came out on December 3, 1997. -The current release is egcs-1.0.3, released May 15, 1998. - -Questions not addressed here may be answered in the egcs FAQ -(@file{http://www.cygnus.com/egcs/faq.html}). - -@node egcs-whats-new, egcs-bug-fixes, egcs-intro, egcs and 2.8.x -@section What new C++ features are in egcs? - -@strong{Note}: unless indicated otherwise, these features are also -present in g++ 2.8.x. - -@itemize @bullet -@item -@cindex integrated libstdc++ - -The standard C++ classes are integrated with the egcs release (but -@strong{not} for gcc-2.8.x, which does not include the class libraries). -libg++ is not being -supported, though an add-on version that will work with egcs can be found at -@file{ftp://ftp.yggdrasil.com/private/hjl/libg++-2.8.0b6.6.tar.gz}, -thanks to H.J. Lu. The compiler and library are configured and built -in one step. - -@item -@cindex new template implementation -A completely new template implementation, much closer to the draft -standard. Limitations in 2.7.2.x concerning inlining template functions -are eliminated. Static template data members, template class member -functions, partial specification, and default template arguments are -supported. An instantiation method resembling that used in Borland C++ -(instantiating functions possibly in multiple .o files and using weak -symbols to link correctly) is provided, in addition to other -options. The SGI version of STL is shipped verbatim with libstdc++ -(libstdc++ is included with egcs, separate with gcc-2.8.x). - -@item -@cindex redundant template elimination -@cindex templates: removing redundancy -On ELF platforms (Linux/ELF, Solaris, SVR4), if the GNU linker is used, -duplicated template functions and virtual function tables are eliminated -at link time. - -@item -@cindex repository -@cindex -frepo -The @code{-frepo} flag is supported in egcs (it is not in 2.8.x). -However, because of the previous item, I don't recommend its use on ELF -systems, as the default method is better. - -@item -@cindex new exception implementation -Exception handling has been re-worked; exceptions will work together -with optimization. -Actually, there are two separate implementations: one based on setjmp/longjmp -and designed to be highly portable, and one designed to be more efficient but -requiring more processor-specific support (getting exceptions right has proven -to be extremely difficult and has been the chief obstacle to getting a new -release out). - -@item -@cindex RTTI -RTTI has been re-done to work correctly and is on by default. - -@item -@cindex overloading -Overloading has been re-worked to conform to the latest draft of the -standard. - -@item -There are many more changes: see @file{http://www.cygnus.com/egcs/c++features.html} for a list. -@end itemize - -Features that are still missing include namespaces and templates as -template arguments, though there is support for the latter feature -in the egcs snapshots (which has not yet made it into a release). - -@node egcs-bug-fixes, egcs-linux, egcs-whats-new, egcs and 2.8.x -@section What was fixed in the latest egcs releases? - -@itemize @bullet - -@item -Add support for Red Hat 5.0 Linux and better support for Linux -systems using glibc2. (1.0.3 was specifically done to fix some -remaining problems detected when building Red Hat 5.1). - -@item -Compatibility with both egcs-1.0 and gcc-2.8 libgcc exception handling -interfaces (see below). - -@item -Various bugfixes in the x86, hppa, mips, and rs6000/ppc backends. - -@item -A few machine independent bugfixes, mostly to fix code generation bugs -when building Linux kernels or glibc. - -@item -Fix a few critical exception handling and template bugs in the C++ -compiler. - -@item -Fix build problems on x86-solaris systems. -@end itemize - -To avoid future compatibility problems, we strongly urge anyone who is -planning on distributing shared libraries that contain C++ code to -upgrade to at least egcs-1.0.1 first (and preferably to 1.0.3). See -@file{http://www.cygnus.com/egcs/egcs-1.0.1.html} for details about the -compatibility issues as well as additional information about the -bugfixes since the egcs-1.0 release. - -@node egcs-linux, egcs-run-both, egcs-bug-fixes, egcs and 2.8.x -@section If I install egcs on Linux, will it overwrite my libraries? - -No. If you build from sources, by default, egcs installs executables in -@code{/usr/local/bin} and libraries in @code{/usr/local/lib}, and you -can change this default if desired (see next section). - -If, however, you install a package (e.g. Debian or Red Hat) that wants -to put egcs in @code{/usr/bin} and @code{/usr/lib}, then yes, you are -replacing your system compiler and C++ library (I don't know if anyone -has provided such packages yet -- proceed with caution). - -@node egcs-run-both, egcs-vs-2.8.x, egcs-linux, egcs and 2.8.x -@section How can I run both egcs and an FSF release of g++ on the same machine? - -The recommended approach is to provide a different argument to the -@code{--prefix} flag when you configure egcs. For example, say -@code{--prefix=/usr/local/egcs} and then, after installation, you -can make symbolic links from @file{/usr/local/egcs/bin} to whereever -you want, for example - -@example -ln -s /usr/local/egcs/bin/gcc /usr/local/bin/egcc -ln -s /usr/local/egcs/bin/g++ /usr/local/bin/eg++ -@end example - -@node egcs-vs-2.8.x, egcs-robustness, egcs-run-both, egcs and 2.8.x -@section What about 2.8.x? How does egcs affect the 2.8.x development? - -2.8.0 has now been released (followed up by 2.8.1), with essentially the -same C++ front end as egcs. - -Bug fixes generated in egcs will be passed to the 2.8.x releases for -inclusion; the reverse is also taking place, though a bug fix may -appear in one before it does in the other. egcs development is currently -proceeding much more quickly than gcc 2.8.x development. However, there -is essentially only one C++ front end, which is shared by the two -distinct compiler back ends (however, since egcs-1.0.3 is newer than -gcc 2.8.1, it has more bug fixes). - -@node egcs-robustness, , egcs-vs-2.8.x, egcs and 2.8.x -@section How robust is egcs? - -While the 'e' stands for 'experimental', egcs has been tested thoroughly -and should be of high quality. The author considers egcs 1.0.3 the -most robust GNU C++ compiler ever produced. - -@node installation, evolution, egcs and 2.8.x, Top -@chapter Installation Issues and Problems - -@menu -* gcc-2 + g++-1:: -* what else do I need?:: -* use GNU linker?:: -* Use GNU assembler?:: -* shared libraries:: -* repository:: -* repo bugs:: -* Use GNU C library?:: -* Global constructor problems:: -* Strange assembler errors:: -* Other problems building libg++:: -* More size_t problems:: -* Rebuild libg++?:: -* co-existing versions:: -* Installing on Linux:: -* Linux Slackware 3.0:: -@end menu - -@node gcc-2 + g++-1, what else do I need?, installation, installation -@section I can't build g++ 1.x.y with gcc-2.x.y! - -``I obtained gcc-2.x.y and g++ 1.x.y and I'm trying to build it, but -I'm having major problems. What's going on?'' - -@cindex g++, building -If you wish to build g++-1.42, you must obtain gcc-1.42 first. The -installation instructions for g++ version 1 leave a lot to be desired, -unfortunately, and I would recommend that, unless you have a special -reason for needing the 1.x compiler, that C++ users use the latest -g++-2.x version, as it -is the version that is being actively maintained. - -@cindex g++, template support -@cindex Templates -@cindex ANSI draft standard -There is no template support in g++-1.x, and it is generally much further -away from the ANSI draft standard than g++-2.x is. - -@node what else do I need?, use GNU linker?, gcc-2 + g++-1, installation -@section OK, I've obtained gcc; what else do I need? - -@cindex libg++ -First off, you'll want libg++ as you can do almost nothing without it -(unless you replace it with some other class library). - -@cindex GNU GAS -@cindex GNU GAS [assembler] -Second, depending on your platform, you may need "GAS", the GNU assembler, -or the GNU linker (see next question). - -@cindex GNU gdb -Finally, while it is not required, you'll almost certainly want the GNU -debugger, gdb. The latest version is -4.17, released April 27, 1997. -Other debuggers (like dbx, for example) will normally not be able to -understand at least some of the debug information produced by g++. - -@node use GNU linker?, Use GNU assembler?, what else do I need?, installation -@section Should I use the GNU linker, or should I use "collect"? - -@cindex Linker -@cindex System VR3, linker -@cindex System VR4, linker -First off, for novices: special measures must be taken with C++ to arrange -for the calling of constructors for global or static objects before the -execution of your program, and for the calling of destructors at the end. -(Exception: System VR3 and System VR4 linkers, Linux/ELF, and some other -systems support user-defined -segments; g++ on these systems requires neither the GNU linker nor -collect. So if you have such a system, the answer is that you don't -need either one, though using GNU ld does have some advantages over -the native linker in some cases). - -@cindex AT&T cfront -@cindex Cfront-end -@cindex collect program -@cindex GNU linker -@cindex GNU binutils -If you have experience with AT&T's "cfront", this function is performed -there by programs named "patch" or "munch". With GNU C++, it is performed -either by the GNU linker or by a program known as "collect". The collect -program is part of the gcc-2.x distribution; you can obtain the GNU linker -separately as part of the "binutils" package. The latest version of -binutils is 2.9.1, released May 1, 1998. - -Note that if you want to use exceptions on Intel-like platforms and use -gas (e.g. you run Linux), you need binutils version 2.8.1 or newer for -exceptions to work correctly! - -(To be technical, it's "collect2"; there were originally several -alternative versions of collect, and this is the one that survived). - -There are advantages and disadvantages to either choice. - -Advantages of the GNU linker: -@cindex GNU linker, advantages -@cindex GNU ld -@cindex ld [GNU linker] - -It's faster than using collect -- collect basically runs the standard Unix -linker on your program twice, inserting some extra code after the first -pass to call the constructors. This is a sizable time penalty for large -programs. The GNU linker does not require this extra pass. - -GNU ld reports undefined symbols using their true names, not the mangled -names (but as of 2.7.0 so does collect). - -If there are undefined symbols, GNU ld reports which object file(s) refer to -the undefined symbol(s). On some OSes (e.g. SunOS, Solaris) the native -linker does not do this, so you have to track down who's referring to -the missing symbols yourself. - -As of binutils version 2.2, on systems that use the so-called "a.out" -debug format (e.g. Suns running SunOS 4.x), the GNU linker compresses -the debug symbol table considerably. The 2.7 version adds some symbol -table compression for ELF and Solaris targets. - -Users of egcs or 2.8.x on ELF systems should definitely -use GNU ld (2.8 or later), as it will automatically remove duplicate -instantiations of templates, virtual function tables, or ``outlined'' -copies of inline functions. - -@cindex collect linker, advantages -Advantages of collect: - -@cindex Shared libraries -If your native linker supports shared libraries, you can use shared -libraries with collect. This used to be a strong reason @emph{not} -to use the GNU linker, but recent versions of GNU ld support linking -with shared libraries on many platforms, and creating shared libraries -on a few (such as Intel x86 systems that use ELF object format as well -as SunOS and Solaris). - -@xref{shared libraries} - -@cindex GNU linker, porting -The GNU linker has not been ported to as many platforms as g++ has, so you -may be forced to use collect. - -If you use collect, you don't need to get something extra and figure out -how to install it; the standard gcc installation procedure will do it for you. - -I used to say at this point that I don't see a clear win for either -linking alternative, but with all the improvements in the GNU linker -I think that it is now the better choice. Take your pick. - -If you run Linux, the only available linker is the GNU linker. - -@node Use GNU assembler?, shared libraries, use GNU linker?, installation -@section Should I use the GNU assembler, or my vendor's assembler? - -@cindex Assembler -@cindex GNU GAS -This depends on your platform and your decision about the GNU linker. For -most platforms, you'll need to use GAS if you use the GNU linker. For -some platforms, you have no choice; check the gcc installation notes to -see whether you must use GAS. But you can usually use the vendor's -assembler if you don't use the GNU linker. - -The GNU assembler assembles faster than many native assemblers; however, -on many platforms it cannot support the local debugging format. - -It used to be that the GNU assembler couldn't handle -position-independent code on SunOS. This is no longer true if you -have version 2.6 or newer. - -On HPUX or IRIX, you must use GAS (and configure gcc with the -@code{--with-gnu-as} option) to debug your programs. GAS is -strongly recommended particularly on the HP platform because of -limitations in the HP assembler. - -The GNU assembler has been merged with the binutils -distribution, so the GNU assembler and linker are now together in -this package (as of binutils version 2.5.1). - -On Linux the assembler is the GNU assembler. - -@node shared libraries, repository, Use GNU assembler?, installation -@section How do I build shared libraries with g++? - -For gcc-2.7.0 and later, building C++ shared libraries should work fine -on supported platforms (HPUX 9+, IRIX 5+, DEC UNIX (formerly OSF/1), -SGI/IRIX, AIX, SunOS 4, Linux/ELF and all targets using SVR4-style ELF shared -libraries). There are two separate issues: building libg++ as a shared -library, and making your own shared libraries. For libg++ it is simply -a matter of giving the @code{--enable-shared} option to the configure -program. When compiling your own code for shared libraries you -generally -must use the @code{-fPIC} flag to get position-independent code. - -@cindex -shared flag of gcc - -If your shared library contains global or static objects with -constructors, then make sure to use @code{gcc -shared}, not -@code{ld}, to create the shared library. This will make sure -that any processor-specific magic needed to execute the constructors -is included. - -In theory, constructors for objects in your shared library should be -called when the library is opened (by dlopen or equivalent). This -does not work on some platforms (e.g. SunOS4; it does work on Solaris -and ELF systems such as Linux): on the broken platforms, the -constructors are not called correctly. - -David Nilsen has suggested the following workaround: - -The thing to realize is that if you link your dynamic module with the -@code{-shared} flag, the collect program nicely groups all the static -ctors/dtors for you into a list and sets up a function that will call -them (Note: this means that this trick won't work if you use the GNU -linker without collect (@pxref{use GNU linker?}). - -The magic is knowing these function names. Currently, they're called: - -@example -_GLOBAL__DI <-- calls all module constructors -_GLOBAL__DD <-- calls all module destructors -@end example - -[ possibly the leading underscore will differ between platforms: jbuck ] - -Therefore, if you make a wrapper around dlopen that looks up the -symbol @code{_GLOBAL__DI} (or @code{__GLOBAL__DI} on SunOS4 machines), and -calls it, you'll simulate getting the constructors called. - -You also need to set up the destructors to be called as well, so you -need to put a wrapper around dlclose, which will call the -@code{_GLOBAL__DD} function in the module when/if it's unloaded. - -Lastly, to get things 100% correct, you need to set up the destructors -to also be called if the module is not unloaded, but the main program -exits. I do this by registering a single function with @code{atexit()} that -calls all the destructors left in dynamically loaded modules. - -@cindex Shared version of libg++ -Check the file @file{README.SHLIB} from the libg++ distribution for more -about making and using shared libraries. - -@cindex Shared libraries with HP - -A patch is needed to build shared versions of version 2.7.2 of libg++ -and libstdc++ on the HP-PA architecture. You can find the patch at -@file{ftp://ftp.cygnus.com/pub/g++/libg++-2.7.2-hppa-gcc-fix}. - -@node repository, repo bugs, shared libraries, installation -@section How do I use the new repository code? - -@cindex repo patch -Because there is some disagreement about the details of the template -repository mechanism, you'll need to obtain a patch from Cygnus Support -to enable the 2.7.2 repository code. You can obtain the patch by -anonymous FTP: @file{ftp://ftp.cygnus.com/pub/g++/gcc-2.7.2-repo.gz}. - -There are patches for 2.7.0 and 2.7.1 in the same directory, though -if you're going to rebuild the compiler you should use the latest one. - -@cindex repo patch for BSD -If you're running NetBSD or BSDI, the Cygnus repo patch is not quite -correct. Tim Liddelow has made an alternate version available at -@file{ftp://ftp.cst.com.au/pub/gcc-2.7.2-repo-bsd.gz}. - -After you've applied the patch, the @code{-frepo} flag will enable the -repository mechanism. The flag works much like the existing -@code{-fno-implicit-templates} flag, except that auxiliary files, with -an @file{.rpo} extension, are built that specify what template -expansions are needed. At link time, the (patched) collect program -detects missing templates and recompiles some of the object files -so that the required templates are expanded. - -Note that the mechanism differs from that of cfront in that template -definitions still must be visible at the point where they are to be -expanded. No assumption is made that @file{foo.C} contains template -definitions corresponding to template declarations in @file{foo.h}. - -@cindex closure with repo -@cindex template closure -Jason Merrill writes: ``To perform closure on a set of objects, just try -to link them together. It will fail, but as a side effect all needed -instances will be generated in the objects.'' - -@node repo bugs, Use GNU C library?, repository, installation -@section Known bugs and problems with the repo patch - -``The @code{-frepo} won't expand templated friend functions!'' - -This is a known bug; currently you'll have to explicitly instantiate -friend functions when using @code{-frepo} due to this bug (in 2.7.0 -through 2.7.2 at least). - -With earlier versions of the repo patch, there was a bug that happens -when you have given a quoted command line switch, something like - -@example --D'MESSAGE="hello there"' -@end example - -The repo code tries to recompile files using the same flags you -originally specified, but doesn't quote arguments that need quoting, -resulting in failures in some cases. This is no longer a problem -with the 2.7.2 patch. - -@node Use GNU C library?, Global constructor problems, repo bugs, installation -@section Should I use the GNU C library? - -@cindex GNU C library -@cindex libg++ -At this point in time, no (unless you are running Linux or the GNU Hurd -system). The GNU C library is still very young, and -libg++ still conflicts with it in some places. Use your native C library -unless you know a lot about the gory details of libg++ and gnu-libc. This -will probably change in the future. - -@node Global constructor problems, Strange assembler errors, Use GNU C library?, installation -@section Global constructors aren't being called - -@cindex global constructors -``I've installed gcc and it almost works, but constructors and -destructors for global objects and objects at file scope aren't being -called. What did I do wrong?'' - -@cindex collect program -It appears that you are running on a platform that requires you to -install either "collect2" or the GNU linker, and you have done neither. -For more information, see the section discussing the GNU linker -(@pxref{use GNU linker?}). - -@cindex constructor problems on Solaris -@cindex Solaris, constructor problems -On Solaris 2.x, you shouldn't need a collect program and GNU ld doesn't run. -If your global constructors aren't being called, you may need to install -a patch, available from Sun, to fix your linker. The number of the -``jumbo patch'' that applies is 101409-03. Thanks to Russell Street -(r.street@@auckland.ac.nz) for this info. - -@cindex IRIX, installing collect -It appears that on IRIX, the collect2 program is not being installed -by default during the installation process, though it is required; -you can install it manually by executing - -@example -make install-collect2 -@end example - -from the gcc source directory after installing the compiler. (I'm -not certain for which versions of gcc this problem occurs, and whether -it is still present). - -@node Strange assembler errors, Other problems building libg++, Global constructor problems, installation -@section Strange assembler errors when linking C++ programs - -``I've installed gcc and it seemed to go OK, but when I attempt to link -any C++ program, I'm getting strange errors from the assembler! How -can that be?'' - -The messages in question might look something like - -@example -as: "/usr/tmp/cca14605.s", line 8: error: statement syntax -as: "/usr/tmp/cca14605.s", line 14: error: statement syntax -@end example - -(on a Sun, different on other platforms). The important thing is that -the errors come out at the link step, @emph{not} when a C++ file is -being compiled. - -@cindex nm program -@cindex GNU nm program -Here's what's going on: the collect2 program uses the Unix ``nm'' -program to obtain a list of symbols for the global constructors and -destructors, and it builds a little assembly language module that -will permit them all to be called. If you're seeing this symptom, -you have an old version of GNU nm somewhere on your path. This old -version prints out symbol names in a format that the collect2 program -does not expect, so bad assembly code is generated. - -The solution is either to remove the old version of GNU nm from your -path (and that of everyone else who uses g++), or to install a newer -version (it is part of the GNU "binutils" package). Recent versions -of GNU nm do not have this problem. - -@node Other problems building libg++, More size_t problems, Strange assembler errors, installation -@section Other problems building libg++ -@cindex libg++ on Ultrix -@cindex libg++ on SunOS - -``I am having trouble building libg++. Help!'' - -On some platforms (for example, Ultrix), you may see errors complaining -about being unable to open dummy.o. On other platforms (for example, -SunOS), you may see problems having to do with the type of size_t. -The fix for these problems is to make libg++ by saying "make CC=gcc". -According to Per Bothner, it should no longer be necessary to specify -"CC=gcc" for libg++-2.3.1 or later. - -``I built and installed libg++, but g++ can't find it. Help!'' - -The string given to @file{configure} that identifies your system must -be the same when you install libg++ as it was when you installed gcc. -Also, if you used the @code{--prefix} option to install gcc somewhere -other than @file{/usr/local}, you must use the same value for -@code{--prefix} when installing libg++, or else g++ will not be able -to find libg++. - -@cindex patch for libg++-2.6.2 - -The toplevel Makefile in the libg++ 2.6.2 distribution is broken, which -along with a bug in g++ 2.6.3 causes problems linking programs that use the -libstdc++ complex classes. A patch for this is available from -@file{ftp://ftp.cygnus.com//pub/g++/libg++-2.6.2-fix.gz}. - -@node More size_t problems, Rebuild libg++?, Other problems building libg++, installation -@section But I'm @emph{still} having problems with @code{size_t}! - -@cindex Type of size_t -``I did all that, and I'm @emph{still} having problems with disagreeing -definitions of size_t, SIZE_TYPE, and the type of functions like -@code{strlen}.'' - -@cindex _G_config.h -The problem may be that you have an old version of @file{_G_config.h} -lying around. As of libg++ version 2.4, @file{_G_config.h}, since it is -platform-specific, is inserted into a different directory; most include -files are in @file{$prefix/lib/g++-include}, but this file now lives in -@file{$prefix/$arch/include}. If, after upgrading your libg++, you find that -there is an old copy of @file{_G_config.h} left around, remove it, -otherwise g++ will find the old one first. - -@node Rebuild libg++?, co-existing versions, More size_t problems, installation -@section Do I need to rebuild libg++ to go with my new g++? - -``After I upgraded g++ to the latest version, I'm seeing undefined -symbols.'' - -or - -``If I upgrade to a new version of g++, do I need to reinstall libg++?'' - -@cindex Incompatibilities between g++ versions - -As a rule, the first two digits of your g++ and libg++ should be the -same. Normally when you do an upgrade in the ``minor version number'' -(2.5.7 to 2.5.8, say) there isn't a need to rebuild libg++, but there -have been a couple of exceptions in the past. - -@node co-existing versions, Installing on Linux, Rebuild libg++?, installation -@section I want several versions of g++ and libg++ to co-exist. - -I recommend against using the @code{-V} flag to make multiple versions -of gcc/g++ co-exist, unless they are different minor releases that can use -the same compiled version of libg++. The reason is that all these -versions will try to use the same libg++ version, which usually will -not work. - -Instead, use the @code{--prefix} flag when configuring gcc. Use a -different value of @code{--prefix} for each gcc version. Use the -same value of @code{--prefix} when configuring libg++. You can then -have any number of co-existing gcc/libg++ pairs. Symbolic links can -be used so that users don't need to put all these different directories -on their paths. - -One possible system to use is to set @code{--prefix} to -@file{/usr/local/gcc-2.x.y} for version 2.x.y of gcc, and to link -whichever version of gcc you wish to be the default into -@file{/usr/local/bin/gcc} and @file{/usr/local/bin/g++}. - -@node Installing on Linux, Linux Slackware 3.0, co-existing versions, installation -@section Trouble installing g++ and libg++ on Linux - -``I've downloaded the latest g++ and libg++ and I'm trying to install -them on Linux, and I'm having lots of problems.'' - -@cindex Linux -FSF releases of libg++ won't install on Linux unchanged, since Linux -uses are part of the libio library from libg++ for its standard C -library, only this is changed in a way that it clashes with libg++. -This means that you'll need a patched version of libg++ for it to -work. - -If you want to upgrade to a new gcc/libg++ combination, the easiest -thing to do is to grab the prebuilt versions of gcc and libg++ for Linux -from @file{ftp://tsx-11.mit.edu/pub/linux/packages/GCC}. Follow the -directions carefully. If you want to build from source, you'll need -a patch for libg++; the Linux developers have named the patched libg++ -version libg++-2.7.1.3 and there is a patch file in the above-named -directory. - -See @file{http://sunsite.unc.edu/LDP/HOWTO/GCC-HOWTO.html}, -the Linux GCC HOWTO, for more on gcc/g++ and Linux. - -Linux is in the process of switching over to the GNU C library, version -2, which will become Linux libc version 6. Once this process is -complete, there's a good chance that the installation process on Linux -will be smoother, but only experts should try making this new library -work at this point. - -@node Linux Slackware 3.0, , Installing on Linux, installation -@section Problems with g++ on Linux Slackware 3.0 - -@cindex Slackware -@cindex Linux Slackware -``When I try to compile the traditional Hello, world program on Linux, -the compiler can't find @file{iostream.h}. What's the deal?'' - -You probably have the Slackware 3.0 release. There's an error in the -setup. It's easy to fix, though; log in as root, and make a symbolic -link: - -@example -ln -s /usr/lib/g++-include /usr/include/g++ -@end example - -@node evolution, User Problems, installation, Top -@chapter The Evolution of g++ - -This chapter discusses the evolution of g++ and describes what can be expected -in the future. - -@menu -* version 2.7.x:: What's changed in 2.7.x from earlier versions -* libstdc++:: -@end menu - -@node version 2.7.x, libstdc++, evolution, evolution -@section What's new in version 2.7.x of gcc/g++ - -[ This section is old now, since 2.8.x/egcs is the new stuff ] The -latest 2.7.x version was 2.7.2.2, released February 10, 1997. The only -change between 2.7.2.1 and 2.7.2.2 is that support was added for using -the GNU C library, version 2, on Linux; users not interested in that -functionality have no reason to upgrade. The previous version of -gcc/g++ was 2.7.2.1, released August 14, 1996. The libg++ version that -should be used with any 2.7.x gcc/g++ is 2.7.2, released July 4, 1996. - -Note that gcc 2.7.2.1 just consists of several small patches to -gcc-2.7.2. The release is mainly -intended to fix platform-specific bugs and does not affect the C++ -``front end'' of the compiler (the part that parses your C++ code). - -The 2.7.x releases represent a great deal of work on the part of the g++ -maintainers to fix outstanding bugs and move the compiler closer to the -current ANSI/ISO standards committee's working paper, including -supporting many of the new features that have been added to the -language. I recommend that everyone read the NEWS file contained in the -distribution (and that system administrators make the file available to -their users). I've borrowed liberally from this file here. - -@cindex C++ working paper -If any features seem unfamiliar, you will probably want to -look at the recently-released public review copy of the C++ Working -Paper. A new draft, dated 2 December 1996, has been released for -public comment. You can find it on the web at -@file{http://www.cygnus.com/misc/wp/} or -@file{http://www.maths.warwick.ac.uk/c++/pub/wp/html/cd2/}. -See -@file{http://www.setech.com/x3.html} -or -@file{http://www.maths.warwick.ac.uk/c++/pub/} to download the -document in PostScript, PDF (Adobe Acrobat), HTML, or ASCII -form. - -Here are the main points: - -@itemize @bullet -@item -@cindex for scope -As described above, the scope of variables declared in the -initialization part of a for statement has been changed; such variables -are now visible only in the loop body. Use @code{-fno-for-scope} to get -the old behavior. You'll need this flag to build groff version 1.09, -Ptolemy, and many other free software packages. - -@item -@cindex vtable duplication -Code that does not use #pragma interface/implementation will most -likely shrink dramatically, as g++ now only emits the vtable for a -class in the translation unit where its first non-inline, non-abstract -virtual function is defined. - -@item -@cindex automatic template instantiation -Support for automatic template instantiation has @emph{not} been enabled -in the official distribution, due to a disagreement over design philosophies. -But you can get a patch from Cygnus to turn it on; retrieve the patch -from @file{ftp://ftp.cygnus.com/pub/g++/gcc-2.7.2-repo.gz} to patch -gcc-2.7.2 (there are also patches for earlier gcc versions). - -@item -@cindex exception handling, 2.7.0 - -@xref{exceptions} - -@item -@cindex run-time type identification -Support for Run-Time Type Identification has been added with @code{-frtti}. -This support is still in alpha; one major restriction is that any file -compiled with @code{-frtti} must include @code{} (@emph{not} -@code{typeinfo.h} as the NEWS file says). -Also, all C++ code you link with (including libg++) has to be built with -@code{-frtti}, so it's still tricky to use. - -@item -@cindex compiler-generated operators -Synthesis of compiler-generated constructors, destructors and -assignment operators is now deferred until the functions are used. - -@item -@cindex assignment in conditional expressions -The parsing of expressions such as @code{a ? b : c = 1} -has changed from -@code{(a ? b : c) = 1} to @code{a ? b : (c = 1)}. This is a new C/C++ -incompatibility brought to you by the ANSI/ISO standards committee. - -@item -@cindex new operator keywords -The operator keywords and, and_eq, bitand, bitor, compl, not, not_eq, -or, or_eq, xor and xor_eq are now supported. Use @code{-ansi} or -@code{-foperator-names} to enable them. - -@item -@cindex explicit keyword -The @code{explicit} keyword is now supported. @code{explicit} is used to mark -constructors and type conversion operators that should not be used -implicitly. - -@item -@cindex user-defined type conversion -Handling of user-defined type conversion has been improved. - -@item -@cindex explicit template instantiation -Explicit instantiation of template methods is now supported. Also, -@code{inline template class foo;} -can be used to emit only the vtable -for a template class. - -@item -@cindex -fcheck-new -With -fcheck-new, g++ will check the return value of all calls to -operator new, and not attempt to modify a returned null pointer. - -@item -collect2 now demangles linker output, and c++filt has become part of -the gcc distribution. - -@item -Improvements to template instantiation: only members actually used -are instantiated. (Actually this is not quite true: some inline -templates that are not successfully inlined may be expanded even -though they are not needed). - -@end itemize - -@node libstdc++, , version 2.7.x, evolution -@section The GNU Standard C++ Library - -The GNU Standard C++ Library (also called the ``GNU ANSI C++ Library'' -in places in the code) is not libg++, though it is included in the -libg++ distribution. Rather, it contains classes and functions -required by the ANSI/ISO standard. The copyright conditions are the -same as those for for the iostreams classes; the LGPL is not used -(@pxref{legalities}). - -This library, libstdc++, is in the libg++ distribution in versions 2.6.2 -and later. It requires at least gcc 2.6.3 to build the libg++-2.6.2 -version; use at least gcc 2.7.0 to build the libg++ 2.7.0 version. It -contains a hacked-up version of HP's implementation of the Standard -Template Library (@pxref{Standard Template Library}). I've -successfully used this Standard Template Library version to build -a number of the demos you'll see on various web pages. - -As of version 2.7.0, the streams classes are now in libstdc++ instead of -libg++, and libiostream is being phased out (don't use it). The g++ -program searches this library. - -The maintainers of libg++ have de-emphasized work on the older libg++ classes -in favor of enhancing libstdc++ to cover the full language, so while libg++ -will always be available, enhancements to it should not be expected. - -@node User Problems, legalities, evolution, Top -@chapter User Problems - -@menu -* missing virtual table:: -* for scope:: -* const constructor:: -* unused parameter warnings:: -* jump crosses initialization:: -* Demangler:: -* static data members:: -* internal compiler error:: -* bug reports:: -* porting to g++:: -* name mangling:: -* problems linking with other libraries:: -* documentation:: -* templates:: -* undefined templates:: -* redundant templates:: -* Standard Template Library:: -* STL and string:: -* exceptions:: -* namespaces:: -* agreement with standards:: -* compiling standard libraries:: -* debugging on SVR4 systems:: -* debugging problems on Solaris:: -* X11 conflicts with libg++:: -* assignment to streams:: -@end menu - -@node missing virtual table, for scope, User Problems, User Problems -@section Linker complains about missing virtual table - -``I'm getting a message complaining about an undefined virtual table. Is -this a compiler bug?'' - -(On platforms that run neither collect nor the GNU linker, like Solaris, -you may see an odd undefined symbol like "_vt.3foo", where foo is a -class name). - -This is probably because you are missing a definition for the first -(non-inline) virtual function of the class. Since gcc-2.7.0, g++ uses -a trick borrowed from cfront: the .o file containing the definition for -the first non-inline virtual function for the class will also contain -the virtual function table. - -@node for scope, const constructor, missing virtual table, User Problems -@section gcc-2.7.0 breaks declarations in "for" statements! - -@cindex declarations in for statements -@cindex for statements: declarations - -gcc-2.7.0 implements the new ANSI/ISO rule on the scope of variables -declared in for loops. - -@example -for (int i = 1; i <= 10; i++) @{ - // do something here -@} -foo(i); -@end example - -In the above example, most existing C++ compilers would pass the -value 11 to the function @code{foo}. In gcc 2.7 and in the ANSI/ISO -working paper, the scope of @code{i} is only the for loop body, so -this is an error. So that old code can be compiled, the new gcc has -a flag @code{-fno-for-scope} that causes the old rule to be used. -@cindex -fno-for-scope - -As of 2.7.1, the compiler attempts to issue warnings about code that -has different meanings under the two sets of rules, but the code is -not perfect: the intent was that code that has valid, but different, -meanings under the ARM rules and the working paper rules would give -warnings but have the new behavior, and this doesn't seem to happen. - -The @code{-ffor-scope} flag under 2.7.1 and 2.7.2 gives the 2.7.0 behavior. - -@node const constructor, unused parameter warnings, for scope, User Problems -@section g++ seems to want a const constructor. What's that? - -gcc-2.7.1 introduced a bug that causes the compiler to ask for a -const constructor (there's no such thing in C++) in certain situations -where a const object appears in a template class. Most cases have been -fixed in gcc-2.7.2, but unfortunately not all. Still, if you're running -gcc-2.7.1 and have this problem, upgrade to 2.7.2; it is a vast improvement. - -@cindex ObjectSpace - -The default constructor for the template @code{pair} in ObjectSpace's -implementation of STL triggers the bug in one place, for gcc 2.7.2. If -you're using ObjectSpace and having this problem, simply -change the default constructor from - -@example -os_pair () : first (T1 ()), second (T2 ()) @{@} -@end example - -to just - -@example -os_pair () @{@} -@end example - -Once this is done, ObjectSpace works fairly well. - -@node unused parameter warnings, jump crosses initialization, const constructor, User Problems -@section How to silence ``unused parameter'' warnings - -@cindex -Wall -@cindex -Wunused - -``When I use @code{-Wall} (or @code{-Wunused}), g++ warns about -unused parameters. But the parameters have to be there, for use -in derived class functions. How do I get g++ to stop complaining?'' - -The answer is to simply omit the names of the unused parameters when -defining the function. This makes clear, both to g++ and to readers -of your code, that the parameter is unused. For example: - -@example -int Foo::bar(int arg) @{ return 0; @} -@end example - -will give a warning for the unused parameter @code{arg}. To suppress -the warning write - -@example -int Foo::bar(int) @{ return 0; @} -@end example - -@node jump crosses initialization, Demangler, unused parameter warnings, User Problems -@section g++ objects to a declaration in a case statement - -``The compiler objects to my declaring a variable in one of the branches -of a case statement. Earlier versions used to accept this code. Why?'' - -The draft standard does not allow a goto or a jump to a case label to -skip over an initialization of a variable or a class object. For -example: - -@example -switch ( i ) @{ - case 1: - Object obj(0); - ... - break; - case 2: - ... - break; -@} -@end example - -The reason is that @code{obj} is also in scope in the rest of the switch -statement. - -As of version 2.7.0, the compiler will object that the jump to the -second case level crosses the initialization of @code{obj}. Older -compiler versions would object only if class Object has a destructor. -In either case, the solution is to add a set of curly braces around -the case branch: - -@example - case 1: - @{ - Object obj(0); - ... - break; - @} -@end example - -@node Demangler, static data members, jump crosses initialization, User Problems -@section Where can I find a demangler? - -@cindex demangler program -A g++-compatible demangler named @code{c++filt} can be found in the -@file{binutils} distribution. This distribution (which also contains -the GNU linker) can be found at any GNU archive site. - -As of version 2.7.0, @code{c++filt} is included with gcc and is -installed automatically. Even better, it is used by the @code{collect} -linker, so you don't see mangled symbols anymore (except on platforms -that use neither collect nor the GNU linker, like Solaris). - -@node static data members, internal compiler error, Demangler, User Problems -@section Linker reports undefined symbols for static data members - -@cindex Static data members -``g++ reports undefined symbols for all my static data members when I link, -even though the program works correctly for compiler XYZ. What's going on?'' - -The problem is almost certainly that you don't give definitions for -your static data members. If you have - -@example -class Foo @{ - ... - void method(); - static int bar; -@}; -@end example - -you have only declared that there is an int named Foo::bar and a member -function named Foo::method that is defined somewhere. You still need to -define @emph{both} method() and bar in some source file. According to -the draft ANSI standard, you must supply an initializer, such as - -@example -int Foo::bar = 0; -@end example - -@noindent -in one (and only one) source file. - -@node internal compiler error, bug reports, static data members, User Problems -@section What does ``Internal compiler error'' mean? - -It means that the compiler has detected a bug in itself. Unfortunately, -g++ still has many bugs, though it is a lot better than it used to be. -If you see this message, please send in a complete bug report (see next -section). - -@node bug reports, porting to g++, internal compiler error, User Problems -@section I think I have found a bug in g++. - -@cindex Bug in g++, newly found -``I think I have found a bug in g++, but I'm not sure. How do I know, -and who should I tell?'' - -@cindex Manual, for gcc -First, see the excellent section on bugs and bug reports in the gcc manual -(which is included in the gcc distribution). As a short summary of that -section: if the compiler gets a fatal signal, for any input, it's a bug -(newer versions of g++ will ask you to send in a bug report when they -detect an error in themselves). Same thing for producing invalid -assembly code. - -When you report a bug, make sure to describe your platform (the type of -computer, and the version of the operating system it is running) and the -version of the compiler that you are running. See the output of the -command @code{g++ -v} if you aren't sure. Also provide enough code -so that the g++ maintainers can duplicate your bug. Remember that the -maintainers won't have your header files; one possibility is to send -the output of the preprocessor (use @code{g++ -E} to get this). This -is what a ``complete bug report'' means. - -I will add some extra notes that are C++-specific, since the notes from -the gcc documentation are generally C-specific. - -@cindex g++ bug report -First, mail your bug report to "bug-g++@@prep.ai.mit.edu". You may also -post to @file{gnu.g++.bug}, but it's better to use mail, particularly if you -have any doubt as to whether your news software generates correct reply -addresses. Don't mail C++ bugs to bug-gcc@@prep.ai.mit.edu. - -@strong{News:} as I write this (late February 1996) the gateway -connecting the bug-g++ mailing list and the @file{gnu.g++.bug} newsgroup -is (temporarily?) broken. Please mail, do not post bug reports. - -@cindex libg++ bug report -If your bug involves libg++ rather than the compiler, mail to -bug-lib-g++@@prep.ai.mit.edu. If you're not sure, choose one, and if you -guessed wrong, the maintainers will forward it to the other list. - -@cindex C++, reference books -@cindex ARM [Annotated C++ Ref Manual] -Second, if your program does one thing, and you think it should do -something else, it is best to consult a good reference if in doubt. -The standard reference is the draft working paper from the ANSI/ISO -C++ standardization committee, which you can get on the net. -For PostScript and PDF (Adobe Acrobat) versions, see the -archive at @file{ftp://research.att.com/dist/stdc++/WP}. For HTML and ASCII -versions, see @file{ftp://ftp.cygnus.com/pub/g++}. On the World Wide Web, see -@file{http://www.cygnus.com/misc/wp/}. - -An older -standard reference is "The Annotated C++ Reference Manual", by Ellis and -Stroustrup (copyright 1990, ISBN #0-201-51459-1). This is what they're -talking about on the net when they refer to ``the ARM''. But you should -know that vast changes have been made to the language since then. - -The ANSI/ISO C++ standards committee have adopted some changes to the -C++ language since the publication of the original ARM, and newer -versions of g++ (2.5.x and later) support some of these changes, notably -the mutable keyword (added in 2.5.0), the bool type (added in 2.6.0), -and changes in the scope of variables defined in for statements (added -in 2.7.0). -You can obtain an addendum to the ARM explaining many of these changes by FTP -from @file{ftp://ftp.std.com/AW/stroustrup2e/new_iso.ps}. - -@cindex AT&T cfront -Note that the behavior of (any version of) AT&T's "cfront" compiler is -NOT the standard for the language. - -@node porting to g++, name mangling, bug reports, User Problems -@section Porting programs from other compilers to g++ - -``I have a program that runs on , and I want -to get it running under g++. Is there anything I should watch out -for?'' - -@cindex Porting to g++ - -Note that g++ supports many of the newer keywords that have recently -been added to the language. Your other C++ compiler may not support -them, so you may need to rename variables and members that conflict -with these keywords. - -There are two other reasons why a program that worked under one compiler -might fail under another: your program may depend on the order of -evaluation of side effects in an expression, or it may depend on the -lifetime of a temporary (you may be assuming that a temporary object -"lives" longer than the standard guarantees). As an example of the -first: - -@example -void func(int,int); - -int i = 3; -func(i++,i++); -@end example - -@cindex Order of evaluation, problems in porting -Novice programmers think that the increments will be evaluated in strict -left-to-right order. Neither C nor C++ guarantees this; the second -increment might happen first, for example. func might get 3,4, or it -might get 4,3. - -@cindex Classes, problems in porting -@cindex Problems in porting, class -The second problem often happens with classes like the libg++ String -class. Let's say I have - -@example -String func1(); -void func2(const char*); -@end example - -and I say - -@example -func2(func1()); -@end example - -because I know that class String has an "operator const char*". So what -really happens is - -@example -func2(func1().convert()); -@end example - -@cindex temporaries -where I'm pretending I have a convert() method that is the same as the -cast. This is unsafe in g++ versions before 2.6.0, because the -temporary String object may be deleted after its last use (the call to -the conversion function), leaving the pointer pointing to garbage, so by -the time func2 is called, it gets an invalid argument. - -@cindex ANSI draft standard -Both the cfront and the old g++ behaviors are legal according to the ARM, -but the powers that be have decided that compiler writers were given -too much freedom here. - -The ANSI C++ committee has now come to a resolution of the lifetime of -temporaries problem: they specify that temporaries should be deleted at -end-of-statement (and at a couple of other points). This means that g++ -versions before 2.6.0 now delete temporaries too early, and cfront -deletes temporaries too late. As of version 2.6.0, g++ does things -according to the new standard. - -@cindex Scope, problems in porting -@cindex Problems in porting, scope -For now, the safe way to write such code is to give the temporary a name, -which forces it to live until the end of the scope of the name. For -example: - -@example -String& tmp = func1(); -func2(tmp); -@end example - -Finally, like all compilers (but especially C++ compilers, it seems), -g++ has bugs, and you may have tweaked one. If so, please file a bug -report (after checking the above issues). - -@node name mangling, problems linking with other libraries, porting to g++, User Problems -@section Why does g++ mangle names differently from other C++ compilers? - -See the answer to the next question. -@cindex Mangling names - -@node problems linking with other libraries, documentation, name mangling, User Problems -@section Why can't g++ code link with code from other C++ compilers? - -``Why can't I link g++-compiled programs against libraries compiled by -some other C++ compiler?'' - -@cindex Mangling names -@cindex Cygnus Support -Some people think that, -if only the FSF and Cygnus Support folks would stop being -stubborn and mangle names the same way that, say, cfront does, then any -g++-compiled program would link successfully against any cfront-compiled -library and vice versa. Name mangling is the least of the problems. -Compilers differ as to how objects are laid out, how multiple inheritance -is implemented, how virtual function calls are handled, and so on, so if -the name mangling were made the same, your programs would link against -libraries provided from other compilers but then crash when run. For this -reason, the ARM @emph{encourages} compiler writers to make their name mangling -different from that of other compilers for the same platform. -Incompatible libraries are then detected at link time, rather than at run -time. -@cindex ARM [Annotated C++ Ref Manual] -@cindex Compiler differences - -@node documentation, templates, problems linking with other libraries, User Problems -@section What documentation exists for g++ 2.x? - -@cindex g++, documentation -Relatively little. -While the gcc manual that comes with the distribution has some coverage -of the C++ part of the compiler, it focuses mainly on the C compiler -(though the information on the ``back end'' pertains to C++ as well). -Still, there is useful information on the command line options and the -#pragma interface and #pragma implementation directives in the manual, -and there is a useful section on template instantiation in the 2.6 version. -There is a Unix-style manual entry, "g++.1", in the gcc-2.x -distribution; the information here is a subset of what is in the manual. - -You can buy a nicely printed and bound copy of this manual from the FSF; -see above for ordering information. - -A draft of a document describing the g++ internals appears in the gcc -distribution (called g++int.texi); it is incomplete but gives lots of -information. - -For class libraries, there are several resources available: - -@itemize @bullet -@item -The libg++ distribution has a manual -@file{libg++/libg++.texi} describing the old libg++ classes, and -another manual @file{libio/iostream.texi} describing the iostreams -implementation. -@item -While there is no libg++-specific document describing the STL -implementation, SGI's web site, at -@file{http://www.sgi.com/Technology/STL/}, is an excellent resource. -Note that the SGI version of STL is the one that is included with the -egcs and 2.8.x releases of g++/libstdc++. - -@end itemize - -@node templates, undefined templates, documentation, User Problems -@section Problems with the template implementation - -@cindex g++, template support -@cindex Templates - -g++ does not implement a separate pass to instantiate template functions -and classes at this point; for this reason, it will not work, for the most -part, to declare your template functions in one file and define them in -another. The compiler will need to see the entire definition of the -function, and will generate a static copy of the function in each file -in which it is used. - -(The experimental template repository code (@pxref{repository}) that -can be added to 2.7.0 or later does implement a separate pass, but there -is still no searching of files that the compiler never saw). - -As of 2.8.x and egcs-1.0.x, the template implementation has most -of the features specified in the draft standard. Still missing are -template arguments that are themselves templates; however, template -class member functions work, and most of the limitations of the older -g++ versions are fixed. - -I think that given this new implementation, it should not be necessary -for users to mess around with switches like @code{-fno-implicit-templates} -and @code{#pragma} directives; most of the time, the default behavior -will work OK. Users of older versions might want to read on. - -@cindex -fno-implicit-templates -For version 2.6.0, however, a new switch @code{-fno-implicit-templates} -was added; with this switch, templates are expanded only under user -control. I recommend that all g++ users that use templates read the -section ``Template Instantiation'' in the gcc manual (version 2.6.x -and newer). g++ now supports explicit template expansion using the -syntax from the latest C++ working paper: - -@example -template class A; -template ostream& operator << (ostream&, const A&); -@end example - -@cindex template limitations -As of version 2.7.2, there are still a few limitations in the template -implementation besides the above (thanks to Jason Merrill for this info): - -@strong{Note}: these problems are eliminated in egcs and in gcc-2.8.x. - -@enumerate 1 -@item -Static data member templates are not supported in compiler versions older -than 2.8.0. You can work around -this by explicitly declaring the static variable for each template -specialization: - -@example -template struct A @{ - static T t; -@}; - -template T A::t = 0; // gets bogus error -int A::t = 0; // OK (workaround) -@end example - -@item -Template member names are not available when defining member function -templates. - -@example -template struct A @{ - typedef T foo; - void f (foo); - void g (foo arg) @{ ... @}; // this works -@}; - -template void A::f (foo) @{ @} // gets bogus error -@end example - -@item -Templates are instantiated using the parser. This results in two -problems (again, these problems are fixed in 2.8.0 and egcs): - -a) Class templates are instantiated in some situations where such -instantiation should not occur. - -@example -template class A @{ @}; -A *aip = 0; // should not instantiate A (but does) -@end example - -b) Function templates cannot be inlined at the site of their -instantiation. - -@example -template inline T min (T a, T b) @{ return a < b ? a : b; @} - -void f () @{ - int i = min (1, 0); // not inlined -@} - -void g () @{ - int j = min (1, 0); // inlined -@} -@end example - -A workaround that works in version 2.6.1 through 2.7.2.x is to specify - -@example -extern template int min (int, int); -@end example - -before @code{f()}; this will force it to be instantiated (though not -emitted). - -@strong{Note:} this kind of ``guiding declaration'' is not standard and -isn't supported by egcs or gcc-2.8.x, as the standard says that this -declares a ``normal'' @code{min} function which has no relation to -the template function @code{min(int,int)}. But then the new -compilers have no problem inlining template functions. - -@item -Member function templates are always instantiated when their containing -class is. This is wrong (fixed in egcs/2.8). -@end enumerate - -@node undefined templates, redundant templates, templates, User Problems -@section I get undefined symbols when using templates - -(Thanks to Jason Merrill for this section). - -@cindex template instantiation -g++ does not automatically instantiate templates defined in other files. -Because of this, code written for cfront will often produce undefined -symbol errors when compiled with g++. You need to tell g++ which template -instances you want, by explicitly instantiating them in the file where they -are defined. For instance, given the files - -@file{templates.h}: -@example -template -class A @{ -public: - void f (); - T t; -@}; - -template void g (T a); -@end example - -@file{templates.cc}: -@example -#include "templates.h" - -template -void A::f () @{ @} - -template -void g (T a) @{ @} -@end example - - -main.cc: -@example -#include "templates.h" - -main () -@{ - A a; - a.f (); - g (a); -@} -@end example - -compiling everything with @code{g++ main.cc templates.cc} will result in -undefined symbol errors for @samp{A::f ()} and @samp{g (A)}. To -fix these errors, add the lines - -@example -template class A; -template void g (A); -@end example - -to the bottom of @samp{templates.cc} and recompile. - -@node redundant templates, Standard Template Library, undefined templates, User Problems -@section I get multiply defined symbols using templates - -You may be running into a bug that was introduced in version 2.6.1 -(and is still present in 2.6.3) that generated external linkage -for templates even when neither @code{-fexternal-templates} nor -@code{-fno-implicit-templates} is specified. There is a patch for -this problem at @* -@file{ftp://ftp.cygnus.com/pub/g++/gcc-2.6.3-template-fix}. - -I recommend either applying the patch or -using @code{-fno-implicit-templates} -together with explicit template instantiation as described in previous -sections. - -This bug is fixed in 2.7.0. - -@node Standard Template Library, STL and string, redundant templates, User Problems -@section Does g++ support the Standard Template Library? - -If you want to use the Standard Template Library, do not pass go, -upgrade immediately to gcc-2.8.x or to egcs. The new C++ front end -handles STL very well, and the high-quality implementation of STL -from SGI is included verbatim as part of the libstdc++ class library. - -If for some reason you must use 2.7.2, you can probably get by with -the hacked-up version of the old implementation from HP that is -included with libg++-2.7.2, but it is definitely inferior and has more -problems. Alternatively, g++ 2.7.2.x users might try the following: -a group at the Moscow Center for Sparc Technology has -a port of the SGI STL implementation that mostly works with gcc-2.7.2. -See -@file{http://www.ipmce.su/people/fbp/stl/stlport.html}. - -Mumit Khan has produced an ``STL newbie guide'' with lots of information -on using STL with gcc. See - -@file{http://www.xraylith.wisc.edu/~khan/software/stl/STL.newbie.html} - -@node STL and string, exceptions, Standard Template Library, User Problems -@section I'm having problems mixing STL and the standard string class - -[ This section is for g++ 2.7.2.x users only ] - -This is due to a bug in g++ version 2.7.2 and 2.7.2.1; the compiler -is confused by the operator declarations. There is an easy workaround, -however; just make sure that the @code{} header is included -before any STL headers. That is, just say - -@example -#include -@end example - -before any other @code{#include} directives. - -Unfortunately, this doesn't solve all problems; you may still have -difficulty with the relational operators !=, <=, >, and >=, thanks -to a conflict with the very general definition of these operators -in function.h. One trick that sometimes works is to try to use == -and < in your code instead of the other operators. Another is to -use a derived class of . The only completely satisfactory -solution, I'm afraid, is to wait for the new release. - -@node exceptions, namespaces, STL and string, User Problems -@section Problems and limitations with exceptions - -The first really usable exceptions implementations are in 2.8.x and -egcs. With these versions, exceptions are enabled by default; use --fno-exceptions to disable exceptions. - -However, 2.8.1 still has not integrated egcs work that computes an -accurate control flow graph in the presence of exceptions. For this -reason, you will sometimes get bogus warnings when compiling with 2.8.1, --O, and -Wall, about uninitialized variables and the like. - -2.7.2.x has very limited and partially broken support for exceptions. -With that compiler, you must -provide the @code{-fhandle-exceptions} flag to enable exception -handling. In version 2.7.2 and older, exceptions may not work properly -(and you may get odd error messages when compiling) if you turn -on optimization (the @code{-O} flag). If you care about exceptions, -please upgrade to a newer compiler! - -In 2.7.2, you must give the @code{-frtti} switch to enable catching -of derived exception objects with handlers for the base exception class; -if @code{-frtti} is not given, only exact type matching works. - -For exception handling to work with 2.7.0 your CPU must be a SPARC, -RS6000/PowerPC, 386/486/Pentium, or ARM. Release 2.7.1 added support -for the Alpha, and ``m68k is rumored to work on some platforms'' -and ``VAX may also work'' (according to Mike Stump). -@emph{It still doesn't work on HP-PA or MIPS platforms.} - -Exception handling adds space overhead (the size of the executable -grows); the problem is worse on the ix86 (Intel-like) architecture -than on RISC architectures. The extra exceptions code is generated -in a separate program section and is only paged in if an exception -is thrown, so the cost is in disk, not in RAM or CPU. - -Exception overhead is much lower on ix86 if you use binutils 2.9 or -later, as gas (the GNU assembler) can now compress the information. - -@node namespaces, agreement with standards, exceptions, User Problems -@section Does g++ support namespaces? - -As of version 2.7.2, g++ recognizes the keywords @code{namespace} and -@code{using}, and there is some rudimentary code present, but almost -nothing connected with namespaces works yet. -The new versions (2.8.x/egcs) still lack namespace support, but to help -compile standard programs they make - -@example -using namespace std; -@end example - -a no-op. There is namespace implementation work going on in the egcs -snapshots (but it hasn't been released yet). - -@node agreement with standards, compiling standard libraries, namespaces, User Problems -@section What are the differences between g++ and the ARM specification of C++? - -@cindex ARM [Annotated C++ Ref Manual] -@cindex exceptions - -Up until recently, there was no really usable exception support. If you -need exceptions, you want gcc-2.8.x or egcs. The implementation works -fairly well. The 2.7.x version was strictly alpha quality and quite -fragile. - -@cindex mutable -Some features that the ANSI/ISO standardization committee has voted in -that don't appear in the ARM are supported, notably the @code{mutable} -keyword, in version 2.5.x. 2.6.x added support for the built-in boolean -type @code{bool}, with constants @code{true} and @code{false}. Run-time -type identification was rudimentary in 2.7.x but is fully supported in -2.8.x, so there are -more reserved words: @code{typeid}, @code{static_cast}, -@code{reinterpret_cast}, @code{const_cast}, and @code{dynamic_cast}. - -@cindex g++ bugs -As with any beta-test compiler, there are bugs. You can help improve -the compiler by submitting detailed bug reports. - -[ This paragraph obsoleted by 2.8.x/egcs: ] -One of the weakest areas of g++ other than templates is the resolution -of overloaded functions and operators in complex cases. The usual -symptom is that in a case where the ARM says that it is ambiguous which -function should be chosen, g++ chooses one (often the first one -declared). This is usually not a problem when porting C++ code from -other compilers to g++, but shows up as errors when code developed under -g++ is ported to other compilers. (I believe this is no longer a -significant problem in 2.7.0 or later). - -[A full bug list would be very long indeed, so I won't put one here; -the sheer complexity of the C++ language means that every compiler I've -tried has some problems. 2.8.x and egcs are a big improvement] - -@node compiling standard libraries, debugging on SVR4 systems, agreement with standards, User Problems -@section Will g++ compile InterViews? The NIH class library? Rogue Wave? - -@cindex NIH class library -@cindex NIHCL with g++ -The NIH class library uses a non-portable, compiler-dependent hack -to initialize itself, which makes life difficult for g++ users. -It will not work without modification, and I don't know what modifications -are required or whether anyone has done them successfully. - -In short, it's not going to happen any time soon (previous FAQs referred -to patches that a new NIHCL release would hopefully contain, but this -hasn't happened). - -@strong{Note:} I thought I saw an item indicating that someone -@emph{had} patched NIHCL to work with g++. Any pointers? - -@cindex InterViews -I think that as of version 2.5.6, the standard g++ will compile the -standard 3.1 InterViews completely successfully. -Note that you'll need the @code{-fno-for-scope} flag -if you use gcc-2.7.0; with 2.7.2 you may be able to omit this flag -but you'll get warnings. - -@cindex Rogue Wave -According to Jason Merrill, gcc-2.7.0 and newer works with Rogue -Wave's @code{tools.h++} class library, but you may want to grab -@file{ftp://ftp.cygnus.com/pub/g++/Tools.h++-6.1-patch}. Again, -you'll need the @code{-fno-for-scope} flag since Rogue Wave hasn't -fixed their code to comply with the new standard yet. - -@node debugging on SVR4 systems, debugging problems on Solaris, compiling standard libraries, User Problems -@section Debugging on SVR4 systems -@cindex System VR4, debugging - -``How do I get debugging to work on my System V Release 4 system?'' - -@cindex DWARF debug format - -Most systems based on System V Release 4 (except Solaris) encode symbolic -debugging information in a format known as `DWARF'. There are two forms -of DWARF, DWARF 1 and DWARF 2. The default is often DWARF 1, which is -not really expressive enough to do C++ correctly. - -Now that we have gdb 4.17, DWARF debugging is finally supported (if -you use gcc 2.8.1 or egcs-1.0.x or newer). - -@cindex stabs -@cindex --with-stabs - -For users of older versions of the tools, you @emph{can} get g++ debugging under SVR4 systems by -configuring gcc with the @code{--with-stabs} option. This causes gcc to -use an alternate debugging format, one more like that used under SunOS4. -You won't need to do anything special to GDB; it will always understand -the ``stabs'' format. - -To specify DWARF 2 output on Unixware, you can give the @code{-ggdb} -switch; alternatively, @code{-gstabs} produces ``stabs'' format. - -@node debugging problems on Solaris, X11 conflicts with libg++, debugging on SVR4 systems, User Problems -@section debugging problems on Solaris - -``I'm on Solaris, and gdb says it doesn't know about some of my local -symbols. Help!'' - -This problem was introduced in gcc 2.7.2; debug symbols for -locals that aren't declared at the beginning of a block come out in the -wrong order, and gdb can't find such symbols. - -This problem is fixed in gcc-2.7.2.1. - -@node X11 conflicts with libg++, assignment to streams, debugging problems on Solaris, User Problems -@section X11 conflicts with libg++ in definition of String -@cindex String, conflicts in definition - -``X11 and Motif define String, and this conflicts with the String class -in libg++. How can I use both together?'' - -One possible method is the following: - -@example -#define String XString -#include -/* include other X11 and Motif headers */ -#undef String -@end example - -and remember to use the correct @code{String} or @code{XString} when -you declare things later. - -@node assignment to streams, , X11 conflicts with libg++, User Problems -@section Why can't I assign one stream to another? - -[ Thanks to Per Bothner and Jerry Schwarz for this section. ] - -Assigning one stream to another seems like a reasonable thing to do, but -it's a bad idea. Usually, this comes up because people want to assign -to @code{cout}. This is poor style, especially for libraries, and is -contrary to good object-oriented design. (Libraries that write directly -to @code{cout} are less flexible, modular, and object-oriented). - -The iostream classes do not allow assigning to arbitrary streams, because -this can violate typing: - -@example -ifstream foo ("foo"); -istrstream str(...); -foo = str; -foo->close (); /* Oops! Not defined for istrstream! */ -@end example - -@cindex assignment to cout - -The original cfront implementation of iostreams by Jerry Schwarz allows -you to assign to @code{cin}, @code{cout}, @code{cerr}, and @code{clog}, -but this is not part of the draft standard for iostreams and generally -isn't considered a good idea, so standard-conforming code shouldn't use -this technique. - -The GNU implementation of iostream did not support assigning to -@code{cin}, @code{cout}, @code{cerr}, and @code{clog} -for quite a while, but it now does, for backward -compatibility with cfront iostream (versions 2.6.1 and later of libg++). - -The ANSI/ISO C++ Working Paper does provide ways of changing the -streambuf associated with a stream. Assignment isn't allowed; -there is an explicit named member that must be used. - -However, it is not wise to do this, and the results are confusing. For -example: @code{fstream::rdbuf} is supposed to return the @emph{original} -filebuf, not the one you assigned. (This is not yet implemented in GNU -iostream.) This must be so because @code{fstream::rdbuf} is defined to -return a @code{filebuf *}. - -@node legalities, index, User Problems, Top -@chapter What are the rules for shipping code built with g++ and libg++? -@cindex Shipping rules -@cindex GPL [GNU Public License] - -``Is it is possible to distribute programs for profit that are created -with g++ and use the g++ libraries?'' - -I am not a lawyer, and this is not legal advice. In any case, I have -little interest in telling people how to violate the spirit of the -GNU licenses without violating the letter. This section tells you -how to comply with the intention of the GNU licenses as best I understand -them. - -@cindex FSF [Free Software Foundation] -The FSF has no objection to your making money. Its only interest is that -source code to their programs, and libraries, and to modified versions of -their programs and libraries, is always available. - -The short answer is that you do not need to release the source to -your program, but you can't just ship a stripped executable either, -unless you use only the subset of libg++ that includes the iostreams -classes (see discussion below) or the new libstdc++ library (available -in libg++ 2.6.2 and later). - -Compiling your code with a GNU compiler does not affect its copyright; -it is still yours. However, in order to ship code that links in a GNU -library such as libg++ there are certain rules you must follow. The -rules are described in the file COPYING.LIB that accompanies gcc -distributions; it is also included in the libg++ distribution. -See that file for the exact rules. The agreement is called the -Library GNU Public License or LGPL. It is much "looser" than the -GNU Public License, or GPL, that covers must GNU programs. - -@cindex libg++, shipping code -Here's the deal: let's say that you use some version of libg++, -completely unchanged, in your software, and you want to ship only -a binary form of your code. You can do this, but there are several -special requirements. If you want to use libg++ but ship only object -code for your code, you have to ship source for libg++ (or ensure -somehow that your customer already has the source for the exact -version you are using), and ship your application in linkable form. -You cannot forbid your customer from reverse-engineering or extending -your program by exploiting its linkable form. - -@cindex libg++, modifying -Furthermore, if you modify libg++ itself, you must provide source -for your modifications (making a derived class does not count as -modifying the library -- that is "a work that uses the library"). - -@cindex special copying conditions for iostreams -For certain portions of libg++ that implement required parts of the C++ -language (such as iostreams and other standard classes), the FSF has -loosened the copyright requirement still more by adding the ``special -exception'' clause, which reads as follows: - -@quotation -As a special exception, if you link this library with files -compiled with GCC to produce an executable, this does not cause -the resulting executable to be covered by the GNU General Public License. -This exception does not however invalidate any other reasons why -the executable file might be covered by the GNU General Public License. -@end quotation - -If your only use of libg++ uses code with this exception, you may ship -stripped executables or license your executables under different -conditions without fear of violating an FSF copyright. It is the intent -of FSF and Cygnus that, as the other classes required by the ANSI/ISO -draft standard are developed, these will also be placed under this -``special exception'' license. -The code in the new libstdc++ library, intended to implement standard -classes as defined by ANSI/ISO, is also licensed this way. - -To avoid coming under the influence of the LGPL, you can link with -@file{-liostream} rather than @file{-lg++} (for version 2.6.x and -earlier), or @file{-lstdc++} now that it is available. In version 2.7.0 -all the standard classes are in @file{-lstdc++}; you can do the link -step with @code{c++} instead of @code{g++} to search only the -@file{-lstdc++} library and avoid the LGPL'ed code in @file{-lg++}. - -Note that in egcs and in gcc-2.8.x, if you do not -specify any libraries the @code{g++} command will only link in -@file{-lstdc++}, so your executable will not be affected by the LGPL -(unless you link in some other LGPLed library: the GNU C library used -on GNU/Linux systems is one such library). - -If you wish to discuss legal issues connected with GNU software on the -net, please use @file{gnu.misc.discuss}, not the technical newsgroups. - -@node index, , legalities, Top -@comment node-name, next, previous, up -@appendix Concept Index - -@printindex cp - -@page -@contents -@bye diff --git a/gcc/cp/g++spec.c b/gcc/cp/g++spec.c deleted file mode 100755 index 806b90e..0000000 --- a/gcc/cp/g++spec.c +++ /dev/null @@ -1,266 +0,0 @@ -/* Specific flags and argument handling of the C++ front-end. - Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. - -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 -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "config.h" -#include "system.h" - -/* This bit is set if we saw a `-xfoo' language specification. */ -#define LANGSPEC (1<<1) -/* This bit is set if they did `-lm' or `-lmath'. */ -#define MATHLIB (1<<2) -/* This bit is set if they did `-lc'. */ -#define WITHLIBC (1<<3) - -#ifndef MATH_LIBRARY -#define MATH_LIBRARY "-lm" -#endif - -#ifndef LIBSTDCXX -#define LIBSTDCXX "-lstdc++" -#endif - -void -lang_specific_driver (fn, in_argc, in_argv, in_added_libraries) - void (*fn)(); - int *in_argc; - char ***in_argv; - int *in_added_libraries; -{ - int i, j; - - /* If non-zero, the user gave us the `-v' flag. */ - int saw_verbose_flag = 0; - - /* This will be 0 if we encounter a situation where we should not - link in libstdc++. */ - int library = 1; - - /* The number of arguments being added to what's in argv, other than - libraries. We use this to track the number of times we've inserted - -xc++/-xnone. */ - int added = 2; - - /* Used to track options that take arguments, so we don't go wrapping - those with -xc++/-xnone. */ - char *quote = NULL; - - /* The new argument list will be contained in this. */ - char **arglist; - - /* Non-zero if we saw a `-xfoo' language specification on the - command line. Used to avoid adding our own -xc++ if the user - already gave a language for the file. */ - int saw_speclang = 0; - - /* "-lm" or "-lmath" if it appears on the command line. */ - char *saw_math = 0; - - /* "-lc" if it appears on the command line. */ - char *saw_libc = 0; - - /* An array used to flag each argument that needs a bit set for - LANGSPEC, MATHLIB, or WITHLIBC. */ - int *args; - - /* By default, we throw on the math library if we have one. */ - int need_math = (MATH_LIBRARY[0] != '\0'); - - /* The total number of arguments with the new stuff. */ - int argc; - - /* The argument list. */ - char **argv; - - /* The number of libraries added in. */ - int added_libraries; - - /* The total number of arguments with the new stuff. */ - int num_args = 1; - - argc = *in_argc; - argv = *in_argv; - added_libraries = *in_added_libraries; - - args = (int *) xmalloc (argc * sizeof (int)); - bzero ((char *) args, argc * sizeof (int)); - - for (i = 1; i < argc; i++) - { - /* If the previous option took an argument, we swallow it here. */ - if (quote) - { - quote = NULL; - continue; - } - - /* We don't do this anymore, since we don't get them with minus - signs on them. */ - if (argv[i][0] == '\0' || argv[i][1] == '\0') - continue; - - if (argv[i][0] == '-') - { - if (library != 0 && (strcmp (argv[i], "-nostdlib") == 0 - || strcmp (argv[i], "-nodefaultlibs") == 0)) - { - library = 0; - } - else if (strcmp (argv[i], "-lm") == 0 - || strcmp (argv[i], "-lmath") == 0 - || strcmp (argv[i], MATH_LIBRARY) == 0 -#ifdef ALT_LIBM - || strcmp (argv[i], ALT_LIBM) == 0 -#endif - ) - { - args[i] |= MATHLIB; - need_math = 0; - } - else if (strcmp (argv[i], "-lc") == 0) - args[i] |= WITHLIBC; - else if (strcmp (argv[i], "-v") == 0) - { - saw_verbose_flag = 1; - if (argc == 2) - { - /* If they only gave us `-v', don't try to link - in libg++. */ - library = 0; - } - } - else if (strncmp (argv[i], "-x", 2) == 0) - saw_speclang = 1; - else if (((argv[i][2] == '\0' - && (char *)strchr ("bBVDUoeTuIYmLiA", argv[i][1]) != NULL) - || strcmp (argv[i], "-Tdata") == 0)) - quote = argv[i]; - else if (library != 0 && ((argv[i][2] == '\0' - && (char *) strchr ("cSEM", argv[i][1]) != NULL) - || strcmp (argv[i], "-MM") == 0)) - { - /* Don't specify libraries if we won't link, since that would - cause a warning. */ - library = 0; - added -= 2; - } - else - /* Pass other options through. */ - continue; - } - else - { - int len; - - if (saw_speclang) - { - saw_speclang = 0; - continue; - } - - /* If the filename ends in .c or .i, put options around it. - But not if a specified -x option is currently active. */ - len = strlen (argv[i]); - if (len > 2 - && (argv[i][len - 1] == 'c' || argv[i][len - 1] == 'i') - && argv[i][len - 2] == '.') - { - args[i] |= LANGSPEC; - added += 2; - } - } - } - - if (quote) - (*fn) ("argument to `%s' missing\n", quote); - - /* If we know we don't have to do anything, bail now. */ - if (! added && ! library) - { - free (args); - return; - } - - num_args = argc + added + need_math; - arglist = (char **) xmalloc (num_args * sizeof (char *)); - - /* NOTE: We start at 1 now, not 0. */ - for (i = 0, j = 0; i < argc; i++, j++) - { - arglist[j] = argv[i]; - - /* Make sure -lstdc++ is before the math library, since libstdc++ - itself uses those math routines. */ - if (!saw_math && (args[i] & MATHLIB) && library) - { - --j; - saw_math = argv[i]; - } - - if (!saw_libc && (args[i] & WITHLIBC) && library) - { - --j; - saw_libc = argv[i]; - } - - /* Wrap foo.c and foo.i files in a language specification to - force the gcc compiler driver to run cc1plus on them. */ - if (args[i] & LANGSPEC) - { - int len = strlen (argv[i]); - if (argv[i][len - 1] == 'i') - arglist[j++] = "-xc++-cpp-output"; - else - arglist[j++] = "-xc++"; - arglist[j++] = argv[i]; - arglist[j] = "-xnone"; - } - } - - /* Add `-lstdc++' if we haven't already done so. */ - if (library) - { - arglist[j++] = LIBSTDCXX; - added_libraries++; - } - if (saw_math) - arglist[j++] = saw_math; - else if (library && need_math) - { - arglist[j++] = MATH_LIBRARY; - added_libraries++; - } - if (saw_libc) - arglist[j++] = saw_libc; - - arglist[j] = NULL; - - *in_argc = j; - *in_argv = arglist; - *in_added_libraries = added_libraries; -} - -/* Called before linking. Returns 0 on success and -1 on failure. */ -int lang_specific_pre_link () /* Not used for C++. */ -{ - return 0; -} - -/* Number of extra output files that lang_specific_pre_link may generate. */ -int lang_specific_extra_outfiles = 0; /* Not used for C++. */ diff --git a/gcc/cp/gxx.gperf b/gcc/cp/gxx.gperf deleted file mode 100755 index 5632f7f..0000000 --- a/gcc/cp/gxx.gperf +++ /dev/null @@ -1,111 +0,0 @@ -%{ -/* Command-line: gperf -L KR-C -F ', 0, 0' -p -j1 -g -o -t -N is_reserved_word -k1,4,$,7 gplus.gperf */ -%} -struct resword { char *name; short token; enum rid rid;}; -%% -__alignof, ALIGNOF, NORID -__alignof__, ALIGNOF, NORID -__asm, ASM_KEYWORD, NORID -__asm__, ASM_KEYWORD, NORID -__attribute, ATTRIBUTE, NORID -__attribute__, ATTRIBUTE, NORID -__complex, TYPESPEC, RID_COMPLEX -__complex__, TYPESPEC, RID_COMPLEX -__const, CV_QUALIFIER, RID_CONST -__const__, CV_QUALIFIER, RID_CONST -__extension__, EXTENSION, NORID -__imag, IMAGPART, NORID -__imag__, IMAGPART, NORID -__inline, SCSPEC, RID_INLINE -__inline__, SCSPEC, RID_INLINE -__label__, LABEL, NORID -__null, CONSTANT, RID_NULL -__real, REALPART, NORID -__real__, REALPART, NORID -__restrict, CV_QUALIFIER, RID_RESTRICT -__restrict__, CV_QUALIFIER, RID_RESTRICT -__signature__, AGGR, RID_SIGNATURE /* Extension */, -__signed, TYPESPEC, RID_SIGNED -__signed__, TYPESPEC, RID_SIGNED -__sigof__, SIGOF, NORID /* Extension */, -__typeof, TYPEOF, NORID -__typeof__, TYPEOF, NORID -__volatile, CV_QUALIFIER, RID_VOLATILE -__volatile__, CV_QUALIFIER, RID_VOLATILE -__wchar_t, TYPESPEC, RID_WCHAR /* Unique to ANSI C++ */, -asm, ASM_KEYWORD, NORID, -and, ANDAND, NORID, -and_eq, ASSIGN, NORID, -auto, SCSPEC, RID_AUTO, -bitand, '&', NORID, -bitor, '|', NORID, -bool, TYPESPEC, RID_BOOL, -break, BREAK, NORID, -case, CASE, NORID, -catch, CATCH, NORID, -char, TYPESPEC, RID_CHAR, -class, AGGR, RID_CLASS, -compl, '~', NORID, -const, CV_QUALIFIER, RID_CONST, -const_cast, CONST_CAST, NORID, -continue, CONTINUE, NORID, -default, DEFAULT, NORID, -delete, DELETE, NORID, -do, DO, NORID, -double, TYPESPEC, RID_DOUBLE, -dynamic_cast, DYNAMIC_CAST, NORID, -else, ELSE, NORID, -enum, ENUM, NORID, -explicit, SCSPEC, RID_EXPLICIT, -export, SCSPEC, RID_EXPORT, -extern, SCSPEC, RID_EXTERN, -false, CXX_FALSE, NORID, -float, TYPESPEC, RID_FLOAT, -for, FOR, NORID, -friend, SCSPEC, RID_FRIEND, -goto, GOTO, NORID, -if, IF, NORID, -inline, SCSPEC, RID_INLINE, -int, TYPESPEC, RID_INT, -long, TYPESPEC, RID_LONG, -mutable, SCSPEC, RID_MUTABLE, -namespace, NAMESPACE, NORID, -new, NEW, NORID, -not, '!', NORID, -not_eq, EQCOMPARE, NORID, -operator, OPERATOR, NORID, -or, OROR, NORID, -or_eq, ASSIGN, NORID, -private, VISSPEC, RID_PRIVATE, -protected, VISSPEC, RID_PROTECTED, -public, VISSPEC, RID_PUBLIC, -register, SCSPEC, RID_REGISTER, -reinterpret_cast, REINTERPRET_CAST, NORID, -return, RETURN, NORID, -short, TYPESPEC, RID_SHORT, -signature, AGGR, RID_SIGNATURE /* Extension */, -signed, TYPESPEC, RID_SIGNED, -sigof, SIGOF, NORID /* Extension */, -sizeof, SIZEOF, NORID, -static, SCSPEC, RID_STATIC, -static_cast, STATIC_CAST, NORID, -struct, AGGR, RID_RECORD, -switch, SWITCH, NORID, -template, TEMPLATE, RID_TEMPLATE, -this, THIS, NORID, -throw, THROW, NORID, -true, CXX_TRUE, NORID, -try, TRY, NORID, -typedef, SCSPEC, RID_TYPEDEF, -typename, TYPENAME_KEYWORD, NORID, -typeid, TYPEID, NORID, -typeof, TYPEOF, NORID, -union, AGGR, RID_UNION, -unsigned, TYPESPEC, RID_UNSIGNED, -using, USING, NORID, -virtual, SCSPEC, RID_VIRTUAL, -void, TYPESPEC, RID_VOID, -volatile, CV_QUALIFIER, RID_VOLATILE, -while, WHILE, NORID, -xor, '^', NORID, -xor_eq, ASSIGN, NORID, diff --git a/gcc/cp/gxxint.texi b/gcc/cp/gxxint.texi deleted file mode 100755 index 3b8242d..0000000 --- a/gcc/cp/gxxint.texi +++ /dev/null @@ -1,1867 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@c %**start of header -@setfilename g++int.info -@settitle G++ internals -@setchapternewpage odd -@c %**end of header - -@node Top, Limitations of g++, (dir), (dir) -@chapter Internal Architecture of the Compiler - -This is meant to describe the C++ front-end for gcc in detail. -Questions and comments to Benjamin Kosnik @code{}. - -@menu -* Limitations of g++:: -* Routines:: -* Implementation Specifics:: -* Glossary:: -* Macros:: -* Typical Behavior:: -* Coding Conventions:: -* Templates:: -* Access Control:: -* Error Reporting:: -* Parser:: -* Copying Objects:: -* Exception Handling:: -* Free Store:: -* Mangling:: Function name mangling for C++ and Java -* Concept Index:: -@end menu - -@node Limitations of g++, Routines, Top, Top -@section Limitations of g++ - -@itemize @bullet -@item -Limitations on input source code: 240 nesting levels with the parser -stacksize (YYSTACKSIZE) set to 500 (the default), and requires around -16.4k swap space per nesting level. The parser needs about 2.09 * -number of nesting levels worth of stackspace. - -@cindex pushdecl_class_level -@item -I suspect there are other uses of pushdecl_class_level that do not call -set_identifier_type_value in tandem with the call to -pushdecl_class_level. It would seem to be an omission. - -@cindex access checking -@item -Access checking is unimplemented for nested types. - -@cindex @code{volatile} -@item -@code{volatile} is not implemented in general. - -@end itemize - -@node Routines, Implementation Specifics, Limitations of g++, Top -@section Routines - -This section describes some of the routines used in the C++ front-end. - -@code{build_vtable} and @code{prepare_fresh_vtable} is used only within -the @file{cp-class.c} file, and only in @code{finish_struct} and -@code{modify_vtable_entries}. - -@code{build_vtable}, @code{prepare_fresh_vtable}, and -@code{finish_struct} are the only routines that set @code{DECL_VPARENT}. - -@code{finish_struct} can steal the virtual function table from parents, -this prohibits related_vslot from working. When finish_struct steals, -we know that - -@example -get_binfo (DECL_FIELD_CONTEXT (CLASSTYPE_VFIELD (t)), t, 0) -@end example - -@noindent -will get the related binfo. - -@code{layout_basetypes} does something with the VIRTUALS. - -Supposedly (according to Tiemann) most of the breadth first searching -done, like in @code{get_base_distance} and in @code{get_binfo} was not -because of any design decision. I have since found out the at least one -part of the compiler needs the notion of depth first binfo searching, I -am going to try and convert the whole thing, it should just work. The -term left-most refers to the depth first left-most node. It uses -@code{MAIN_VARIANT == type} as the condition to get left-most, because -the things that have @code{BINFO_OFFSET}s of zero are shared and will -have themselves as their own @code{MAIN_VARIANT}s. The non-shared right -ones, are copies of the left-most one, hence if it is its own -@code{MAIN_VARIANT}, we know it IS a left-most one, if it is not, it is -a non-left-most one. - -@code{get_base_distance}'s path and distance matters in its use in: - -@itemize @bullet -@item -@code{prepare_fresh_vtable} (the code is probably wrong) -@item -@code{init_vfields} Depends upon distance probably in a safe way, -build_offset_ref might use partial paths to do further lookups, -hack_identifier is probably not properly checking access. - -@item -@code{get_first_matching_virtual} probably should check for -@code{get_base_distance} returning -2. - -@item -@code{resolve_offset_ref} should be called in a more deterministic -manner. Right now, it is called in some random contexts, like for -arguments at @code{build_method_call} time, @code{default_conversion} -time, @code{convert_arguments} time, @code{build_unary_op} time, -@code{build_c_cast} time, @code{build_modify_expr} time, -@code{convert_for_assignment} time, and -@code{convert_for_initialization} time. - -But, there are still more contexts it needs to be called in, one was the -ever simple: - -@example -if (obj.*pmi != 7) - @dots{} -@end example - -Seems that the problems were due to the fact that @code{TREE_TYPE} of -the @code{OFFSET_REF} was not a @code{OFFSET_TYPE}, but rather the type -of the referent (like @code{INTEGER_TYPE}). This problem was fixed by -changing @code{default_conversion} to check @code{TREE_CODE (x)}, -instead of only checking @code{TREE_CODE (TREE_TYPE (x))} to see if it -was @code{OFFSET_TYPE}. - -@end itemize - -@node Implementation Specifics, Glossary, Routines, Top -@section Implementation Specifics - -@itemize @bullet -@item Explicit Initialization - -The global list @code{current_member_init_list} contains the list of -mem-initializers specified in a constructor declaration. For example: - -@example -foo::foo() : a(1), b(2) @{@} -@end example - -@noindent -will initialize @samp{a} with 1 and @samp{b} with 2. -@code{expand_member_init} places each initialization (a with 1) on the -global list. Then, when the fndecl is being processed, -@code{emit_base_init} runs down the list, initializing them. It used to -be the case that g++ first ran down @code{current_member_init_list}, -then ran down the list of members initializing the ones that weren't -explicitly initialized. Things were rewritten to perform the -initializations in order of declaration in the class. So, for the above -example, @samp{a} and @samp{b} will be initialized in the order that -they were declared: - -@example -class foo @{ public: int b; int a; foo (); @}; -@end example - -@noindent -Thus, @samp{b} will be initialized with 2 first, then @samp{a} will be -initialized with 1, regardless of how they're listed in the mem-initializer. - -@item The Explicit Keyword - -The use of @code{explicit} on a constructor is used by @code{grokdeclarator} -to set the field @code{DECL_NONCONVERTING_P}. That value is used by -@code{build_method_call} and @code{build_user_type_conversion_1} to decide -if a particular constructor should be used as a candidate for conversions. - -@end itemize - -@node Glossary, Macros, Implementation Specifics, Top -@section Glossary - -@table @r -@item binfo -The main data structure in the compiler used to represent the -inheritance relationships between classes. The data in the binfo can be -accessed by the BINFO_ accessor macros. - -@item vtable -@itemx virtual function table - -The virtual function table holds information used in virtual function -dispatching. In the compiler, they are usually referred to as vtables, -or vtbls. The first index is not used in the normal way, I believe it -is probably used for the virtual destructor. - -@item vfield - -vfields can be thought of as the base information needed to build -vtables. For every vtable that exists for a class, there is a vfield. -See also vtable and virtual function table pointer. When a type is used -as a base class to another type, the virtual function table for the -derived class can be based upon the vtable for the base class, just -extended to include the additional virtual methods declared in the -derived class. The virtual function table from a virtual base class is -never reused in a derived class. @code{is_normal} depends upon this. - -@item virtual function table pointer - -These are @code{FIELD_DECL}s that are pointer types that point to -vtables. See also vtable and vfield. -@end table - -@node Macros, Typical Behavior, Glossary, Top -@section Macros - -This section describes some of the macros used on trees. The list -should be alphabetical. Eventually all macros should be documented -here. - -@table @code -@item BINFO_BASETYPES -A vector of additional binfos for the types inherited by this basetype. -The binfos are fully unshared (except for virtual bases, in which -case the binfo structure is shared). - - If this basetype describes type D as inherited in C, - and if the basetypes of D are E anf F, - then this vector contains binfos for inheritance of E and F by C. - -Has values of: - - TREE_VECs - - -@item BINFO_INHERITANCE_CHAIN -Temporarily used to represent specific inheritances. It usually points -to the binfo associated with the lesser derived type, but it can be -reversed by reverse_path. For example: - -@example - Z ZbY least derived - | - Y YbX - | - X Xb most derived - -TYPE_BINFO (X) == Xb -BINFO_INHERITANCE_CHAIN (Xb) == YbX -BINFO_INHERITANCE_CHAIN (Yb) == ZbY -BINFO_INHERITANCE_CHAIN (Zb) == 0 -@end example - -Not sure is the above is really true, get_base_distance has is point -towards the most derived type, opposite from above. - -Set by build_vbase_path, recursive_bounded_basetype_p, -get_base_distance, lookup_field, lookup_fnfields, and reverse_path. - -What things can this be used on: - - TREE_VECs that are binfos - - -@item BINFO_OFFSET -The offset where this basetype appears in its containing type. -BINFO_OFFSET slot holds the offset (in bytes) from the base of the -complete object to the base of the part of the object that is allocated -on behalf of this `type'. This is always 0 except when there is -multiple inheritance. - -Used on TREE_VEC_ELTs of the binfos BINFO_BASETYPES (...) for example. - - -@item BINFO_VIRTUALS -A unique list of functions for the virtual function table. See also -TYPE_BINFO_VIRTUALS. - -What things can this be used on: - - TREE_VECs that are binfos - - -@item BINFO_VTABLE -Used to find the VAR_DECL that is the virtual function table associated -with this binfo. See also TYPE_BINFO_VTABLE. To get the virtual -function table pointer, see CLASSTYPE_VFIELD. - -What things can this be used on: - - TREE_VECs that are binfos - -Has values of: - - VAR_DECLs that are virtual function tables - - -@item BLOCK_SUPERCONTEXT -In the outermost scope of each function, it points to the FUNCTION_DECL -node. It aids in better DWARF support of inline functions. - - -@item CLASSTYPE_TAGS -CLASSTYPE_TAGS is a linked (via TREE_CHAIN) list of member classes of a -class. TREE_PURPOSE is the name, TREE_VALUE is the type (pushclass scans -these and calls pushtag on them.) - -finish_struct scans these to produce TYPE_DECLs to add to the -TYPE_FIELDS of the type. - -It is expected that name found in the TREE_PURPOSE slot is unique, -resolve_scope_to_name is one such place that depends upon this -uniqueness. - - -@item CLASSTYPE_METHOD_VEC -The following is true after finish_struct has been called (on the -class?) but not before. Before finish_struct is called, things are -different to some extent. Contains a TREE_VEC of methods of the class. -The TREE_VEC_LENGTH is the number of differently named methods plus one -for the 0th entry. The 0th entry is always allocated, and reserved for -ctors and dtors. If there are none, TREE_VEC_ELT(N,0) == NULL_TREE. -Each entry of the TREE_VEC is a FUNCTION_DECL. For each FUNCTION_DECL, -there is a DECL_CHAIN slot. If the FUNCTION_DECL is the last one with a -given name, the DECL_CHAIN slot is NULL_TREE. Otherwise it is the next -method that has the same name (but a different signature). It would -seem that it is not true that because the DECL_CHAIN slot is used in -this way, we cannot call pushdecl to put the method in the global scope -(cause that would overwrite the TREE_CHAIN slot), because they use -different _CHAINs. finish_struct_methods setups up one version of the -TREE_CHAIN slots on the FUNCTION_DECLs. - -friends are kept in TREE_LISTs, so that there's no need to use their -TREE_CHAIN slot for anything. - -Has values of: - - TREE_VECs - - -@item CLASSTYPE_VFIELD -Seems to be in the process of being renamed TYPE_VFIELD. Use on types -to get the main virtual function table pointer. To get the virtual -function table use BINFO_VTABLE (TYPE_BINFO ()). - -Has values of: - - FIELD_DECLs that are virtual function table pointers - -What things can this be used on: - - RECORD_TYPEs - - -@item DECL_CLASS_CONTEXT -Identifies the context that the _DECL was found in. For virtual function -tables, it points to the type associated with the virtual function -table. See also DECL_CONTEXT, DECL_FIELD_CONTEXT and DECL_FCONTEXT. - -The difference between this and DECL_CONTEXT, is that for virtuals -functions like: - -@example -struct A -@{ - virtual int f (); -@}; - -struct B : A -@{ - int f (); -@}; - -DECL_CONTEXT (A::f) == A -DECL_CLASS_CONTEXT (A::f) == A - -DECL_CONTEXT (B::f) == A -DECL_CLASS_CONTEXT (B::f) == B -@end example - -Has values of: - - RECORD_TYPEs, or UNION_TYPEs - -What things can this be used on: - - TYPE_DECLs, _DECLs - - -@item DECL_CONTEXT -Identifies the context that the _DECL was found in. Can be used on -virtual function tables to find the type associated with the virtual -function table, but since they are FIELD_DECLs, DECL_FIELD_CONTEXT is a -better access method. Internally the same as DECL_FIELD_CONTEXT, so -don't us both. See also DECL_FIELD_CONTEXT, DECL_FCONTEXT and -DECL_CLASS_CONTEXT. - -Has values of: - - RECORD_TYPEs - - -What things can this be used on: - -@display -VAR_DECLs that are virtual function tables -_DECLs -@end display - - -@item DECL_FIELD_CONTEXT -Identifies the context that the FIELD_DECL was found in. Internally the -same as DECL_CONTEXT, so don't us both. See also DECL_CONTEXT, -DECL_FCONTEXT and DECL_CLASS_CONTEXT. - -Has values of: - - RECORD_TYPEs - -What things can this be used on: - -@display -FIELD_DECLs that are virtual function pointers -FIELD_DECLs -@end display - - -@item DECL_NAME - -Has values of: - -@display -0 for things that don't have names -IDENTIFIER_NODEs for TYPE_DECLs -@end display - -@item DECL_IGNORED_P -A bit that can be set to inform the debug information output routines in -the back-end that a certain _DECL node should be totally ignored. - -Used in cases where it is known that the debugging information will be -output in another file, or where a sub-type is known not to be needed -because the enclosing type is not needed. - -A compiler constructed virtual destructor in derived classes that do not -define an explicit destructor that was defined explicit in a base class -has this bit set as well. Also used on __FUNCTION__ and -__PRETTY_FUNCTION__ to mark they are ``compiler generated.'' c-decl and -c-lex.c both want DECL_IGNORED_P set for ``internally generated vars,'' -and ``user-invisible variable.'' - -Functions built by the C++ front-end such as default destructors, -virtual destructors and default constructors want to be marked that -they are compiler generated, but unsure why. - -Currently, it is used in an absolute way in the C++ front-end, as an -optimization, to tell the debug information output routines to not -generate debugging information that will be output by another separately -compiled file. - - -@item DECL_VIRTUAL_P -A flag used on FIELD_DECLs and VAR_DECLs. (Documentation in tree.h is -wrong.) Used in VAR_DECLs to indicate that the variable is a vtable. -It is also used in FIELD_DECLs for vtable pointers. - -What things can this be used on: - - FIELD_DECLs and VAR_DECLs - - -@item DECL_VPARENT -Used to point to the parent type of the vtable if there is one, else it -is just the type associated with the vtable. Because of the sharing of -virtual function tables that goes on, this slot is not very useful, and -is in fact, not used in the compiler at all. It can be removed. - -What things can this be used on: - - VAR_DECLs that are virtual function tables - -Has values of: - - RECORD_TYPEs maybe UNION_TYPEs - - -@item DECL_FCONTEXT -Used to find the first baseclass in which this FIELD_DECL is defined. -See also DECL_CONTEXT, DECL_FIELD_CONTEXT and DECL_CLASS_CONTEXT. - -How it is used: - - Used when writing out debugging information about vfield and - vbase decls. - -What things can this be used on: - - FIELD_DECLs that are virtual function pointers - FIELD_DECLs - - -@item DECL_REFERENCE_SLOT -Used to hold the initialize for the reference. - -What things can this be used on: - - PARM_DECLs and VAR_DECLs that have a reference type - - -@item DECL_VINDEX -Used for FUNCTION_DECLs in two different ways. Before the structure -containing the FUNCTION_DECL is laid out, DECL_VINDEX may point to a -FUNCTION_DECL in a base class which is the FUNCTION_DECL which this -FUNCTION_DECL will replace as a virtual function. When the class is -laid out, this pointer is changed to an INTEGER_CST node which is -suitable to find an index into the virtual function table. See -get_vtable_entry as to how one can find the right index into the virtual -function table. The first index 0, of a virtual function table it not -used in the normal way, so the first real index is 1. - -DECL_VINDEX may be a TREE_LIST, that would seem to be a list of -overridden FUNCTION_DECLs. add_virtual_function has code to deal with -this when it uses the variable base_fndecl_list, but it would seem that -somehow, it is possible for the TREE_LIST to pursist until method_call, -and it should not. - - -What things can this be used on: - - FUNCTION_DECLs - - -@item DECL_SOURCE_FILE -Identifies what source file a particular declaration was found in. - -Has values of: - - "" on TYPE_DECLs to mean the typedef is built in - - -@item DECL_SOURCE_LINE -Identifies what source line number in the source file the declaration -was found at. - -Has values of: - -@display -0 for an undefined label - -0 for TYPE_DECLs that are internally generated - -0 for FUNCTION_DECLs for functions generated by the compiler - (not yet, but should be) - -0 for ``magic'' arguments to functions, that the user has no - control over -@end display - - -@item TREE_USED - -Has values of: - - 0 for unused labels - - -@item TREE_ADDRESSABLE -A flag that is set for any type that has a constructor. - - -@item TREE_COMPLEXITY -They seem a kludge way to track recursion, poping, and pushing. They only -appear in cp-decl.c and cp-decl2.c, so the are a good candidate for -proper fixing, and removal. - - -@item TREE_HAS_CONSTRUCTOR -A flag to indicate when a CALL_EXPR represents a call to a constructor. -If set, we know that the type of the object, is the complete type of the -object, and that the value returned is nonnull. When used in this -fashion, it is an optimization. Can also be used on SAVE_EXPRs to -indicate when they are of fixed type and nonnull. Can also be used on -INDIRECT_EXPRs on CALL_EXPRs that represent a call to a constructor. - - -@item TREE_PRIVATE -Set for FIELD_DECLs by finish_struct. But not uniformly set. - -The following routines do something with PRIVATE access: -build_method_call, alter_access, finish_struct_methods, -finish_struct, convert_to_aggr, CWriteLanguageDecl, CWriteLanguageType, -CWriteUseObject, compute_access, lookup_field, dfs_pushdecl, -GNU_xref_member, dbxout_type_fields, dbxout_type_method_1 - - -@item TREE_PROTECTED -The following routines do something with PROTECTED access: -build_method_call, alter_access, finish_struct, convert_to_aggr, -CWriteLanguageDecl, CWriteLanguageType, CWriteUseObject, -compute_access, lookup_field, GNU_xref_member, dbxout_type_fields, -dbxout_type_method_1 - - -@item TYPE_BINFO -Used to get the binfo for the type. - -Has values of: - - TREE_VECs that are binfos - -What things can this be used on: - - RECORD_TYPEs - - -@item TYPE_BINFO_BASETYPES -See also BINFO_BASETYPES. - -@item TYPE_BINFO_VIRTUALS -A unique list of functions for the virtual function table. See also -BINFO_VIRTUALS. - -What things can this be used on: - - RECORD_TYPEs - - -@item TYPE_BINFO_VTABLE -Points to the virtual function table associated with the given type. -See also BINFO_VTABLE. - -What things can this be used on: - - RECORD_TYPEs - -Has values of: - - VAR_DECLs that are virtual function tables - - -@item TYPE_NAME -Names the type. - -Has values of: - -@display -0 for things that don't have names. -should be IDENTIFIER_NODE for RECORD_TYPEs UNION_TYPEs and - ENUM_TYPEs. -TYPE_DECL for RECORD_TYPEs, UNION_TYPEs and ENUM_TYPEs, but - shouldn't be. -TYPE_DECL for typedefs, unsure why. -@end display - -What things can one use this on: - -@display -TYPE_DECLs -RECORD_TYPEs -UNION_TYPEs -ENUM_TYPEs -@end display - -History: - - It currently points to the TYPE_DECL for RECORD_TYPEs, - UNION_TYPEs and ENUM_TYPEs, but it should be history soon. - - -@item TYPE_METHODS -Synonym for @code{CLASSTYPE_METHOD_VEC}. Chained together with -@code{TREE_CHAIN}. @file{dbxout.c} uses this to get at the methods of a -class. - - -@item TYPE_DECL -Used to represent typedefs, and used to represent bindings layers. - -Components: - - DECL_NAME is the name of the typedef. For example, foo would - be found in the DECL_NAME slot when @code{typedef int foo;} is - seen. - - DECL_SOURCE_LINE identifies what source line number in the - source file the declaration was found at. A value of 0 - indicates that this TYPE_DECL is just an internal binding layer - marker, and does not correspond to a user supplied typedef. - - DECL_SOURCE_FILE - -@item TYPE_FIELDS -A linked list (via @code{TREE_CHAIN}) of member types of a class. The -list can contain @code{TYPE_DECL}s, but there can also be other things -in the list apparently. See also @code{CLASSTYPE_TAGS}. - - -@item TYPE_VIRTUAL_P -A flag used on a @code{FIELD_DECL} or a @code{VAR_DECL}, indicates it is -a virtual function table or a pointer to one. When used on a -@code{FUNCTION_DECL}, indicates that it is a virtual function. When -used on an @code{IDENTIFIER_NODE}, indicates that a function with this -same name exists and has been declared virtual. - -When used on types, it indicates that the type has virtual functions, or -is derived from one that does. - -Not sure if the above about virtual function tables is still true. See -also info on @code{DECL_VIRTUAL_P}. - -What things can this be used on: - - FIELD_DECLs, VAR_DECLs, FUNCTION_DECLs, IDENTIFIER_NODEs - - -@item VF_BASETYPE_VALUE -Get the associated type from the binfo that caused the given vfield to -exist. This is the least derived class (the most parent class) that -needed a virtual function table. It is probably the case that all uses -of this field are misguided, but they need to be examined on a -case-by-case basis. See history for more information on why the -previous statement was made. - -Set at @code{finish_base_struct} time. - -What things can this be used on: - - TREE_LISTs that are vfields - -History: - - This field was used to determine if a virtual function table's - slot should be filled in with a certain virtual function, by - checking to see if the type returned by VF_BASETYPE_VALUE was a - parent of the context in which the old virtual function existed. - This incorrectly assumes that a given type _could_ not appear as - a parent twice in a given inheritance lattice. For single - inheritance, this would in fact work, because a type could not - possibly appear more than once in an inheritance lattice, but - with multiple inheritance, a type can appear more than once. - - -@item VF_BINFO_VALUE -Identifies the binfo that caused this vfield to exist. If this vfield -is from the first direct base class that has a virtual function table, -then VF_BINFO_VALUE is NULL_TREE, otherwise it will be the binfo of the -direct base where the vfield came from. Can use @code{TREE_VIA_VIRTUAL} -on result to find out if it is a virtual base class. Related to the -binfo found by - -@example -get_binfo (VF_BASETYPE_VALUE (vfield), t, 0) -@end example - -@noindent -where @samp{t} is the type that has the given vfield. - -@example -get_binfo (VF_BASETYPE_VALUE (vfield), t, 0) -@end example - -@noindent -will return the binfo for the given vfield. - -May or may not be set at @code{modify_vtable_entries} time. Set at -@code{finish_base_struct} time. - -What things can this be used on: - - TREE_LISTs that are vfields - - -@item VF_DERIVED_VALUE -Identifies the type of the most derived class of the vfield, excluding -the class this vfield is for. - -Set at @code{finish_base_struct} time. - -What things can this be used on: - - TREE_LISTs that are vfields - - -@item VF_NORMAL_VALUE -Identifies the type of the most derived class of the vfield, including -the class this vfield is for. - -Set at @code{finish_base_struct} time. - -What things can this be used on: - - TREE_LISTs that are vfields - - -@item WRITABLE_VTABLES -This is a option that can be defined when building the compiler, that -will cause the compiler to output vtables into the data segment so that -the vtables maybe written. This is undefined by default, because -normally the vtables should be unwritable. People that implement object -I/O facilities may, or people that want to change the dynamic type of -objects may want to have the vtables writable. Another way of achieving -this would be to make a copy of the vtable into writable memory, but the -drawback there is that that method only changes the type for one object. - -@end table - -@node Typical Behavior, Coding Conventions, Macros, Top -@section Typical Behavior - -@cindex parse errors - -Whenever seemingly normal code fails with errors like -@code{syntax error at `\@{'}, it's highly likely that grokdeclarator is -returning a NULL_TREE for whatever reason. - -@node Coding Conventions, Templates, Typical Behavior, Top -@section Coding Conventions - -It should never be that case that trees are modified in-place by the -back-end, @emph{unless} it is guaranteed that the semantics are the same -no matter how shared the tree structure is. @file{fold-const.c} still -has some cases where this is not true, but rms hypothesizes that this -will never be a problem. - -@node Templates, Access Control, Coding Conventions, Top -@section Templates - -A template is represented by a @code{TEMPLATE_DECL}. The specific -fields used are: - -@table @code -@item DECL_TEMPLATE_RESULT -The generic decl on which instantiations are based. This looks just -like any other decl. - -@item DECL_TEMPLATE_PARMS -The parameters to this template. -@end table - -The generic decl is parsed as much like any other decl as possible, -given the parameterization. The template decl is not built up until the -generic decl has been completed. For template classes, a template decl -is generated for each member function and static data member, as well. - -Template members of template classes are represented by a TEMPLATE_DECL -for the class' parameters around another TEMPLATE_DECL for the member's -parameters. - -All declarations that are instantiations or specializations of templates -refer to their template and parameters through DECL_TEMPLATE_INFO. - -How should I handle parsing member functions with the proper param -decls? Set them up again or try to use the same ones? Currently we do -the former. We can probably do this without any extra machinery in -store_pending_inline, by deducing the parameters from the decl in -do_pending_inlines. PRE_PARSED_TEMPLATE_DECL? - -If a base is a parm, we can't check anything about it. If a base is not -a parm, we need to check it for name binding. Do finish_base_struct if -no bases are parameterized (only if none, including indirect, are -parms). Nah, don't bother trying to do any of this until instantiation --- we only need to do name binding in advance. - -Always set up method vec and fields, inc. synthesized methods. Really? -We can't know the types of the copy folks, or whether we need a -destructor, or can have a default ctor, until we know our bases and -fields. Otherwise, we can assume and fix ourselves later. Hopefully. - -@node Access Control, Error Reporting, Templates, Top -@section Access Control -The function compute_access returns one of three values: - -@table @code -@item access_public -means that the field can be accessed by the current lexical scope. - -@item access_protected -means that the field cannot be accessed by the current lexical scope -because it is protected. - -@item access_private -means that the field cannot be accessed by the current lexical scope -because it is private. -@end table - -DECL_ACCESS is used for access declarations; alter_access creates a list -of types and accesses for a given decl. - -Formerly, DECL_@{PUBLIC,PROTECTED,PRIVATE@} corresponded to the return -codes of compute_access and were used as a cache for compute_access. -Now they are not used at all. - -TREE_PROTECTED and TREE_PRIVATE are used to record the access levels -granted by the containing class. BEWARE: TREE_PUBLIC means something -completely unrelated to access control! - -@node Error Reporting, Parser, Access Control, Top -@section Error Reporting - -The C++ front-end uses a call-back mechanism to allow functions to print -out reasonable strings for types and functions without putting extra -logic in the functions where errors are found. The interface is through -the @code{cp_error} function (or @code{cp_warning}, etc.). The -syntax is exactly like that of @code{error}, except that a few more -conversions are supported: - -@itemize @bullet -@item -%C indicates a value of `enum tree_code'. -@item -%D indicates a *_DECL node. -@item -%E indicates a *_EXPR node. -@item -%L indicates a value of `enum languages'. -@item -%P indicates the name of a parameter (i.e. "this", "1", "2", ...) -@item -%T indicates a *_TYPE node. -@item -%O indicates the name of an operator (MODIFY_EXPR -> "operator ="). - -@end itemize - -There is some overlap between these; for instance, any of the node -options can be used for printing an identifier (though only @code{%D} -tries to decipher function names). - -For a more verbose message (@code{class foo} as opposed to just @code{foo}, -including the return type for functions), use @code{%#c}. -To have the line number on the error message indicate the line of the -DECL, use @code{cp_error_at} and its ilk; to indicate which argument you want, -use @code{%+D}, or it will default to the first. - -@node Parser, Copying Objects, Error Reporting, Top -@section Parser - -Some comments on the parser: - -The @code{after_type_declarator} / @code{notype_declarator} hack is -necessary in order to allow redeclarations of @code{TYPENAME}s, for -instance - -@example -typedef int foo; -class A @{ - char *foo; -@}; -@end example - -In the above, the first @code{foo} is parsed as a @code{notype_declarator}, -and the second as a @code{after_type_declarator}. - -Ambiguities: - -There are currently four reduce/reduce ambiguities in the parser. They are: - -1) Between @code{template_parm} and -@code{named_class_head_sans_basetype}, for the tokens @code{aggr -identifier}. This situation occurs in code looking like - -@example -template class A @{ @}; -@end example - -It is ambiguous whether @code{class T} should be parsed as the -declaration of a template type parameter named @code{T} or an unnamed -constant parameter of type @code{class T}. Section 14.6, paragraph 3 of -the January '94 working paper states that the first interpretation is -the correct one. This ambiguity results in two reduce/reduce conflicts. - -2) Between @code{primary} and @code{type_id} for code like @samp{int()} -in places where both can be accepted, such as the argument to -@code{sizeof}. Section 8.1 of the pre-San Diego working paper specifies -that these ambiguous constructs will be interpreted as @code{typename}s. -This ambiguity results in six reduce/reduce conflicts between -@samp{absdcl} and @samp{functional_cast}. - -3) Between @code{functional_cast} and -@code{complex_direct_notype_declarator}, for various token strings. -This situation occurs in code looking like - -@example -int (*a); -@end example - -This code is ambiguous; it could be a declaration of the variable -@samp{a} as a pointer to @samp{int}, or it could be a functional cast of -@samp{*a} to @samp{int}. Section 6.8 specifies that the former -interpretation is correct. This ambiguity results in 7 reduce/reduce -conflicts. Another aspect of this ambiguity is code like 'int (x[2]);', -which is resolved at the '[' and accounts for 6 reduce/reduce conflicts -between @samp{direct_notype_declarator} and -@samp{primary}/@samp{overqualified_id}. Finally, there are 4 r/r -conflicts between @samp{expr_or_declarator} and @samp{primary} over code -like 'int (a);', which could probably be resolved but would also -probably be more trouble than it's worth. In all, this situation -accounts for 17 conflicts. Ack! - -The second case above is responsible for the failure to parse 'LinppFile -ppfile (String (argv[1]), &outs, argc, argv);' (from Rogue Wave -Math.h++) as an object declaration, and must be fixed so that it does -not resolve until later. - -4) Indirectly between @code{after_type_declarator} and @code{parm}, for -type names. This occurs in (as one example) code like - -@example -typedef int foo, bar; -class A @{ - foo (bar); -@}; -@end example - -What is @code{bar} inside the class definition? We currently interpret -it as a @code{parm}, as does Cfront, but IBM xlC interprets it as an -@code{after_type_declarator}. I believe that xlC is correct, in light -of 7.1p2, which says "The longest sequence of @i{decl-specifiers} that -could possibly be a type name is taken as the @i{decl-specifier-seq} of -a @i{declaration}." However, it seems clear that this rule must be -violated in the case of constructors. This ambiguity accounts for 8 -conflicts. - -Unlike the others, this ambiguity is not recognized by the Working Paper. - -@node Copying Objects, Exception Handling, Parser, Top -@section Copying Objects - -The generated copy assignment operator in g++ does not currently do the -right thing for multiple inheritance involving virtual bases; it just -calls the copy assignment operators for its direct bases. What it -should probably do is: - -1) Split up the copy assignment operator for all classes that have -vbases into "copy my vbases" and "copy everything else" parts. Or do -the trickiness that the constructors do to ensure that vbases don't get -initialized by intermediate bases. - -2) Wander through the class lattice, find all vbases for which no -intermediate base has a user-defined copy assignment operator, and call -their "copy everything else" routines. If not all of my vbases satisfy -this criterion, warn, because this may be surprising behavior. - -3) Call the "copy everything else" routine for my direct bases. - -If we only have one direct base, we can just foist everything off onto -them. - -This issue is currently under discussion in the core reflector -(2/28/94). - -@node Exception Handling, Free Store, Copying Objects, Top -@section Exception Handling - -Note, exception handling in g++ is still under development. - -This section describes the mapping of C++ exceptions in the C++ -front-end, into the back-end exception handling framework. - -The basic mechanism of exception handling in the back-end is -unwind-protect a la elisp. This is a general, robust, and language -independent representation for exceptions. - -The C++ front-end exceptions are mapping into the unwind-protect -semantics by the C++ front-end. The mapping is describe below. - -When -frtti is used, rtti is used to do exception object type checking, -when it isn't used, the encoded name for the type of the object being -thrown is used instead. All code that originates exceptions, even code -that throws exceptions as a side effect, like dynamic casting, and all -code that catches exceptions must be compiled with either -frtti, or --fno-rtti. It is not possible to mix rtti base exception handling -objects with code that doesn't use rtti. The exceptions to this, are -code that doesn't catch or throw exceptions, catch (...), and code that -just rethrows an exception. - -Currently we use the normal mangling used in building functions names -(int's are "i", const char * is PCc) to build the non-rtti base type -descriptors for exception handling. These descriptors are just plain -NULL terminated strings, and internally they are passed around as char -*. - -In C++, all cleanups should be protected by exception regions. The -region starts just after the reason why the cleanup is created has -ended. For example, with an automatic variable, that has a constructor, -it would be right after the constructor is run. The region ends just -before the finalization is expanded. Since the backend may expand the -cleanup multiple times along different paths, once for normal end of the -region, once for non-local gotos, once for returns, etc, the backend -must take special care to protect the finalization expansion, if the -expansion is for any other reason than normal region end, and it is -`inline' (it is inside the exception region). The backend can either -choose to move them out of line, or it can created an exception region -over the finalization to protect it, and in the handler associated with -it, it would not run the finalization as it otherwise would have, but -rather just rethrow to the outer handler, careful to skip the normal -handler for the original region. - -In Ada, they will use the more runtime intensive approach of having -fewer regions, but at the cost of additional work at run time, to keep a -list of things that need cleanups. When a variable has finished -construction, they add the cleanup to the list, when the come to the end -of the lifetime of the variable, the run the list down. If the take a -hit before the section finishes normally, they examine the list for -actions to perform. I hope they add this logic into the back-end, as it -would be nice to get that alternative approach in C++. - -On an rs6000, xlC stores exception objects on that stack, under the try -block. When is unwinds down into a handler, the frame pointer is -adjusted back to the normal value for the frame in which the handler -resides, and the stack pointer is left unchanged from the time at which -the object was thrown. This is so that there is always someplace for -the exception object, and nothing can overwrite it, once we start -throwing. The only bad part, is that the stack remains large. - -The below points out some things that work in g++'s exception handling. - -All completely constructed temps and local variables are cleaned up in -all unwinded scopes. Completely constructed parts of partially -constructed objects are cleaned up. This includes partially built -arrays. Exception specifications are now handled. Thrown objects are -now cleaned up all the time. We can now tell if we have an active -exception being thrown or not (__eh_type != 0). We use this to call -terminate if someone does a throw; without there being an active -exception object. uncaught_exception () works. Exception handling -should work right if you optimize. Exception handling should work with --fpic or -fPIC. - -The below points out some flaws in g++'s exception handling, as it now -stands. - -Only exact type matching or reference matching of throw types works when --fno-rtti is used. Only works on a SPARC (like Suns) (both -mflat and --mno-flat models work), SPARClite, Hitachi SH, i386, arm, rs6000, -PowerPC, Alpha, mips, VAX, m68k and z8k machines. SPARC v9 may not -work. HPPA is mostly done, but throwing between a shared library and -user code doesn't yet work. Some targets have support for data-driven -unwinding. Partial support is in for all other machines, but a stack -unwinder called __unwind_function has to be written, and added to -libgcc2 for them. The new EH code doesn't rely upon the -__unwind_function for C++ code, instead it creates per function -unwinders right inside the function, unfortunately, on many platforms -the definition of RETURN_ADDR_RTX in the tm.h file for the machine port -is wrong. See below for details on __unwind_function. RTL_EXPRs for EH -cond variables for && and || exprs should probably be wrapped in -UNSAVE_EXPRs, and RTL_EXPRs tweaked so that they can be unsaved. - -We only do pointer conversions on exception matching a la 15.3 p2 case -3: `A handler with type T, const T, T&, or const T& is a match for a -throw-expression with an object of type E if [3]T is a pointer type and -E is a pointer type that can be converted to T by a standard pointer -conversion (_conv.ptr_) not involving conversions to pointers to private -or protected base classes.' when -frtti is given. - -We don't call delete on new expressions that die because the ctor threw -an exception. See except/18 for a test case. - -15.2 para 13: The exception being handled should be rethrown if control -reaches the end of a handler of the function-try-block of a constructor -or destructor, right now, it is not. - -15.2 para 12: If a return statement appears in a handler of -function-try-block of a constructor, the program is ill-formed, but this -isn't diagnosed. - -15.2 para 11: If the handlers of a function-try-block contain a jump -into the body of a constructor or destructor, the program is ill-formed, -but this isn't diagnosed. - -15.2 para 9: Check that the fully constructed base classes and members -of an object are destroyed before entering the handler of a -function-try-block of a constructor or destructor for that object. - -build_exception_variant should sort the incoming list, so that it -implements set compares, not exact list equality. Type smashing should -smash exception specifications using set union. - -Thrown objects are usually allocated on the heap, in the usual way. If -one runs out of heap space, throwing an object will probably never work. -This could be relaxed some by passing an __in_chrg parameter to track -who has control over the exception object. Thrown objects are not -allocated on the heap when they are pointer to object types. We should -extend it so that all small (<4*sizeof(void*)) objects are stored -directly, instead of allocated on the heap. - -When the backend returns a value, it can create new exception regions -that need protecting. The new region should rethrow the object in -context of the last associated cleanup that ran to completion. - -The structure of the code that is generated for C++ exception handling -code is shown below: - -@example -Ln: throw value; - copy value onto heap - jump throw (Ln, id, address of copy of value on heap) - - try @{ -+Lstart: the start of the main EH region -|... ... -+Lend: the end of the main EH region - @} catch (T o) @{ - ...1 - @} -Lresume: - nop used to make sure there is something before - the next region ends, if there is one -... ... - - jump Ldone -[ -Lmainhandler: handler for the region Lstart-Lend - cleanup -] zero or more, depending upon automatic vars with dtors -+Lpartial: -| jump Lover -+Lhere: - rethrow (Lhere, same id, same obj); -Lterm: handler for the region Lpartial-Lhere - call terminate -Lover: -[ - [ - call throw_type_match - if (eq) @{ - ] these lines disappear when there is no catch condition -+Lsregion2: -| ...1 -| jump Lresume -|Lhandler: handler for the region Lsregion2-Leregion2 -| rethrow (Lresume, same id, same obj); -+Leregion2 - @} -] there are zero or more of these sections, depending upon how many - catch clauses there are ------------------------------ expand_end_all_catch -------------------------- - here we have fallen off the end of all catch - clauses, so we rethrow to outer - rethrow (Lresume, same id, same obj); ------------------------------ expand_end_all_catch -------------------------- -[ -L1: maybe throw routine -] depending upon if we have expanded it or not -Ldone: - ret - -start_all_catch emits labels: Lresume, - -@end example - -The __unwind_function takes a pointer to the throw handler, and is -expected to pop the stack frame that was built to call it, as well as -the frame underneath and then jump to the throw handler. It must -restore all registers to their proper values as well as all other -machine state as determined by the context in which we are unwinding -into. The way I normally start is to compile: - - void *g; - foo(void* a) @{ g = a; @} - -with -S, and change the thing that alters the PC (return, or ret -usually) to not alter the PC, making sure to leave all other semantics -(like adjusting the stack pointer, or frame pointers) in. After that, -replicate the prologue once more at the end, again, changing the PC -altering instructions, and finally, at the very end, jump to `g'. - -It takes about a week to write this routine, if someone wants to -volunteer to write this routine for any architecture, exception support -for that architecture will be added to g++. Please send in those code -donations. One other thing that needs to be done, is to double check -that __builtin_return_address (0) works. - -@subsection Specific Targets - -For the alpha, the __unwind_function will be something resembling: - -@example -void -__unwind_function(void *ptr) -@{ - /* First frame */ - asm ("ldq $15, 8($30)"); /* get the saved frame ptr; 15 is fp, 30 is sp */ - asm ("bis $15, $15, $30"); /* reload sp with the fp we found */ - - /* Second frame */ - asm ("ldq $15, 8($30)"); /* fp */ - asm ("bis $15, $15, $30"); /* reload sp with the fp we found */ - - /* Return */ - asm ("ret $31, ($16), 1"); /* return to PTR, stored in a0 */ -@} -@end example - -@noindent -However, there are a few problems preventing it from working. First of -all, the gcc-internal function @code{__builtin_return_address} needs to -work given an argument of 0 for the alpha. As it stands as of August -30th, 1995, the code for @code{BUILT_IN_RETURN_ADDRESS} in @file{expr.c} -will definitely not work on the alpha. Instead, we need to define -the macros @code{DYNAMIC_CHAIN_ADDRESS} (maybe), -@code{RETURN_ADDR_IN_PREVIOUS_FRAME}, and definitely need a new -definition for @code{RETURN_ADDR_RTX}. - -In addition (and more importantly), we need a way to reliably find the -frame pointer on the alpha. The use of the value 8 above to restore the -frame pointer (register 15) is incorrect. On many systems, the frame -pointer is consistently offset to a specific point on the stack. On the -alpha, however, the frame pointer is pushed last. First the return -address is stored, then any other registers are saved (e.g., @code{s0}), -and finally the frame pointer is put in place. So @code{fp} could have -an offset of 8, but if the calling function saved any registers at all, -they add to the offset. - -The only places the frame size is noted are with the @samp{.frame} -directive, for use by the debugger and the OSF exception handling model -(useless to us), and in the initial computation of the new value for -@code{sp}, the stack pointer. For example, the function may start with: - -@example -lda $30,-32($30) -.frame $15,32,$26,0 -@end example - -@noindent -The 32 above is exactly the value we need. With this, we can be sure -that the frame pointer is stored 8 bytes less---in this case, at 24(sp)). -The drawback is that there is no way that I (Brendan) have found to let -us discover the size of a previous frame @emph{inside} the definition -of @code{__unwind_function}. - -So to accomplish exception handling support on the alpha, we need two -things: first, a way to figure out where the frame pointer was stored, -and second, a functional @code{__builtin_return_address} implementation -for except.c to be able to use it. - -Or just support DWARF 2 unwind info. - -@subsection New Backend Exception Support - -This subsection discusses various aspects of the design of the -data-driven model being implemented for the exception handling backend. - -The goal is to generate enough data during the compilation of user code, -such that we can dynamically unwind through functions at run time with a -single routine (@code{__throw}) that lives in libgcc.a, built by the -compiler, and dispatch into associated exception handlers. - -This information is generated by the DWARF 2 debugging backend, and -includes all of the information __throw needs to unwind an arbitrary -frame. It specifies where all of the saved registers and the return -address can be found at any point in the function. - -Major disadvantages when enabling exceptions are: - -@itemize @bullet -@item -Code that uses caller saved registers, can't, when flow can be -transferred into that code from an exception handler. In high performance -code this should not usually be true, so the effects should be minimal. - -@end itemize - -@subsection Backend Exception Support - -The backend must be extended to fully support exceptions. Right now -there are a few hooks into the alpha exception handling backend that -resides in the C++ frontend from that backend that allows exception -handling to work in g++. An exception region is a segment of generated -code that has a handler associated with it. The exception regions are -denoted in the generated code as address ranges denoted by a starting PC -value and an ending PC value of the region. Some of the limitations -with this scheme are: - -@itemize @bullet -@item -The backend replicates insns for such things as loop unrolling and -function inlining. Right now, there are no hooks into the frontend's -exception handling backend to handle the replication of insns. When -replication happens, a new exception region descriptor needs to be -generated for the new region. - -@item -The backend expects to be able to rearrange code, for things like jump -optimization. Any rearranging of the code needs have exception region -descriptors updated appropriately. - -@item -The backend can eliminate dead code. Any associated exception region -descriptor that refers to fully contained code that has been eliminated -should also be removed, although not doing this is harmless in terms of -semantics. - -@end itemize - -The above is not meant to be exhaustive, but does include all things I -have thought of so far. I am sure other limitations exist. - -Below are some notes on the migration of the exception handling code -backend from the C++ frontend to the backend. - -NOTEs are to be used to denote the start of an exception region, and the -end of the region. I presume that the interface used to generate these -notes in the backend would be two functions, start_exception_region and -end_exception_region (or something like that). The frontends are -required to call them in pairs. When marking the end of a region, an -argument can be passed to indicate the handler for the marked region. -This can be passed in many ways, currently a tree is used. Another -possibility would be insns for the handler, or a label that denotes a -handler. I have a feeling insns might be the best way to pass it. -Semantics are, if an exception is thrown inside the region, control is -transferred unconditionally to the handler. If control passes through -the handler, then the backend is to rethrow the exception, in the -context of the end of the original region. The handler is protected by -the conventional mechanisms; it is the frontend's responsibility to -protect the handler, if special semantics are required. - -This is a very low level view, and it would be nice is the backend -supported a somewhat higher level view in addition to this view. This -higher level could include source line number, name of the source file, -name of the language that threw the exception and possibly the name of -the exception. Kenner may want to rope you into doing more than just -the basics required by C++. You will have to resolve this. He may want -you to do support for non-local gotos, first scan for exception handler, -if none is found, allow the debugger to be entered, without any cleanups -being done. To do this, the backend would have to know the difference -between a cleanup-rethrower, and a real handler, if would also have to -have a way to know if a handler `matches' a thrown exception, and this -is frontend specific. - -The stack unwinder is one of the hardest parts to do. It is highly -machine dependent. The form that kenner seems to like was a couple of -macros, that would do the machine dependent grunt work. One preexisting -function that might be of some use is __builtin_return_address (). One -macro he seemed to want was __builtin_return_address, and the other -would do the hard work of fixing up the registers, adjusting the stack -pointer, frame pointer, arg pointer and so on. - - -@node Free Store, Mangling, Exception Handling, Top -@section Free Store - -@code{operator new []} adds a magic cookie to the beginning of arrays -for which the number of elements will be needed by @code{operator delete -[]}. These are arrays of objects with destructors and arrays of objects -that define @code{operator delete []} with the optional size_t argument. -This cookie can be examined from a program as follows: - -@example -typedef unsigned long size_t; -extern "C" int printf (const char *, ...); - -size_t nelts (void *p) -@{ - struct cookie @{ - size_t nelts __attribute__ ((aligned (sizeof (double)))); - @}; - - cookie *cp = (cookie *)p; - --cp; - - return cp->nelts; -@} - -struct A @{ - ~A() @{ @} -@}; - -main() -@{ - A *ap = new A[3]; - printf ("%ld\n", nelts (ap)); -@} -@end example - -@section Linkage -The linkage code in g++ is horribly twisted in order to meet two design goals: - -1) Avoid unnecessary emission of inlines and vtables. - -2) Support pedantic assemblers like the one in AIX. - -To meet the first goal, we defer emission of inlines and vtables until -the end of the translation unit, where we can decide whether or not they -are needed, and how to emit them if they are. - -@node Mangling, Concept Index, Free Store, Top -@section Function name mangling for C++ and Java - -Both C++ and Jave provide overloaded function and methods, -which are methods with the same types but different parameter lists. -Selecting the correct version is done at compile time. -Though the overloaded functions have the same name in the source code, -they need to be translated into different assembler-level names, -since typical assemblers and linkers cannot handle overloading. -This process of encoding the parameter types with the method name -into a unique name is called @dfn{name mangling}. The inverse -process is called @dfn{demangling}. - -It is convenient that C++ and Java use compatible mangling schemes, -since the makes life easier for tools such as gdb, and it eases -integration between C++ and Java. - -Note there is also a standard "Jave Native Interface" (JNI) which -implements a different calling convention, and uses a different -mangling scheme. The JNI is a rather abstract ABI so Java can call methods -written in C or C++; -we are concerned here about a lower-level interface primarily -intended for methods written in Java, but that can also be used for C++ -(and less easily C). - -Note that on systems that follow BSD tradition, a C identifier @code{var} -would get "mangled" into the assembler name @samp{_var}. On such -systems, all other mangled names are also prefixed by a @samp{_} -which is not shown in the following examples. - -@subsection Method name mangling - -C++ mangles a method by emitting the function name, followed by @code{__}, -followed by encodings of any method qualifiers (such as @code{const}), -followed by the mangling of the method's class, -followed by the mangling of the parameters, in order. - -For example @code{Foo::bar(int, long) const} is mangled -as @samp{bar__C3Fooil}. - -For a constructor, the method name is left out. -That is @code{Foo::Foo(int, long) const} is mangled -as @samp{__C3Fooil}. - -GNU Java does the same. - -@subsection Primitive types - -The C++ types @code{int}, @code{long}, @code{short}, @code{char}, -and @code{long long} are mangled as @samp{i}, @samp{l}, -@samp{s}, @samp{c}, and @samp{x}, respectively. -The corresponding unsigned types have @samp{U} prefixed -to the mangling. The type @code{signed char} is mangled @samp{Sc}. - -The C++ and Java floating-point types @code{float} and @code{double} -are mangled as @samp{f} and @samp{d} respectively. - -The C++ @code{bool} type and the Java @code{boolean} type are -mangled as @samp{b}. - -The C++ @code{wchar_t} and the Java @code{char} types are -mangled as @samp{w}. - -The Java integral types @code{byte}, @code{short}, @code{int} -and @code{long} are mangled as @samp{c}, @samp{s}, @samp{i}, -and @samp{x}, respectively. - -C++ code that has included @code{javatypes.h} will mangle -the typedefs @code{jbyte}, @code{jshort}, @code{jint} -and @code{jlong} as respectively @samp{c}, @samp{s}, @samp{i}, -and @samp{x}. (This has not been implemented yet.) - -@subsection Mangling of simple names - -A simple class, package, template, or namespace name is -encoded as the number of characters in the name, followed by -the actual characters. Thus the class @code{Foo} -is encoded as @samp{3Foo}. - -If any of the characters in the name are not alphanumeric -(i.e not one of the standard ASCII letters, digits, or '_'), -or the initial character is a digit, then the name is -mangled as a sequence of encoded Unicode letters. -A Unicode encoding starts with a @samp{U} to indicate -that Unicode escapes are used, followed by the number of -bytes used by the Unicode encoding, followed by the bytes -representing the encoding. ASSCI letters and -non-initial digits are encoded without change. However, all -other characters (including underscore and initial digits) are -translated into a sequence starting with an underscore, -followed by the big-endian 4-hex-digit lower-case encoding of the character. - -If a method name contains Unicode-escaped characters, the -entire mangled method name is followed by a @samp{U}. - -For example, the method @code{X\u0319::M\u002B(int)} is encoded as -@samp{M_002b__U6X_0319iU}. - - -@subsection Pointer and reference types - -A C++ pointer type is mangled as @samp{P} followed by the -mangling of the type pointed to. - -A C++ reference type as mangled as @samp{R} followed by the -mangling of the type referenced. - -A Java object reference type is equivalent -to a C++ pointer parameter, so we mangle such an parameter type -as @samp{P} followed by the mangling of the class name. - -@subsection Squangled type compression - -Squangling (enabled with the @samp{-fsquangle} option), utilizes the -@samp{B} code to indicate reuse of a previously seen type within an -indentifier. Types are recognized in a left to right manner and given -increasing values, which are appended to the code in the standard -manner. Ie, multiple digit numbers are delimited by @samp{_} -characters. A type is considered to be any non primitive type, -regardless of whether its a parameter, template parameter, or entire -template. Certain codes are considered modifiers of a type, and are not -included as part of the type. These are the @samp{C}, @samp{V}, -@samp{P}, @samp{A}, @samp{R}, @samp{U} and @samp{u} codes, denoting -constant, volatile, pointer, array, reference, unsigned, and restrict. -These codes may precede a @samp{B} type in order to make the required -modifications to the type. - -For example: -@example -template class class1 @{ @}; - -template class class2 @{ @}; - -class class3 @{ @}; - -int f(class2 > a ,int b, const class1&c, class3 *d) @{ @} - - B0 -> class2 - B1 -> class1 - B2 -> class3 -@end example -Produces the mangled name @samp{f__FGt6class21Zt6class11Z6class3iRCB1PB2}. -The int parameter is a basic type, and does not receive a B encoding... - -@subsection Qualified names - -Both C++ and Java allow a class to be lexically nested inside another -class. C++ also supports namespaces (not yet implemented by G++). -Java also supports packages. - -These are all mangled the same way: First the letter @samp{Q} -indicates that we are emitting a qualified name. -That is followed by the number of parts in the qualified name. -If that number is 9 or less, it is emitted with no delimiters. -Otherwise, an underscore is written before and after the count. -Then follows each part of the qualified name, as described above. - -For example @code{Foo::\u0319::Bar} is encoded as -@samp{Q33FooU5_03193Bar}. - -Squangling utilizes the the letter @samp{K} to indicate a -remembered portion of a qualified name. As qualified names are processed -for an identifier, the names are numbered and remembered in a -manner similar to the @samp{B} type compression code. -Names are recognized left to right, and given increasing values, which are -appended to the code in the standard manner. ie, multiple digit numbers -are delimited by @samp{_} characters. - -For example -@example -class Andrew -@{ - class WasHere - @{ - class AndHereToo - @{ - @}; - @}; -@}; - -f(Andrew&r1, Andrew::WasHere& r2, Andrew::WasHere::AndHereToo& r3) @{ @} - - K0 -> Andrew - K1 -> Andrew::WasHere - K2 -> Andrew::WasHere::AndHereToo -@end example -Function @samp{f()} would be mangled as : -@samp{f__FR6AndrewRQ2K07WasHereRQ2K110AndHereToo} - -There are some occasions when either a @samp{B} or @samp{K} code could -be chosen, preference is always given to the @samp{B} code. Ie, the example -in the section on @samp{B} mangling could have used a @samp{K} code -instead of @samp{B2}. - -@subsection Templates - -A class template instantiation is encoded as the letter @samp{t}, -followed by the encoding of the template name, followed -the number of template parameters, followed by encoding of the template -parameters. If a template parameter is a type, it is written -as a @samp{Z} followed by the encoding of the type. - -A function template specialization (either an instantiation or an -explicit specialization) is encoded by an @samp{H} followed by the -encoding of the template parameters, as described above, followed by an -@samp{_}, the encoding of the argument types to the template function -(not the specialization), another @samp{_}, and the return type. (Like -the argument types, the return type is the return type of the function -template, not the specialization.) Template parameters in the argument -and return types are encoded by an @samp{X} for type parameters, or a -@samp{Y} for constant parameters, an index indicating their position -in the template parameter list declaration, and their template depth. - -@subsection Arrays - -C++ array types are mangled by emitting @samp{A}, followed by -the length of the array, followed by an @samp{_}, followed by -the mangling of the element type. Of course, normally -array parameter types decay into a pointer types, so you -don't see this. - -Java arrays are objects. A Java type @code{T[]} is mangled -as if it were the C++ type @code{JArray}. -For example @code{java.lang.String[]} is encoded as -@samp{Pt6JArray1ZPQ34java4lang6String}. - -@subsection Static fields - -Both C++ and Java classes can have static fields. -These are allocated statically, and are shared among all instances. - -The mangling starts with a prefix (@samp{_} in most systems), which is -followed by the mangling -of the class name, followed by the "joiner" and finally the field name. -The joiner (see @code{JOINER} in @code{cp-tree.h}) is a special -separator character. For historical reasons (and idiosyncracies -of assembler syntax) it can @samp{$} or @samp{.} (or even -@samp{_} on a few systems). If the joiner is @samp{_} then the prefix -is @samp{__static_} instead of just @samp{_}. - -For example @code{Foo::Bar::var} (or @code{Foo.Bar.var} in Java syntax) -would be encoded as @samp{_Q23Foo3Bar$var} or @samp{_Q23Foo3Bar.var} -(or rarely @samp{__static_Q23Foo3Bar_var}). - -If the name of a static variable needs Unicode escapes, -the Unicode indicator @samp{U} comes before the "joiner". -This @code{\u1234Foo::var\u3445} becomes @code{_U8_1234FooU.var_3445}. - -@subsection Table of demangling code characters - -The following special characters are used in mangling: - -@table @samp -@item A -Indicates a C++ array type. - -@item b -Encodes the C++ @code{bool} type, -and the Java @code{boolean} type. - -@item B -Used for squangling. Similar in concept to the 'T' non-squangled code. - -@item c -Encodes the C++ @code{char} type, and the Java @code{byte} type. - -@item C -A modifier to indicate a @code{const} type. -Also used to indicate a @code{const} member function -(in which cases it precedes the encoding of the method's class). - -@item d -Encodes the C++ and Java @code{double} types. - -@item e -Indicates extra unknown arguments @code{...}. - -@item E -Indicates the opening parenthesis of an expression. - -@item f -Encodes the C++ and Java @code{float} types. - -@item F -Used to indicate a function type. - -@item H -Used to indicate a template function. - -@item i -Encodes the C++ and Java @code{int} types. - -@item J -Indicates a complex type. - -@item K -Used by squangling to compress qualified names. - -@item l -Encodes the C++ @code{long} type. - -@item n -Immediate repeated type. Followed by the repeat count. - -@item N -Repeated type. Followed by the repeat count of the repeated type, -followed by the type index of the repeated type. Due to a bug in -g++ 2.7.2, this is only generated if index is 0. Superceded by -@samp{n} when squangling. - -@item P -Indicates a pointer type. Followed by the type pointed to. - -@item Q -Used to mangle qualified names, which arise from nested classes. -Also used for namespaces. -In Java used to mangle package-qualified names, and inner classes. - -@item r -Encodes the GNU C++ @code{long double} type. - -@item R -Indicates a reference type. Followed by the referenced type. - -@item s -Encodes the C++ and java @code{short} types. - -@item S -A modifier that indicates that the following integer type is signed. -Only used with @code{char}. - -Also used as a modifier to indicate a static member function. - -@item t -Indicates a template instantiation. - -@item T -A back reference to a previously seen type. - -@item U -A modifier that indicates that the following integer type is unsigned. -Also used to indicate that the following class or namespace name -is encoded using Unicode-mangling. - -@item u -The @code{restrict} type qualifier. - -@item v -Encodes the C++ and Java @code{void} types. - -@item V -A modifier for a @code{volatile} type or method. - -@item w -Encodes the C++ @code{wchar_t} type, and the Java @code{char} types. - -@item W -Indicates the closing parenthesis of an expression. - -@item x -Encodes the GNU C++ @code{long long} type, and the Java @code{long} type. - -@item X -Encodes a template type parameter, when part of a function type. - -@item Y -Encodes a template constant parameter, when part of a function type. - -@item Z -Used for template type parameters. - -@end table - -The letters @samp{G}, @samp{M}, @samp{O}, and @samp{p} -also seem to be used for obscure purposes ... - -@node Concept Index, , Mangling, Top - -@section Concept Index - -@printindex cp - -@bye diff --git a/gcc/cp/hash.h b/gcc/cp/hash.h deleted file mode 100755 index ced034e..0000000 --- a/gcc/cp/hash.h +++ /dev/null @@ -1,231 +0,0 @@ -/* KR-C code produced by gperf version 2.7.1 (19981006 egcs) */ -/* Command-line: gperf -L KR-C -F , 0, 0 -p -j1 -g -o -t -N is_reserved_word -k1,4,7,$ ../../../gcc/cp/gxx.gperf */ -/* Command-line: gperf -L KR-C -F ', 0, 0' -p -j1 -g -o -t -N is_reserved_word -k1,4,$,7 gplus.gperf */ -struct resword { char *name; short token; enum rid rid;}; - -#define TOTAL_KEYWORDS 106 -#define MIN_WORD_LENGTH 2 -#define MAX_WORD_LENGTH 16 -#define MIN_HASH_VALUE 4 -#define MAX_HASH_VALUE 250 -/* maximum key range = 247, duplicates = 0 */ - -static inline unsigned int -hash (str, len) - register char *str; - register unsigned int len; -{ - static unsigned char asso_values[] = - { - 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 0, 251, 64, 93, 3, - 0, 0, 74, 35, 0, 26, 251, 2, 31, 65, - 23, 76, 7, 19, 45, 37, 6, 64, 12, 38, - 14, 4, 251, 251, 251, 251, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 251 - }; - register int hval = len; - - switch (hval) - { - default: - case 7: - hval += asso_values[(unsigned char)str[6]]; - case 6: - case 5: - case 4: - hval += asso_values[(unsigned char)str[3]]; - case 3: - case 2: - case 1: - hval += asso_values[(unsigned char)str[0]]; - break; - } - return hval + asso_values[(unsigned char)str[len - 1]]; -} - -static inline struct resword * -is_reserved_word (str, len) - register char *str; - register unsigned int len; -{ - static struct resword wordlist[] = - { - {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, - {"else", ELSE, NORID,}, - {"", 0, 0}, - {"delete", DELETE, NORID,}, - {"case", CASE, NORID,}, - {"__real__", REALPART, NORID}, - {"", 0, 0}, - {"true", CXX_TRUE, NORID,}, - {"catch", CATCH, NORID,}, - {"typeid", TYPEID, NORID,}, - {"try", TRY, NORID,}, - {"", 0, 0}, {"", 0, 0}, - {"void", TYPESPEC, RID_VOID,}, - {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, - {"private", VISSPEC, RID_PRIVATE,}, - {"template", TEMPLATE, RID_TEMPLATE,}, - {"protected", VISSPEC, RID_PROTECTED,}, - {"extern", SCSPEC, RID_EXTERN,}, - {"", 0, 0}, {"", 0, 0}, - {"not", '!', NORID,}, - {"", 0, 0}, - {"__signed", TYPESPEC, RID_SIGNED}, - {"int", TYPESPEC, RID_INT,}, - {"__signed__", TYPESPEC, RID_SIGNED}, - {"__real", REALPART, NORID}, - {"", 0, 0}, - {"xor_eq", ASSIGN, NORID,}, - {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, - {"__attribute", ATTRIBUTE, NORID}, - {"__asm__", ASM_KEYWORD, NORID}, - {"__attribute__", ATTRIBUTE, NORID}, - {"compl", '~', NORID,}, - {"public", VISSPEC, RID_PUBLIC,}, - {"not_eq", EQCOMPARE, NORID,}, - {"switch", SWITCH, NORID,}, - {"__extension__", EXTENSION, NORID}, - {"const", CV_QUALIFIER, RID_CONST,}, - {"static", SCSPEC, RID_STATIC,}, - {"", 0, 0}, - {"__inline", SCSPEC, RID_INLINE}, - {"", 0, 0}, - {"__inline__", SCSPEC, RID_INLINE}, - {"__restrict__", CV_QUALIFIER, RID_RESTRICT}, - {"inline", SCSPEC, RID_INLINE,}, - {"const_cast", CONST_CAST, NORID,}, - {"static_cast", STATIC_CAST, NORID,}, - {"__restrict", CV_QUALIFIER, RID_RESTRICT}, - {"xor", '^', NORID,}, - {"__wchar_t", TYPESPEC, RID_WCHAR /* Unique to ANSI C++ */,}, - {"new", NEW, NORID,}, - {"__alignof__", ALIGNOF, NORID}, - {"signed", TYPESPEC, RID_SIGNED,}, - {"and", ANDAND, NORID,}, - {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, - {"explicit", SCSPEC, RID_EXPLICIT,}, - {"", 0, 0}, - {"__imag__", IMAGPART, NORID}, - {"while", WHILE, NORID,}, - {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, - {"do", DO, NORID,}, - {"typename", TYPENAME_KEYWORD, NORID,}, - {"friend", SCSPEC, RID_FRIEND,}, - {"continue", CONTINUE, NORID,}, - {"class", AGGR, RID_CLASS,}, - {"default", DEFAULT, NORID,}, - {"this", THIS, NORID,}, - {"dynamic_cast", DYNAMIC_CAST, NORID,}, - {"typeof", TYPEOF, NORID,}, - {"virtual", SCSPEC, RID_VIRTUAL,}, - {"export", SCSPEC, RID_EXPORT,}, - {"and_eq", ASSIGN, NORID,}, - {"__typeof__", TYPEOF, NORID}, - {"__const__", CV_QUALIFIER, RID_CONST}, - {"__volatile", CV_QUALIFIER, RID_VOLATILE}, - {"short", TYPESPEC, RID_SHORT,}, - {"__volatile__", CV_QUALIFIER, RID_VOLATILE}, - {"__const", CV_QUALIFIER, RID_CONST}, - {"namespace", NAMESPACE, NORID,}, - {"char", TYPESPEC, RID_CHAR,}, - {"unsigned", TYPESPEC, RID_UNSIGNED,}, - {"double", TYPESPEC, RID_DOUBLE,}, - {"or_eq", ASSIGN, NORID,}, - {"__null", CONSTANT, RID_NULL}, - {"if", IF, NORID,}, - {"__signature__", AGGR, RID_SIGNATURE /* Extension */,}, - {"__label__", LABEL, NORID}, - {"long", TYPESPEC, RID_LONG,}, - {"__imag", IMAGPART, NORID}, - {"__asm", ASM_KEYWORD, NORID}, - {"", 0, 0}, - {"__sigof__", SIGOF, NORID /* Extension */,}, - {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, - {"struct", AGGR, RID_RECORD,}, - {"", 0, 0}, - {"volatile", CV_QUALIFIER, RID_VOLATILE,}, - {"false", CXX_FALSE, NORID,}, - {"sizeof", SIZEOF, NORID,}, - {"__complex__", TYPESPEC, RID_COMPLEX}, - {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, - {"for", FOR, NORID,}, - {"or", OROR, NORID,}, - {"register", SCSPEC, RID_REGISTER,}, - {"throw", THROW, NORID,}, - {"", 0, 0}, - {"using", USING, NORID,}, - {"", 0, 0}, {"", 0, 0}, - {"__complex", TYPESPEC, RID_COMPLEX}, - {"", 0, 0}, - {"asm", ASM_KEYWORD, NORID,}, - {"signature", AGGR, RID_SIGNATURE /* Extension */,}, - {"enum", ENUM, NORID,}, - {"reinterpret_cast", REINTERPRET_CAST, NORID,}, - {"mutable", SCSPEC, RID_MUTABLE,}, - {"__alignof", ALIGNOF, NORID}, - {"return", RETURN, NORID,}, - {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, - {"", 0, 0}, - {"float", TYPESPEC, RID_FLOAT,}, - {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, - {"bool", TYPESPEC, RID_BOOL,}, - {"", 0, 0}, - {"typedef", SCSPEC, RID_TYPEDEF,}, - {"__typeof", TYPEOF, NORID}, - {"bitand", '&', NORID,}, - {"break", BREAK, NORID,}, - {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, - {"union", AGGR, RID_UNION,}, - {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, - {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, - {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, - {"goto", GOTO, NORID,}, - {"sigof", SIGOF, NORID /* Extension */,}, - {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, - {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, - {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, - {"bitor", '|', NORID,}, - {"auto", SCSPEC, RID_AUTO,}, - {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, - {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, - {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, - {"", 0, 0}, {"", 0, 0}, - {"operator", OPERATOR, NORID,} - }; - - if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) - { - register int key = hash (str, len); - - if (key <= MAX_HASH_VALUE && key >= 0) - { - register char *s = wordlist[key].name; - - if (*str == *s && !strcmp (str + 1, s + 1)) - return &wordlist[key]; - } - } - return 0; -} diff --git a/gcc/cp/inc/exception b/gcc/cp/inc/exception deleted file mode 100755 index 32efb9f..0000000 --- a/gcc/cp/inc/exception +++ /dev/null @@ -1,39 +0,0 @@ -// Exception Handling support header for -*- C++ -*- -// Copyright (C) 1995, 96-97, 1998 Free Software Foundation - -#ifndef __EXCEPTION__ -#define __EXCEPTION__ - -#pragma interface "exception" - -extern "C++" { - -namespace std { - -class exception { -public: - exception () { } - virtual ~exception () { } - virtual const char* what () const; -}; - -class bad_exception : public exception { -public: - bad_exception () { } - virtual ~bad_exception () { } -}; - -typedef void (*terminate_handler) (); -typedef void (*unexpected_handler) (); - -terminate_handler set_terminate (terminate_handler); -void terminate () __attribute__ ((__noreturn__)); -unexpected_handler set_unexpected (unexpected_handler); -void unexpected () __attribute__ ((__noreturn__)); -bool uncaught_exception (); - -} // namespace std - -} // extern "C++" - -#endif diff --git a/gcc/cp/inc/new b/gcc/cp/inc/new deleted file mode 100755 index c19205b..0000000 --- a/gcc/cp/inc/new +++ /dev/null @@ -1,60 +0,0 @@ -/* CYGNUS LOCAL Embedded C++ whole file */ -// The -*- C++ -*- dynamic memory management header. -// Copyright (C) 1994, 96-97, 1998 Free Software Foundation - -#ifndef __NEW__ -#define __NEW__ - -#pragma interface "new" -#include - -#ifndef __EMBEDDED_CXX__ -// Exception Handling is forbidden in Embedded C++. -#include -#define __GCC_THROW(what) throw (what) -#define __GCC_nothing -#else -#define __GCC_THROW(what) -#endif - -extern "C++" { - -namespace std { - -#ifndef __EMBEDDED_CXX__ - class bad_alloc : public exception { - public: - virtual const char* what() const throw() { return "bad_alloc"; } - }; -#endif - - struct nothrow_t {}; - extern const nothrow_t nothrow; - - typedef void (*new_handler)(); - new_handler set_new_handler (new_handler); - -} // namespace std - -// replaceable signatures -void *operator new (size_t) __GCC_THROW (std::bad_alloc); -void *operator new[] (size_t) __GCC_THROW (std::bad_alloc); -void operator delete (void *) __GCC_THROW(__GCC_nothing); -void operator delete[] (void *) __GCC_THROW(__GCC_nothing); -void *operator new (size_t, const nothrow_t&) __GCC_THROW(__GCC_nothing); -void *operator new[] (size_t, const nothrow_t&) __GCC_THROW(__GCC_nothing); -void operator delete (void *, const nothrow_t&) __GCC_THROW(__GCC_nothing); -void operator delete[] (void *, const nothrow_t&) __GCC_THROW(__GCC_nothing); - -// default placement versions of operator new -inline void *operator new(size_t, void *place) __GCC_THROW(__GCC_nothing) { - return place; -} -inline void *operator new[](size_t, void *place) __GCC_THROW(__GCC_nothing) { - return place; -} - -} // extern "C++" - -#endif -/* END CYGNUS LOCAL */ diff --git a/gcc/cp/inc/new.h b/gcc/cp/inc/new.h deleted file mode 100755 index 006be7e..0000000 --- a/gcc/cp/inc/new.h +++ /dev/null @@ -1,11 +0,0 @@ -// -*- C++ -*- forwarding header. - -#ifndef __NEW_H__ -#define __NEW_H__ - -#include - -using std::new_handler; -using std::set_new_handler; - -#endif // __NEW_H__ diff --git a/gcc/cp/inc/typeinfo b/gcc/cp/inc/typeinfo deleted file mode 100755 index 9347849..0000000 --- a/gcc/cp/inc/typeinfo +++ /dev/null @@ -1,58 +0,0 @@ -// RTTI support for -*- C++ -*- -// Copyright (C) 1994, 95-97, 1998 Free Software Foundation - -#ifndef __TYPEINFO__ -#define __TYPEINFO__ - -#pragma interface "typeinfo" - -#include - -extern "C++" { - -namespace std { - -class type_info { -private: - // assigning type_info is not supported. made private. - type_info& operator= (const type_info&); - type_info (const type_info&); - -protected: - explicit type_info (const char *n): _name (n) { } - - const char *_name; - -public: - // destructor - virtual ~type_info (); - - bool before (const type_info& arg) const; - const char* name () const - { return _name; } - bool operator== (const type_info& arg) const; - bool operator!= (const type_info& arg) const; -}; - -inline bool type_info:: -operator!= (const type_info& arg) const -{ - return !operator== (arg); -} - -class bad_cast : public exception { -public: - bad_cast() { } - virtual ~bad_cast() { } -}; - -class bad_typeid : public exception { - public: - bad_typeid () { } - virtual ~bad_typeid () { } -}; - -} // namespace std - -} // extern "C++" -#endif diff --git a/gcc/cp/init.c b/gcc/cp/init.c deleted file mode 100755 index 847222f..0000000 --- a/gcc/cp/init.c +++ /dev/null @@ -1,3298 +0,0 @@ -/* Handle initialization things in C++. - Copyright (C) 1987, 89, 92-98, 1999 Free Software Foundation, Inc. - Contributed by Michael Tiemann (tiemann@cygnus.com) - -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 -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -/* High-level class interface. */ - -#include "config.h" -#include "system.h" -#include "tree.h" -#include "rtl.h" -#include "cp-tree.h" -#include "flags.h" -#include "output.h" -#include "except.h" -#include "expr.h" -#include "toplev.h" - -extern void compiler_error (); - -/* In C++, structures with well-defined constructors are initialized by - those constructors, unasked. CURRENT_BASE_INIT_LIST - holds a list of stmts for a BASE_INIT term in the grammar. - This list has one element for each base class which must be - initialized. The list elements are [basename, init], with - type basetype. This allows the possibly anachronistic form - (assuming d : a, b, c) "d (int a) : c(a+5), b (a-4), a (a+3)" - where each successive term can be handed down the constructor - line. Perhaps this was not intended. */ -tree current_base_init_list, current_member_init_list; - -static void expand_aggr_vbase_init_1 PROTO((tree, tree, tree, tree)); -static void expand_aggr_vbase_init PROTO((tree, tree, tree, tree)); -static void expand_aggr_init_1 PROTO((tree, tree, tree, tree, int)); -static void expand_default_init PROTO((tree, tree, tree, tree, int)); -static tree build_vec_delete_1 PROTO((tree, tree, tree, tree, tree, - int)); -static void perform_member_init PROTO((tree, tree, tree, int)); -static void sort_base_init PROTO((tree, tree *, tree *)); -static tree build_builtin_delete_call PROTO((tree)); -static int member_init_ok_or_else PROTO((tree, tree, char *)); -static void expand_virtual_init PROTO((tree, tree)); -static tree sort_member_init PROTO((tree)); -static tree build_partial_cleanup_for PROTO((tree)); -static tree initializing_context PROTO((tree)); -static void expand_vec_init_try_block PROTO((tree)); -static void expand_vec_init_catch_clause PROTO((tree, tree, tree, tree)); - -/* Cache the identifier nodes for the magic field of a new cookie. */ -static tree nc_nelts_field_id; - -static tree minus_one; - -/* Set up local variable for this file. MUST BE CALLED AFTER - INIT_DECL_PROCESSING. */ - -static tree BI_header_type, BI_header_size; - -void init_init_processing () -{ - tree fields[1]; - - minus_one = build_int_2 (-1, -1); - - /* Define the structure that holds header information for - arrays allocated via operator new. */ - BI_header_type = make_lang_type (RECORD_TYPE); - nc_nelts_field_id = get_identifier ("nelts"); - fields[0] = build_lang_field_decl (FIELD_DECL, nc_nelts_field_id, sizetype); - finish_builtin_type (BI_header_type, "__new_cookie", fields, - 0, double_type_node); - BI_header_size = size_in_bytes (BI_header_type); -} - -/* Subroutine of emit_base_init. For BINFO, initialize all the - virtual function table pointers, except those that come from - virtual base classes. Initialize binfo's vtable pointer, if - INIT_SELF is true. CAN_ELIDE is true when we know that all virtual - function table pointers in all bases have been initialized already, - probably because their constructors have just be run. ADDR is the - pointer to the object whos vtables we are going to initialize. - - REAL_BINFO is usually the same as BINFO, except when addr is not of - pointer to the type of the real derived type that we want to - initialize for. This is the case when addr is a pointer to a sub - object of a complete object, and we only want to do part of the - complete object's initialization of vtable pointers. This is done - for all virtual table pointers in virtual base classes. REAL_BINFO - is used to find the BINFO_VTABLE that we initialize with. BINFO is - used for conversions of addr to subobjects. - - BINFO_TYPE (real_binfo) must be BINFO_TYPE (binfo). - - Relies upon binfo being inside TYPE_BINFO (TREE_TYPE (TREE_TYPE - (addr))). */ - -void -expand_direct_vtbls_init (real_binfo, binfo, init_self, can_elide, addr) - tree real_binfo, binfo, addr; - int init_self, can_elide; -{ - tree real_binfos = BINFO_BASETYPES (real_binfo); - tree binfos = BINFO_BASETYPES (binfo); - int i, n_baselinks = real_binfos ? TREE_VEC_LENGTH (real_binfos) : 0; - - for (i = 0; i < n_baselinks; i++) - { - tree real_base_binfo = TREE_VEC_ELT (real_binfos, i); - tree base_binfo = TREE_VEC_ELT (binfos, i); - int is_not_base_vtable - = i != CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (real_binfo)); - if (! TREE_VIA_VIRTUAL (real_base_binfo)) - expand_direct_vtbls_init (real_base_binfo, base_binfo, - is_not_base_vtable, can_elide, addr); - } -#if 0 - /* Before turning this on, make sure it is correct. */ - if (can_elide && ! BINFO_MODIFIED (binfo)) - return; -#endif - /* Should we use something besides CLASSTYPE_VFIELDS? */ - if (init_self && CLASSTYPE_VFIELDS (BINFO_TYPE (real_binfo))) - { - tree base_ptr = convert_pointer_to_real (binfo, addr); - expand_virtual_init (real_binfo, base_ptr); - } -} - -/* 348 - 351 */ -/* Subroutine of emit_base_init. */ - -static void -perform_member_init (member, name, init, explicit) - tree member, name, init; - int explicit; -{ - tree decl; - tree type = TREE_TYPE (member); - - expand_start_target_temps (); - - if (TYPE_NEEDS_CONSTRUCTING (type) - || (init && TYPE_HAS_CONSTRUCTOR (type))) - { - /* Since `init' is already a TREE_LIST on the current_member_init_list, - only build it into one if we aren't already a list. */ - if (init != NULL_TREE && TREE_CODE (init) != TREE_LIST) - init = build_expr_list (NULL_TREE, init); - - decl = build_component_ref (current_class_ref, name, NULL_TREE, explicit); - - if (explicit - && TREE_CODE (type) == ARRAY_TYPE - && init != NULL_TREE - && TREE_CHAIN (init) == NULL_TREE - && TREE_CODE (TREE_TYPE (TREE_VALUE (init))) == ARRAY_TYPE) - { - /* Initialization of one array from another. */ - expand_vec_init (TREE_OPERAND (decl, 1), decl, - array_type_nelts (type), TREE_VALUE (init), 1); - } - else - expand_aggr_init (decl, init, 0); - } - else - { - if (init == NULL_TREE) - { - if (explicit) - { - /* default-initialization. */ - if (AGGREGATE_TYPE_P (type)) - init = build (CONSTRUCTOR, type, NULL_TREE, NULL_TREE); - else if (TREE_CODE (type) == REFERENCE_TYPE) - { - cp_error ("default-initialization of `%#D', which has reference type", - member); - init = error_mark_node; - } - else - init = integer_zero_node; - } - /* member traversal: note it leaves init NULL */ - else if (TREE_CODE (TREE_TYPE (member)) == REFERENCE_TYPE) - cp_pedwarn ("uninitialized reference member `%D'", member); - } - else if (TREE_CODE (init) == TREE_LIST) - { - /* There was an explicit member initialization. Do some - work in that case. */ - if (TREE_CHAIN (init)) - { - warning ("initializer list treated as compound expression"); - init = build_compound_expr (init); - } - else - init = TREE_VALUE (init); - } - - /* We only build this with a null init if we got it from the - current_member_init_list. */ - if (init || explicit) - { - decl = build_component_ref (current_class_ref, name, NULL_TREE, - explicit); - expand_expr_stmt (build_modify_expr (decl, INIT_EXPR, init)); - } - } - - expand_end_target_temps (); - free_temp_slots (); - - if (TYPE_NEEDS_DESTRUCTOR (type)) - { - tree expr; - - /* All cleanups must be on the function_obstack. */ - push_obstacks_nochange (); - resume_temporary_allocation (); - - expr = build_component_ref (current_class_ref, name, NULL_TREE, - explicit); - expr = build_delete (type, expr, integer_zero_node, - LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0); - - if (expr != error_mark_node) - add_partial_entry (expr); - - pop_obstacks (); - } -} - -extern int warn_reorder; - -/* Subroutine of emit_member_init. */ - -static tree -sort_member_init (t) - tree t; -{ - tree x, member, name, field; - tree init_list = NULL_TREE; - int last_pos = 0; - tree last_field = NULL_TREE; - - for (member = TYPE_FIELDS (t); member ; member = TREE_CHAIN (member)) - { - int pos; - - /* member could be, for example, a CONST_DECL for an enumerated - tag; we don't want to try to initialize that, since it already - has a value. */ - if (TREE_CODE (member) != FIELD_DECL || !DECL_NAME (member)) - continue; - - for (x = current_member_init_list, pos = 0; x; x = TREE_CHAIN (x), ++pos) - { - /* If we cleared this out, then pay no attention to it. */ - if (TREE_PURPOSE (x) == NULL_TREE) - continue; - name = TREE_PURPOSE (x); - -#if 0 - /* This happens in templates, since the IDENTIFIER is replaced - with the COMPONENT_REF in tsubst_expr. */ - field = (TREE_CODE (name) == COMPONENT_REF - ? TREE_OPERAND (name, 1) : IDENTIFIER_CLASS_VALUE (name)); -#else - /* Let's find out when this happens. */ - my_friendly_assert (TREE_CODE (name) != COMPONENT_REF, 348); - field = IDENTIFIER_CLASS_VALUE (name); -#endif - - /* If one member shadows another, get the outermost one. */ - if (TREE_CODE (field) == TREE_LIST) - field = TREE_VALUE (field); - - if (field == member) - { - if (warn_reorder) - { - if (pos < last_pos) - { - cp_warning_at ("member initializers for `%#D'", last_field); - cp_warning_at (" and `%#D'", field); - warning (" will be re-ordered to match declaration order"); - } - last_pos = pos; - last_field = field; - } - - /* Make sure we won't try to work on this init again. */ - TREE_PURPOSE (x) = NULL_TREE; - x = build_tree_list (name, TREE_VALUE (x)); - goto got_it; - } - } - - /* If we didn't find MEMBER in the list, create a dummy entry - so the two lists (INIT_LIST and the list of members) will be - symmetrical. */ - x = build_tree_list (NULL_TREE, NULL_TREE); - got_it: - init_list = chainon (init_list, x); - } - - /* Initializers for base members go at the end. */ - for (x = current_member_init_list ; x ; x = TREE_CHAIN (x)) - { - name = TREE_PURPOSE (x); - if (name) - { - if (purpose_member (name, init_list)) - { - cp_error ("multiple initializations given for member `%D'", - IDENTIFIER_CLASS_VALUE (name)); - continue; - } - - init_list = chainon (init_list, - build_tree_list (name, TREE_VALUE (x))); - TREE_PURPOSE (x) = NULL_TREE; - } - } - - return init_list; -} - -static void -sort_base_init (t, rbase_ptr, vbase_ptr) - tree t, *rbase_ptr, *vbase_ptr; -{ - tree binfos = BINFO_BASETYPES (TYPE_BINFO (t)); - int n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0; - - int i; - tree x; - tree last; - - /* For warn_reorder. */ - int last_pos = 0; - tree last_base = NULL_TREE; - - tree rbases = NULL_TREE; - tree vbases = NULL_TREE; - - /* First walk through and splice out vbase and invalid initializers. - Also replace names with binfos. */ - - last = tree_cons (NULL_TREE, NULL_TREE, current_base_init_list); - for (x = TREE_CHAIN (last); x; x = TREE_CHAIN (x)) - { - tree basetype = TREE_PURPOSE (x); - tree binfo = NULL_TREE; - - if (basetype == NULL_TREE) - { - /* Initializer for single base class. Must not - use multiple inheritance or this is ambiguous. */ - switch (n_baseclasses) - { - case 0: - cp_error ("`%T' does not have a base class to initialize", - current_class_type); - return; - case 1: - break; - default: - cp_error ("unnamed initializer ambiguous for `%T' which uses multiple inheritance", - current_class_type); - return; - } - binfo = TREE_VEC_ELT (binfos, 0); - } - else if (is_aggr_type (basetype, 1)) - { - binfo = binfo_or_else (basetype, t); - if (binfo == NULL_TREE) - continue; - - /* Virtual base classes are special cases. Their initializers - are recorded with this constructor, and they are used when - this constructor is the top-level constructor called. */ - if (TREE_VIA_VIRTUAL (binfo)) - { - tree v = CLASSTYPE_VBASECLASSES (t); - while (BINFO_TYPE (v) != BINFO_TYPE (binfo)) - v = TREE_CHAIN (v); - - vbases = tree_cons (v, TREE_VALUE (x), vbases); - continue; - } - else - { - /* Otherwise, if it is not an immediate base class, complain. */ - for (i = n_baseclasses-1; i >= 0; i--) - if (BINFO_TYPE (binfo) == BINFO_TYPE (TREE_VEC_ELT (binfos, i))) - break; - if (i < 0) - { - cp_error ("`%T' is not an immediate base class of `%T'", - basetype, current_class_type); - continue; - } - } - } - else - my_friendly_abort (365); - - TREE_PURPOSE (x) = binfo; - TREE_CHAIN (last) = x; - last = x; - } - TREE_CHAIN (last) = NULL_TREE; - - /* Now walk through our regular bases and make sure they're initialized. */ - - for (i = 0; i < n_baseclasses; ++i) - { - tree base_binfo = TREE_VEC_ELT (binfos, i); - int pos; - - if (TREE_VIA_VIRTUAL (base_binfo)) - continue; - - for (x = current_base_init_list, pos = 0; x; x = TREE_CHAIN (x), ++pos) - { - tree binfo = TREE_PURPOSE (x); - - if (binfo == NULL_TREE) - continue; - - if (binfo == base_binfo) - { - if (warn_reorder) - { - if (pos < last_pos) - { - cp_warning_at ("base initializers for `%#T'", last_base); - cp_warning_at (" and `%#T'", BINFO_TYPE (binfo)); - warning (" will be re-ordered to match inheritance order"); - } - last_pos = pos; - last_base = BINFO_TYPE (binfo); - } - - /* Make sure we won't try to work on this init again. */ - TREE_PURPOSE (x) = NULL_TREE; - x = build_tree_list (binfo, TREE_VALUE (x)); - goto got_it; - } - } - - /* If we didn't find BASE_BINFO in the list, create a dummy entry - so the two lists (RBASES and the list of bases) will be - symmetrical. */ - x = build_tree_list (NULL_TREE, NULL_TREE); - got_it: - rbases = chainon (rbases, x); - } - - *rbase_ptr = rbases; - *vbase_ptr = vbases; -} - -/* Perform partial cleanups for a base for exception handling. */ - -static tree -build_partial_cleanup_for (binfo) - tree binfo; -{ - return build_scoped_method_call - (current_class_ref, binfo, dtor_identifier, - build_expr_list (NULL_TREE, integer_zero_node)); -} - -/* Perform whatever initializations have yet to be done on the base - class of the class variable. These actions are in the global - variable CURRENT_BASE_INIT_LIST. Such an action could be - NULL_TREE, meaning that the user has explicitly called the base - class constructor with no arguments. - - If there is a need for a call to a constructor, we must surround - that call with a pushlevel/poplevel pair, since we are technically - at the PARM level of scope. - - Argument IMMEDIATELY, if zero, forces a new sequence to be - generated to contain these new insns, so it can be emitted later. - This sequence is saved in the global variable BASE_INIT_EXPR. - Otherwise, the insns are emitted into the current sequence. - - Note that emit_base_init does *not* initialize virtual base - classes. That is done specially, elsewhere. */ - -extern tree base_init_expr, rtl_expr_chain; - -void -emit_base_init (t, immediately) - tree t; - int immediately; -{ - tree member; - tree mem_init_list; - tree rbase_init_list, vbase_init_list; - tree t_binfo = TYPE_BINFO (t); - tree binfos = BINFO_BASETYPES (t_binfo); - int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0; - tree expr = NULL_TREE; - - if (! immediately) - { - int momentary; - do_pending_stack_adjust (); - /* Make the RTL_EXPR node temporary, not momentary, - so that rtl_expr_chain doesn't become garbage. */ - momentary = suspend_momentary (); - expr = make_node (RTL_EXPR); - resume_momentary (momentary); - start_sequence_for_rtl_expr (expr); - } - - if (write_symbols == NO_DEBUG) - /* As a matter of principle, `start_sequence' should do this. */ - emit_note (0, -1); - else - /* Always emit a line number note so we can step into constructors. */ - emit_line_note_force (DECL_SOURCE_FILE (current_function_decl), - DECL_SOURCE_LINE (current_function_decl)); - - mem_init_list = sort_member_init (t); - current_member_init_list = NULL_TREE; - - sort_base_init (t, &rbase_init_list, &vbase_init_list); - current_base_init_list = NULL_TREE; - - if (TYPE_USES_VIRTUAL_BASECLASSES (t)) - { - tree first_arg = TREE_CHAIN (DECL_ARGUMENTS (current_function_decl)); - - expand_start_cond (first_arg, 0); - expand_aggr_vbase_init (t_binfo, current_class_ref, current_class_ptr, - vbase_init_list); - expand_end_cond (); - } - - /* Now, perform initialization of non-virtual base classes. */ - for (i = 0; i < n_baseclasses; i++) - { - tree base_binfo = TREE_VEC_ELT (binfos, i); - tree init = void_list_node; - - if (TREE_VIA_VIRTUAL (base_binfo)) - continue; - - my_friendly_assert (BINFO_INHERITANCE_CHAIN (base_binfo) == t_binfo, - 999); - - if (TREE_PURPOSE (rbase_init_list)) - init = TREE_VALUE (rbase_init_list); - else if (TYPE_NEEDS_CONSTRUCTING (BINFO_TYPE (base_binfo))) - { - init = NULL_TREE; - if (extra_warnings && copy_args_p (current_function_decl)) - cp_warning ("base class `%#T' should be explicitly initialized in the copy constructor", - BINFO_TYPE (base_binfo)); - } - - if (init != void_list_node) - { - expand_start_target_temps (); - - member = convert_pointer_to_real (base_binfo, current_class_ptr); - expand_aggr_init_1 (base_binfo, NULL_TREE, - build_indirect_ref (member, NULL_PTR), init, - LOOKUP_NORMAL); - - expand_end_target_temps (); - free_temp_slots (); - } - - if (TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (base_binfo))) - { - tree expr; - - /* All cleanups must be on the function_obstack. */ - push_obstacks_nochange (); - resume_temporary_allocation (); - expr = build_partial_cleanup_for (base_binfo); - pop_obstacks (); - add_partial_entry (expr); - } - - rbase_init_list = TREE_CHAIN (rbase_init_list); - } - - /* Initialize all the virtual function table fields that - do come from virtual base classes. */ - if (TYPE_USES_VIRTUAL_BASECLASSES (t)) - expand_indirect_vtbls_init (t_binfo, current_class_ref, current_class_ptr); - - /* Initialize all the virtual function table fields that - do not come from virtual base classes. */ - expand_direct_vtbls_init (t_binfo, t_binfo, 1, 1, current_class_ptr); - - for (member = TYPE_FIELDS (t); member; member = TREE_CHAIN (member)) - { - tree init, name; - int from_init_list; - - /* member could be, for example, a CONST_DECL for an enumerated - tag; we don't want to try to initialize that, since it already - has a value. */ - if (TREE_CODE (member) != FIELD_DECL || !DECL_NAME (member)) - continue; - - /* See if we had a user-specified member initialization. */ - if (TREE_PURPOSE (mem_init_list)) - { - name = TREE_PURPOSE (mem_init_list); - init = TREE_VALUE (mem_init_list); - from_init_list = 1; - -#if 0 - if (TREE_CODE (name) == COMPONENT_REF) - name = DECL_NAME (TREE_OPERAND (name, 1)); -#else - /* Also see if it's ever a COMPONENT_REF here. If it is, we - need to do `expand_assignment (name, init, 0, 0);' and - a continue. */ - my_friendly_assert (TREE_CODE (name) != COMPONENT_REF, 349); -#endif - } - else - { - name = DECL_NAME (member); - init = DECL_INITIAL (member); - - from_init_list = 0; - - /* Effective C++ rule 12. */ - if (warn_ecpp && init == NULL_TREE - && !DECL_ARTIFICIAL (member) - && TREE_CODE (TREE_TYPE (member)) != ARRAY_TYPE) - cp_warning ("`%D' should be initialized in the member initialization list", member); - } - - perform_member_init (member, name, init, from_init_list); - mem_init_list = TREE_CHAIN (mem_init_list); - } - - /* Now initialize any members from our bases. */ - while (mem_init_list) - { - tree name, init, field; - - if (TREE_PURPOSE (mem_init_list)) - { - name = TREE_PURPOSE (mem_init_list); - init = TREE_VALUE (mem_init_list); - /* XXX: this may need the COMPONENT_REF operand 0 check if - it turns out we actually get them. */ - field = IDENTIFIER_CLASS_VALUE (name); - - /* If one member shadows another, get the outermost one. */ - if (TREE_CODE (field) == TREE_LIST) - { - field = TREE_VALUE (field); - if (decl_type_context (field) != current_class_type) - cp_error ("field `%D' not in immediate context", field); - } - -#if 0 - /* It turns out if you have an anonymous union in the - class, a member from it can end up not being on the - list of fields (rather, the type is), and therefore - won't be seen by the for loop above. */ - - /* The code in this for loop is derived from a general loop - which had this check in it. Theoretically, we've hit - every initialization for the list of members in T, so - we shouldn't have anything but these left in this list. */ - my_friendly_assert (DECL_FIELD_CONTEXT (field) != t, 351); -#endif - - perform_member_init (field, name, init, 1); - } - mem_init_list = TREE_CHAIN (mem_init_list); - } - - if (! immediately) - { - do_pending_stack_adjust (); - my_friendly_assert (base_init_expr == 0, 207); - base_init_expr = expr; - TREE_TYPE (expr) = void_type_node; - RTL_EXPR_RTL (expr) = const0_rtx; - RTL_EXPR_SEQUENCE (expr) = get_insns (); - rtl_expr_chain = tree_cons (NULL_TREE, expr, rtl_expr_chain); - end_sequence (); - TREE_SIDE_EFFECTS (expr) = 1; - } - - /* All the implicit try blocks we built up will be zapped - when we come to a real binding contour boundary. */ -} - -/* Check that all fields are properly initialized after - an assignment to `this'. */ - -void -check_base_init (t) - tree t; -{ - tree member; - for (member = TYPE_FIELDS (t); member; member = TREE_CHAIN (member)) - if (DECL_NAME (member) && TREE_USED (member)) - cp_error ("field `%D' used before initialized (after assignment to `this')", - member); -} - -/* This code sets up the virtual function tables appropriate for - the pointer DECL. It is a one-ply initialization. - - BINFO is the exact type that DECL is supposed to be. In - multiple inheritance, this might mean "C's A" if C : A, B. */ - -static void -expand_virtual_init (binfo, decl) - tree binfo, decl; -{ - tree type = BINFO_TYPE (binfo); - tree vtbl, vtbl_ptr; - tree vtype, vtype_binfo; - - /* This code is crusty. Should be simple, like: - vtbl = BINFO_VTABLE (binfo); - */ - vtype = DECL_CONTEXT (CLASSTYPE_VFIELD (type)); - vtype_binfo = get_binfo (vtype, TREE_TYPE (TREE_TYPE (decl)), 0); - vtbl = BINFO_VTABLE (binfo_value (DECL_FIELD_CONTEXT (CLASSTYPE_VFIELD (type)), binfo)); - assemble_external (vtbl); - TREE_USED (vtbl) = 1; - vtbl = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (vtbl)), vtbl); - decl = convert_pointer_to_real (vtype_binfo, decl); - vtbl_ptr = build_vfield_ref (build_indirect_ref (decl, NULL_PTR), vtype); - if (vtbl_ptr == error_mark_node) - return; - - /* Have to convert VTBL since array sizes may be different. */ - vtbl = convert_force (TREE_TYPE (vtbl_ptr), vtbl, 0); - expand_expr_stmt (build_modify_expr (vtbl_ptr, NOP_EXPR, vtbl)); -} - -/* Subroutine of `expand_aggr_vbase_init'. - BINFO is the binfo of the type that is being initialized. - INIT_LIST is the list of initializers for the virtual baseclass. */ - -static void -expand_aggr_vbase_init_1 (binfo, exp, addr, init_list) - tree binfo, exp, addr, init_list; -{ - tree init = purpose_member (binfo, init_list); - tree ref = build_indirect_ref (addr, NULL_PTR); - - expand_start_target_temps (); - - if (init) - init = TREE_VALUE (init); - /* Call constructors, but don't set up vtables. */ - expand_aggr_init_1 (binfo, exp, ref, init, LOOKUP_COMPLAIN); - - expand_end_target_temps (); - free_temp_slots (); -} - -/* Initialize this object's virtual base class pointers. This must be - done only at the top-level of the object being constructed. - - INIT_LIST is list of initialization for constructor to perform. */ - -static void -expand_aggr_vbase_init (binfo, exp, addr, init_list) - tree binfo; - tree exp; - tree addr; - tree init_list; -{ - tree type = BINFO_TYPE (binfo); - - if (TYPE_USES_VIRTUAL_BASECLASSES (type)) - { - tree result = init_vbase_pointers (type, addr); - tree vbases; - - if (result) - expand_expr_stmt (build_compound_expr (result)); - - for (vbases = CLASSTYPE_VBASECLASSES (type); vbases; - vbases = TREE_CHAIN (vbases)) - { - tree tmp = purpose_member (vbases, result); - expand_aggr_vbase_init_1 (vbases, exp, - TREE_OPERAND (TREE_VALUE (tmp), 0), - init_list); - } - } -} - -/* Find the context in which this FIELD can be initialized. */ - -static tree -initializing_context (field) - tree field; -{ - tree t = DECL_CONTEXT (field); - - /* Anonymous union members can be initialized in the first enclosing - non-anonymous union context. */ - while (t && ANON_UNION_TYPE_P (t)) - t = TYPE_CONTEXT (t); - return t; -} - -/* Function to give error message if member initialization specification - is erroneous. FIELD is the member we decided to initialize. - TYPE is the type for which the initialization is being performed. - FIELD must be a member of TYPE. - - MEMBER_NAME is the name of the member. */ - -static int -member_init_ok_or_else (field, type, member_name) - tree field; - tree type; - char *member_name; -{ - if (field == error_mark_node) - return 0; - if (field == NULL_TREE || initializing_context (field) != type) - { - cp_error ("class `%T' does not have any field named `%s'", type, - member_name); - return 0; - } - if (TREE_STATIC (field)) - { - cp_error ("field `%#D' is static; only point of initialization is its declaration", - field); - return 0; - } - - return 1; -} - -/* If NAME is a viable field name for the aggregate DECL, - and PARMS is a viable parameter list, then expand an _EXPR - which describes this initialization. - - Note that we do not need to chase through the class's base classes - to look for NAME, because if it's in that list, it will be handled - by the constructor for that base class. - - We do not yet have a fixed-point finder to instantiate types - being fed to overloaded constructors. If there is a unique - constructor, then argument types can be got from that one. - - If INIT is non-NULL, then it the initialization should - be placed in `current_base_init_list', where it will be processed - by `emit_base_init'. */ - -void -expand_member_init (exp, name, init) - tree exp, name, init; -{ - tree basetype = NULL_TREE, field; - tree type; - - if (exp == NULL_TREE) - return; /* complain about this later */ - - type = TYPE_MAIN_VARIANT (TREE_TYPE (exp)); - - if (name && TREE_CODE (name) == TYPE_DECL) - { - basetype = TYPE_MAIN_VARIANT (TREE_TYPE (name)); - name = DECL_NAME (name); - } - - if (name == NULL_TREE && IS_AGGR_TYPE (type)) - switch (CLASSTYPE_N_BASECLASSES (type)) - { - case 0: - error ("base class initializer specified, but no base class to initialize"); - return; - case 1: - basetype = TYPE_BINFO_BASETYPE (type, 0); - break; - default: - error ("initializer for unnamed base class ambiguous"); - cp_error ("(type `%T' uses multiple inheritance)", type); - return; - } - - my_friendly_assert (init != NULL_TREE, 0); - - /* The grammar should not allow fields which have names that are - TYPENAMEs. Therefore, if the field has a non-NULL TREE_TYPE, we - may assume that this is an attempt to initialize a base class - member of the current type. Otherwise, it is an attempt to - initialize a member field. */ - - if (init == void_type_node) - init = NULL_TREE; - - if (name == NULL_TREE || basetype) - { - tree base_init; - - if (name == NULL_TREE) - { -#if 0 - if (basetype) - name = TYPE_IDENTIFIER (basetype); - else - { - error ("no base class to initialize"); - return; - } -#endif - } - else if (basetype != type - && ! current_template_parms - && ! vec_binfo_member (basetype, - TYPE_BINFO_BASETYPES (type)) - && ! binfo_member (basetype, CLASSTYPE_VBASECLASSES (type))) - { - if (IDENTIFIER_CLASS_VALUE (name)) - goto try_member; - if (TYPE_USES_VIRTUAL_BASECLASSES (type)) - cp_error ("type `%T' is not an immediate or virtual basetype for `%T'", - basetype, type); - else - cp_error ("type `%T' is not an immediate basetype for `%T'", - basetype, type); - return; - } - - if (purpose_member (basetype, current_base_init_list)) - { - cp_error ("base class `%T' already initialized", basetype); - return; - } - - if (warn_reorder && current_member_init_list) - { - cp_warning ("base initializer for `%T'", basetype); - warning (" will be re-ordered to precede member initializations"); - } - - base_init = build_tree_list (basetype, init); - current_base_init_list = chainon (current_base_init_list, base_init); - } - else - { - tree member_init; - - try_member: - field = lookup_field (type, name, 1, 0); - - if (! member_init_ok_or_else (field, type, IDENTIFIER_POINTER (name))) - return; - - if (purpose_member (name, current_member_init_list)) - { - cp_error ("field `%D' already initialized", field); - return; - } - - member_init = build_tree_list (name, init); - current_member_init_list = chainon (current_member_init_list, member_init); - } -} - -/* This is like `expand_member_init', only it stores one aggregate - value into another. - - INIT comes in two flavors: it is either a value which - is to be stored in EXP, or it is a parameter list - to go to a constructor, which will operate on EXP. - If INIT is not a parameter list for a constructor, then set - LOOKUP_ONLYCONVERTING. - If FLAGS is LOOKUP_ONLYCONVERTING then it is the = init form of - the initializer, if FLAGS is 0, then it is the (init) form. - If `init' is a CONSTRUCTOR, then we emit a warning message, - explaining that such initializations are invalid. - - ALIAS_THIS is nonzero iff we are initializing something which is - essentially an alias for current_class_ref. In this case, the base - constructor may move it on us, and we must keep track of such - deviations. - - If INIT resolves to a CALL_EXPR which happens to return - something of the type we are looking for, then we know - that we can safely use that call to perform the - initialization. - - The virtual function table pointer cannot be set up here, because - we do not really know its type. - - Virtual baseclass pointers are also set up here. - - This never calls operator=(). - - When initializing, nothing is CONST. - - A default copy constructor may have to be used to perform the - initialization. - - A constructor or a conversion operator may have to be used to - perform the initialization, but not both, as it would be ambiguous. */ - -void -expand_aggr_init (exp, init, flags) - tree exp, init; - int flags; -{ - tree type = TREE_TYPE (exp); - int was_const = TREE_READONLY (exp); - int was_volatile = TREE_THIS_VOLATILE (exp); - - if (init == error_mark_node) - return; - - TREE_READONLY (exp) = 0; - TREE_THIS_VOLATILE (exp) = 0; - - if (init && TREE_CODE (init) != TREE_LIST) - flags |= LOOKUP_ONLYCONVERTING; - - if (TREE_CODE (type) == ARRAY_TYPE) - { - /* Must arrange to initialize each element of EXP - from elements of INIT. */ - tree itype = init ? TREE_TYPE (init) : NULL_TREE; - if (CP_TYPE_QUALS (type) != TYPE_UNQUALIFIED) - { - TREE_TYPE (exp) = TYPE_MAIN_VARIANT (type); - if (init) - TREE_TYPE (init) = TYPE_MAIN_VARIANT (itype); - } - if (init && TREE_TYPE (init) == NULL_TREE) - { - /* Handle bad initializers like: - class COMPLEX { - public: - double re, im; - COMPLEX(double r = 0.0, double i = 0.0) {re = r; im = i;}; - ~COMPLEX() {}; - }; - - int main(int argc, char **argv) { - COMPLEX zees(1.0, 0.0)[10]; - } - */ - error ("bad array initializer"); - return; - } - expand_vec_init (exp, exp, array_type_nelts (type), init, - init && same_type_p (TREE_TYPE (init), - TREE_TYPE (exp))); - TREE_READONLY (exp) = was_const; - TREE_THIS_VOLATILE (exp) = was_volatile; - TREE_TYPE (exp) = type; - if (init) - TREE_TYPE (init) = itype; - return; - } - - if (TREE_CODE (exp) == VAR_DECL || TREE_CODE (exp) == PARM_DECL) - /* just know that we've seen something for this node */ - TREE_USED (exp) = 1; - -#if 0 - /* If initializing from a GNU C CONSTRUCTOR, consider the elts in the - constructor as parameters to an implicit GNU C++ constructor. */ - if (init && TREE_CODE (init) == CONSTRUCTOR - && TYPE_HAS_CONSTRUCTOR (type) - && TREE_TYPE (init) == type) - init = CONSTRUCTOR_ELTS (init); -#endif - - TREE_TYPE (exp) = TYPE_MAIN_VARIANT (type); - expand_aggr_init_1 (TYPE_BINFO (type), exp, exp, - init, LOOKUP_NORMAL|flags); - TREE_TYPE (exp) = type; - TREE_READONLY (exp) = was_const; - TREE_THIS_VOLATILE (exp) = was_volatile; -} - -static void -expand_default_init (binfo, true_exp, exp, init, flags) - tree binfo; - tree true_exp, exp; - tree init; - int flags; -{ - tree type = TREE_TYPE (exp); - - /* It fails because there may not be a constructor which takes - its own type as the first (or only parameter), but which does - take other types via a conversion. So, if the thing initializing - the expression is a unit element of type X, first try X(X&), - followed by initialization by X. If neither of these work - out, then look hard. */ - tree rval; - tree parms; - - if (init && TREE_CODE (init) != TREE_LIST - && (flags & LOOKUP_ONLYCONVERTING)) - { - /* Base subobjects should only get direct-initialization. */ - if (true_exp != exp) - abort (); - - if (flags & DIRECT_BIND) - /* Do nothing. We hit this in two cases: Reference initialization, - where we aren't initializing a real variable, so we don't want - to run a new constructor; and catching an exception, where we - have already built up the constructor call so we could wrap it - in an exception region. */; - else - init = ocp_convert (type, init, CONV_IMPLICIT|CONV_FORCE_TEMP, flags); - - if (TREE_CODE (init) == TRY_CATCH_EXPR) - /* We need to protect the initialization of a catch parm - with a call to terminate(), which shows up as a TRY_CATCH_EXPR - around the TARGET_EXPR for the copy constructor. See - expand_start_catch_block. */ - TREE_OPERAND (init, 0) = build (INIT_EXPR, TREE_TYPE (exp), exp, - TREE_OPERAND (init, 0)); - else - init = build (INIT_EXPR, TREE_TYPE (exp), exp, init); - TREE_SIDE_EFFECTS (init) = 1; - expand_expr_stmt (init); - return; - } - - if (init == NULL_TREE - || (TREE_CODE (init) == TREE_LIST && ! TREE_TYPE (init))) - { - parms = init; - if (parms) - init = TREE_VALUE (parms); - } - else - parms = build_expr_list (NULL_TREE, init); - - if (TYPE_USES_VIRTUAL_BASECLASSES (type)) - { - if (true_exp == exp) - parms = expr_tree_cons (NULL_TREE, integer_one_node, parms); - else - parms = expr_tree_cons (NULL_TREE, integer_zero_node, parms); - flags |= LOOKUP_HAS_IN_CHARGE; - } - - rval = build_method_call (exp, ctor_identifier, - parms, binfo, flags); - if (TREE_SIDE_EFFECTS (rval)) - expand_expr_stmt (rval); -} - -/* This function is responsible for initializing EXP with INIT - (if any). - - BINFO is the binfo of the type for who we are performing the - initialization. For example, if W is a virtual base class of A and B, - and C : A, B. - If we are initializing B, then W must contain B's W vtable, whereas - were we initializing C, W must contain C's W vtable. - - TRUE_EXP is nonzero if it is the true expression being initialized. - In this case, it may be EXP, or may just contain EXP. The reason we - need this is because if EXP is a base element of TRUE_EXP, we - don't necessarily know by looking at EXP where its virtual - baseclass fields should really be pointing. But we do know - from TRUE_EXP. In constructors, we don't know anything about - the value being initialized. - - ALIAS_THIS serves the same purpose it serves for expand_aggr_init. - - FLAGS is just passes to `build_method_call'. See that function for - its description. */ - -static void -expand_aggr_init_1 (binfo, true_exp, exp, init, flags) - tree binfo; - tree true_exp, exp; - tree init; - int flags; -{ - tree type = TREE_TYPE (exp); - - my_friendly_assert (init != error_mark_node && type != error_mark_node, 211); - - /* Use a function returning the desired type to initialize EXP for us. - If the function is a constructor, and its first argument is - NULL_TREE, know that it was meant for us--just slide exp on - in and expand the constructor. Constructors now come - as TARGET_EXPRs. */ - - if (init && TREE_CODE (exp) == VAR_DECL - && TREE_CODE (init) == CONSTRUCTOR - && TREE_HAS_CONSTRUCTOR (init)) - { - tree t = store_init_value (exp, init); - if (!t) - { - expand_decl_init (exp); - return; - } - t = build (INIT_EXPR, type, exp, init); - TREE_SIDE_EFFECTS (t) = 1; - expand_expr_stmt (t); - return; - } - - /* We know that expand_default_init can handle everything we want - at this point. */ - expand_default_init (binfo, true_exp, exp, init, flags); -} - -/* Report an error if NAME is not the name of a user-defined, - aggregate type. If OR_ELSE is nonzero, give an error message. */ - -int -is_aggr_typedef (name, or_else) - tree name; - int or_else; -{ - tree type; - - if (name == error_mark_node) - return 0; - - if (IDENTIFIER_HAS_TYPE_VALUE (name)) - type = IDENTIFIER_TYPE_VALUE (name); - else - { - if (or_else) - cp_error ("`%T' is not an aggregate typedef", name); - return 0; - } - - if (! IS_AGGR_TYPE (type) - && TREE_CODE (type) != TEMPLATE_TYPE_PARM - && TREE_CODE (type) != TEMPLATE_TEMPLATE_PARM) - { - if (or_else) - cp_error ("`%T' is not an aggregate type", type); - return 0; - } - return 1; -} - -/* Report an error if TYPE is not a user-defined, aggregate type. If - OR_ELSE is nonzero, give an error message. */ - -int -is_aggr_type (type, or_else) - tree type; - int or_else; -{ - if (type == error_mark_node) - return 0; - - if (! IS_AGGR_TYPE (type) - && TREE_CODE (type) != TEMPLATE_TYPE_PARM - && TREE_CODE (type) != TEMPLATE_TEMPLATE_PARM) - { - if (or_else) - cp_error ("`%T' is not an aggregate type", type); - return 0; - } - return 1; -} - -/* Like is_aggr_typedef, but returns typedef if successful. */ - -tree -get_aggr_from_typedef (name, or_else) - tree name; - int or_else; -{ - tree type; - - if (name == error_mark_node) - return NULL_TREE; - - if (IDENTIFIER_HAS_TYPE_VALUE (name)) - type = IDENTIFIER_TYPE_VALUE (name); - else - { - if (or_else) - cp_error ("`%T' fails to be an aggregate typedef", name); - return NULL_TREE; - } - - if (! IS_AGGR_TYPE (type) - && TREE_CODE (type) != TEMPLATE_TYPE_PARM - && TREE_CODE (type) != TEMPLATE_TEMPLATE_PARM) - { - if (or_else) - cp_error ("type `%T' is of non-aggregate type", type); - return NULL_TREE; - } - return type; -} - -tree -get_type_value (name) - tree name; -{ - if (name == error_mark_node) - return NULL_TREE; - - if (IDENTIFIER_HAS_TYPE_VALUE (name)) - return IDENTIFIER_TYPE_VALUE (name); - else - return NULL_TREE; -} - - -/* This code could just as well go in `class.c', but is placed here for - modularity. */ - -/* For an expression of the form TYPE :: NAME (PARMLIST), build - the appropriate function call. */ - -tree -build_member_call (type, name, parmlist) - tree type, name, parmlist; -{ - tree t; - tree method_name; - int dtor = 0; - tree basetype_path, decl; - - if (TREE_CODE (name) == TEMPLATE_ID_EXPR - && TREE_CODE (type) == NAMESPACE_DECL) - { - /* 'name' already refers to the decls from the namespace, since we - hit do_identifier for template_ids. */ - my_friendly_assert (is_overloaded_fn (TREE_OPERAND (name, 0)), 980519); - return build_x_function_call (name, parmlist, current_class_ref); - } - - if (type == std_node) - return build_x_function_call (do_scoped_id (name, 0), parmlist, - current_class_ref); - if (TREE_CODE (type) == NAMESPACE_DECL) - return build_x_function_call (lookup_namespace_name (type, name), - parmlist, current_class_ref); - - if (TREE_CODE (name) != TEMPLATE_ID_EXPR) - method_name = name; - else - method_name = TREE_OPERAND (name, 0); - - if (TREE_CODE (method_name) == BIT_NOT_EXPR) - { - method_name = TREE_OPERAND (method_name, 0); - dtor = 1; - } - - /* This shouldn't be here, and build_member_call shouldn't appear in - parse.y! (mrs) */ - if (type && TREE_CODE (type) == IDENTIFIER_NODE - && get_aggr_from_typedef (type, 0) == 0) - { - tree ns = lookup_name (type, 0); - if (ns && TREE_CODE (ns) == NAMESPACE_DECL) - { - return build_x_function_call (build_offset_ref (type, name), parmlist, current_class_ref); - } - } - - if (type == NULL_TREE || ! is_aggr_type (type, 1)) - return error_mark_node; - - /* An operator we did not like. */ - if (name == NULL_TREE) - return error_mark_node; - - if (dtor) - { - cp_error ("cannot call destructor `%T::~%T' without object", type, - method_name); - return error_mark_node; - } - - decl = maybe_dummy_object (type, &basetype_path); - - /* Convert 'this' to the specified type to disambiguate conversion - to the function's context. Apparently Standard C++ says that we - shouldn't do this. */ - if (decl == current_class_ref - && ! pedantic - && ACCESSIBLY_UNIQUELY_DERIVED_P (type, current_class_type)) - { - tree olddecl = current_class_ptr; - tree oldtype = TREE_TYPE (TREE_TYPE (olddecl)); - if (oldtype != type) - { - tree newtype = build_qualified_type (type, TYPE_QUALS (oldtype)); - decl = convert_force (build_pointer_type (newtype), olddecl, 0); - decl = build_indirect_ref (decl, NULL_PTR); - } - } - - if (method_name == constructor_name (type) - || method_name == constructor_name_full (type)) - return build_functional_cast (type, parmlist); - if ((t = lookup_fnfields (basetype_path, method_name, 0))) - return build_method_call (decl, - TREE_CODE (name) == TEMPLATE_ID_EXPR - ? name : method_name, - parmlist, basetype_path, - LOOKUP_NORMAL|LOOKUP_NONVIRTUAL); - if (TREE_CODE (name) == IDENTIFIER_NODE - && ((t = lookup_field (TYPE_BINFO (type), name, 1, 0)))) - { - if (t == error_mark_node) - return error_mark_node; - if (TREE_CODE (t) == FIELD_DECL) - { - if (is_dummy_object (decl)) - { - cp_error ("invalid use of non-static field `%D'", t); - return error_mark_node; - } - decl = build (COMPONENT_REF, TREE_TYPE (t), decl, t); - } - else if (TREE_CODE (t) == VAR_DECL) - decl = t; - else - { - cp_error ("invalid use of member `%D'", t); - return error_mark_node; - } - if (TYPE_LANG_SPECIFIC (TREE_TYPE (decl))) - return build_opfncall (CALL_EXPR, LOOKUP_NORMAL, decl, - parmlist, NULL_TREE); - return build_function_call (decl, parmlist); - } - else - { - cp_error ("no method `%T::%D'", type, name); - return error_mark_node; - } -} - -/* Build a reference to a member of an aggregate. This is not a - C++ `&', but really something which can have its address taken, - and then act as a pointer to member, for example TYPE :: FIELD - can have its address taken by saying & TYPE :: FIELD. - - @@ Prints out lousy diagnostics for operator - @@ fields. - - @@ This function should be rewritten and placed in search.c. */ - -tree -build_offset_ref (type, name) - tree type, name; -{ - tree decl, fnfields, fields, t = error_mark_node; - tree basebinfo = NULL_TREE; - tree orig_name = name; - - /* class templates can come in as TEMPLATE_DECLs here. */ - if (TREE_CODE (name) == TEMPLATE_DECL) - return name; - - if (type == std_node) - return do_scoped_id (name, 0); - - if (processing_template_decl || uses_template_parms (type)) - return build_min_nt (SCOPE_REF, type, name); - - /* Handle namespace names fully here. */ - if (TREE_CODE (type) == NAMESPACE_DECL) - { - t = lookup_namespace_name (type, name); - if (t != error_mark_node && ! type_unknown_p (t)) - { - mark_used (t); - t = convert_from_reference (t); - } - return t; - } - - if (type == NULL_TREE || ! is_aggr_type (type, 1)) - return error_mark_node; - - if (TREE_CODE (name) == TEMPLATE_ID_EXPR) - { - /* If the NAME is a TEMPLATE_ID_EXPR, we are looking at - something like `a.template f' or the like. For the most - part, we treat this just like a.f. We do remember, however, - the template-id that was used. */ - name = TREE_OPERAND (orig_name, 0); - - if (TREE_CODE (name) == LOOKUP_EXPR) - /* This can happen during tsubst'ing. */ - name = TREE_OPERAND (name, 0); - - my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 0); - } - - if (TREE_CODE (name) == BIT_NOT_EXPR) - { - if (! check_dtor_name (type, name)) - cp_error ("qualified type `%T' does not match destructor name `~%T'", - type, TREE_OPERAND (name, 0)); - name = dtor_identifier; - } -#if 0 - /* I think this is wrong, but the draft is unclear. --jason 6/15/98 */ - else if (name == constructor_name_full (type) - || name == constructor_name (type)) - name = ctor_identifier; -#endif - - if (TYPE_SIZE (complete_type (type)) == 0 - && !TYPE_BEING_DEFINED (type)) - { - cp_error ("incomplete type `%T' does not have member `%D'", type, - name); - return error_mark_node; - } - - decl = maybe_dummy_object (type, &basebinfo); - - fnfields = lookup_fnfields (basebinfo, name, 1); - fields = lookup_field (basebinfo, name, 0, 0); - - if (fields == error_mark_node || fnfields == error_mark_node) - return error_mark_node; - - /* A lot of this logic is now handled in lookup_field and - lookup_fnfield. */ - if (fnfields) - { - /* Go from the TREE_BASELINK to the member function info. */ - t = TREE_VALUE (fnfields); - - if (TREE_CODE (orig_name) == TEMPLATE_ID_EXPR) - { - /* The FNFIELDS are going to contain functions that aren't - necessarily templates, and templates that don't - necessarily match the explicit template parameters. We - save all the functions, and the explicit parameters, and - then figure out exactly what to instantiate with what - arguments in instantiate_type. */ - - if (TREE_CODE (t) != OVERLOAD) - /* The code in instantiate_type which will process this - expects to encounter OVERLOADs, not raw functions. */ - t = ovl_cons (t, NULL_TREE); - - return build (OFFSET_REF, - build_offset_type (type, unknown_type_node), - decl, - build (TEMPLATE_ID_EXPR, - TREE_TYPE (t), - t, - TREE_OPERAND (orig_name, 1))); - } - - if (!really_overloaded_fn (t)) - { - tree access; - - /* Get rid of a potential OVERLOAD around it */ - t = OVL_CURRENT (t); - - /* unique functions are handled easily. */ - basebinfo = TREE_PURPOSE (fnfields); - access = compute_access (basebinfo, t); - if (access == access_protected_node) - { - cp_error_at ("member function `%#D' is protected", t); - error ("in this context"); - return error_mark_node; - } - if (access == access_private_node) - { - cp_error_at ("member function `%#D' is private", t); - error ("in this context"); - return error_mark_node; - } - mark_used (t); - if (DECL_STATIC_FUNCTION_P (t)) - return t; - return build (OFFSET_REF, TREE_TYPE (t), decl, t); - } - - /* FNFIELDS is most likely allocated on the search_obstack, - which will go away after this class scope. If we need - to save this value for later (i.e. for use as an initializer - for a static variable), then do so here. - - ??? The smart thing to do for the case of saving initializers - is to resolve them before we're done with this scope. */ - if (!TREE_PERMANENT (fnfields) - && ! allocation_temporary_p ()) - fnfields = copy_list (fnfields); - - t = build_tree_list (error_mark_node, fnfields); - TREE_TYPE (t) = build_offset_type (type, unknown_type_node); - return t; - } - - /* Now that we know we are looking for a field, see if we - have access to that field. Lookup_field will give us the - error message. */ - - t = lookup_field (basebinfo, name, 1, 0); - - if (t == error_mark_node) - return error_mark_node; - - if (t == NULL_TREE) - { - cp_error ("`%D' is not a member of type `%T'", name, type); - return error_mark_node; - } - - if (TREE_CODE (t) == TYPE_DECL) - { - TREE_USED (t) = 1; - return t; - } - /* static class members and class-specific enum - values can be returned without further ado. */ - if (TREE_CODE (t) == VAR_DECL || TREE_CODE (t) == CONST_DECL) - { - mark_used (t); - return convert_from_reference (t); - } - - if (TREE_CODE (t) == FIELD_DECL && DECL_C_BIT_FIELD (t)) - { - cp_error ("illegal pointer to bit field `%D'", t); - return error_mark_node; - } - - /* static class functions too. */ - if (TREE_CODE (t) == FUNCTION_DECL - && TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE) - my_friendly_abort (53); - - /* In member functions, the form `type::name' is no longer - equivalent to `this->type::name', at least not until - resolve_offset_ref. */ - return build (OFFSET_REF, build_offset_type (type, TREE_TYPE (t)), decl, t); -} - -/* If a OFFSET_REF made it through to here, then it did - not have its address taken. */ - -tree -resolve_offset_ref (exp) - tree exp; -{ - tree type = TREE_TYPE (exp); - tree base = NULL_TREE; - tree member; - tree basetype, addr; - - if (TREE_CODE (exp) == TREE_LIST) - { - cp_pedwarn ("assuming & on overloaded member function"); - return build_unary_op (ADDR_EXPR, exp, 0); - } - - if (TREE_CODE (exp) == OFFSET_REF) - { - member = TREE_OPERAND (exp, 1); - base = TREE_OPERAND (exp, 0); - } - else - { - my_friendly_assert (TREE_CODE (type) == OFFSET_TYPE, 214); - if (TYPE_OFFSET_BASETYPE (type) != current_class_type) - { - error ("object missing in use of pointer-to-member construct"); - return error_mark_node; - } - member = exp; - type = TREE_TYPE (type); - base = current_class_ref; - } - - if ((TREE_CODE (member) == VAR_DECL - && ! TYPE_PTRMEMFUNC_P (TREE_TYPE (member)) - && ! TYPE_PTRMEM_P (TREE_TYPE (member))) - || TREE_CODE (TREE_TYPE (member)) == FUNCTION_TYPE - || TREE_CODE (TREE_TYPE (member)) == METHOD_TYPE) - { - /* These were static members. */ - if (mark_addressable (member) == 0) - return error_mark_node; - return member; - } - - if (TREE_CODE (TREE_TYPE (member)) == POINTER_TYPE - && TREE_CODE (TREE_TYPE (TREE_TYPE (member))) == METHOD_TYPE) - return member; - - /* Syntax error can cause a member which should - have been seen as static to be grok'd as non-static. */ - if (TREE_CODE (member) == FIELD_DECL && current_class_ref == NULL_TREE) - { - if (TREE_ADDRESSABLE (member) == 0) - { - cp_error_at ("member `%D' is non-static but referenced as a static member", - member); - error ("at this point in file"); - TREE_ADDRESSABLE (member) = 1; - } - return error_mark_node; - } - - /* The first case is really just a reference to a member of `this'. */ - if (TREE_CODE (member) == FIELD_DECL - && (base == current_class_ref || is_dummy_object (base))) - { - tree basetype_path; - tree access; - tree expr; - - if (TREE_CODE (exp) == OFFSET_REF && TREE_CODE (type) == OFFSET_TYPE) - basetype = TYPE_OFFSET_BASETYPE (type); - else - basetype = DECL_CONTEXT (member); - - base = current_class_ptr; - - if (get_base_distance (basetype, TREE_TYPE (TREE_TYPE (base)), 0, &basetype_path) < 0) - { - error_not_base_type (basetype, TREE_TYPE (TREE_TYPE (base))); - return error_mark_node; - } - /* Kludge: we need to use basetype_path now, because - convert_pointer_to will bash it. */ - access = compute_access (basetype_path, member); - addr = convert_pointer_to (basetype, base); - - /* Issue errors if there was an access violation. */ - if (access != access_public_node) - { - cp_error_at ("member `%D' is %s", - access == access_private_node - ? "private" : "protected", - member); - cp_error ("in this context"); - } - - /* Even in the case of illegal access, we form the - COMPONENT_REF; that will allow better error recovery than - just feeding back error_mark_node. */ - expr = build (COMPONENT_REF, TREE_TYPE (member), - build_indirect_ref (addr, NULL_PTR), member); - return convert_from_reference (expr); - } - - /* Ensure that we have an object. */ - if (is_dummy_object (base)) - addr = error_mark_node; - else - /* If this is a reference to a member function, then return the - address of the member function (which may involve going - through the object's vtable), otherwise, return an expression - for the dereferenced pointer-to-member construct. */ - addr = build_unary_op (ADDR_EXPR, base, 0); - - if (TYPE_PTRMEM_P (TREE_TYPE (member))) - { - if (addr == error_mark_node) - { - cp_error ("object missing in `%E'", exp); - return error_mark_node; - } - - basetype = TYPE_OFFSET_BASETYPE (TREE_TYPE (TREE_TYPE (member))); - addr = convert_pointer_to (basetype, addr); - member = cp_convert (ptrdiff_type_node, member); - - /* Pointer to data members are offset by one, so that a null - pointer with a real value of 0 is distinguishable from an - offset of the first member of a structure. */ - member = build_binary_op (MINUS_EXPR, member, - cp_convert (ptrdiff_type_node, integer_one_node), - 0); - - return build1 (INDIRECT_REF, type, - build (PLUS_EXPR, build_pointer_type (type), - addr, member)); - } - else if (TYPE_PTRMEMFUNC_P (TREE_TYPE (member))) - { - return get_member_function_from_ptrfunc (&addr, member); - } - my_friendly_abort (56); - /* NOTREACHED */ - return NULL_TREE; -} - -/* Return either DECL or its known constant value (if it has one). */ - -tree -decl_constant_value (decl) - tree decl; -{ - if (! TREE_THIS_VOLATILE (decl) - && DECL_INITIAL (decl) - && DECL_INITIAL (decl) != error_mark_node - /* This is invalid if initial value is not constant. - If it has either a function call, a memory reference, - or a variable, then re-evaluating it could give different results. */ - && TREE_CONSTANT (DECL_INITIAL (decl)) - /* Check for cases where this is sub-optimal, even though valid. */ - && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR) - return DECL_INITIAL (decl); - return decl; -} - -/* Common subroutines of build_new and build_vec_delete. */ - -/* Call the global __builtin_delete to delete ADDR. */ - -static tree -build_builtin_delete_call (addr) - tree addr; -{ - mark_used (global_delete_fndecl); - return build_call (global_delete_fndecl, - void_type_node, build_expr_list (NULL_TREE, addr)); -} - -/* Generate a C++ "new" expression. DECL is either a TREE_LIST - (which needs to go through some sort of groktypename) or it - is the name of the class we are newing. INIT is an initialization value. - It is either an EXPRLIST, an EXPR_NO_COMMAS, or something in braces. - If INIT is void_type_node, it means do *not* call a constructor - for this instance. - - For types with constructors, the data returned is initialized - by the appropriate constructor. - - Whether the type has a constructor or not, if it has a pointer - to a virtual function table, then that pointer is set up - here. - - Unless I am mistaken, a call to new () will return initialized - data regardless of whether the constructor itself is private or - not. NOPE; new fails if the constructor is private (jcm). - - Note that build_new does nothing to assure that any special - alignment requirements of the type are met. Rather, it leaves - it up to malloc to do the right thing. Otherwise, folding to - the right alignment cal cause problems if the user tries to later - free the memory returned by `new'. - - PLACEMENT is the `placement' list for user-defined operator new (). */ - -extern int flag_check_new; - -tree -build_new (placement, decl, init, use_global_new) - tree placement; - tree decl, init; - int use_global_new; -{ - tree type, rval; - tree nelts = NULL_TREE, t; - int has_array = 0; - - tree pending_sizes = NULL_TREE; - - if (decl == error_mark_node) - return error_mark_node; - - if (TREE_CODE (decl) == TREE_LIST) - { - tree absdcl = TREE_VALUE (decl); - tree last_absdcl = NULL_TREE; - int old_immediate_size_expand = 0; - - if (current_function_decl - && DECL_CONSTRUCTOR_P (current_function_decl)) - { - old_immediate_size_expand = immediate_size_expand; - immediate_size_expand = 0; - } - - nelts = integer_one_node; - - if (absdcl && TREE_CODE (absdcl) == CALL_EXPR) - my_friendly_abort (215); - while (absdcl && TREE_CODE (absdcl) == INDIRECT_REF) - { - last_absdcl = absdcl; - absdcl = TREE_OPERAND (absdcl, 0); - } - - if (absdcl && TREE_CODE (absdcl) == ARRAY_REF) - { - /* probably meant to be a vec new */ - tree this_nelts; - - while (TREE_OPERAND (absdcl, 0) - && TREE_CODE (TREE_OPERAND (absdcl, 0)) == ARRAY_REF) - { - last_absdcl = absdcl; - absdcl = TREE_OPERAND (absdcl, 0); - } - - has_array = 1; - this_nelts = TREE_OPERAND (absdcl, 1); - if (this_nelts != error_mark_node) - { - if (this_nelts == NULL_TREE) - error ("new of array type fails to specify size"); - else if (processing_template_decl) - { - nelts = this_nelts; - absdcl = TREE_OPERAND (absdcl, 0); - } - else - { - int flags = pedantic ? WANT_INT : (WANT_INT | WANT_ENUM); - if (build_expr_type_conversion (flags, this_nelts, 0) - == NULL_TREE) - pedwarn ("size in array new must have integral type"); - - this_nelts = save_expr (cp_convert (sizetype, this_nelts)); - absdcl = TREE_OPERAND (absdcl, 0); - if (this_nelts == integer_zero_node) - { - warning ("zero size array reserves no space"); - nelts = integer_zero_node; - } - else - nelts = build_binary_op (MULT_EXPR, nelts, this_nelts, 1); - } - } - else - nelts = integer_zero_node; - } - - if (last_absdcl) - TREE_OPERAND (last_absdcl, 0) = absdcl; - else - TREE_VALUE (decl) = absdcl; - - type = groktypename (decl); - if (! type || type == error_mark_node) - { - immediate_size_expand = old_immediate_size_expand; - return error_mark_node; - } - - if (current_function_decl - && DECL_CONSTRUCTOR_P (current_function_decl)) - { - pending_sizes = get_pending_sizes (); - immediate_size_expand = old_immediate_size_expand; - } - } - else if (TREE_CODE (decl) == IDENTIFIER_NODE) - { - if (IDENTIFIER_HAS_TYPE_VALUE (decl)) - { - /* An aggregate type. */ - type = IDENTIFIER_TYPE_VALUE (decl); - decl = TYPE_MAIN_DECL (type); - } - else - { - /* A builtin type. */ - decl = lookup_name (decl, 1); - my_friendly_assert (TREE_CODE (decl) == TYPE_DECL, 215); - type = TREE_TYPE (decl); - } - } - else if (TREE_CODE (decl) == TYPE_DECL) - { - type = TREE_TYPE (decl); - } - else - { - type = decl; - decl = TYPE_MAIN_DECL (type); - } - - if (processing_template_decl) - { - if (has_array) - t = min_tree_cons (min_tree_cons (NULL_TREE, type, NULL_TREE), - build_min_nt (ARRAY_REF, NULL_TREE, nelts), - NULL_TREE); - else - t = type; - - rval = build_min_nt (NEW_EXPR, placement, t, init); - NEW_EXPR_USE_GLOBAL (rval) = use_global_new; - return rval; - } - - /* ``A reference cannot be created by the new operator. A reference - is not an object (8.2.2, 8.4.3), so a pointer to it could not be - returned by new.'' ARM 5.3.3 */ - if (TREE_CODE (type) == REFERENCE_TYPE) - { - error ("new cannot be applied to a reference type"); - type = TREE_TYPE (type); - } - - if (TREE_CODE (type) == FUNCTION_TYPE) - { - error ("new cannot be applied to a function type"); - return error_mark_node; - } - - /* When the object being created is an array, the new-expression yields a - pointer to the initial element (if any) of the array. For example, - both new int and new int[10] return an int*. 5.3.4. */ - if (TREE_CODE (type) == ARRAY_TYPE && has_array == 0) - { - nelts = array_type_nelts_top (type); - has_array = 1; - type = TREE_TYPE (type); - } - - if (has_array) - t = build_nt (ARRAY_REF, type, nelts); - else - t = type; - - rval = build (NEW_EXPR, build_pointer_type (type), placement, t, init); - NEW_EXPR_USE_GLOBAL (rval) = use_global_new; - TREE_SIDE_EFFECTS (rval) = 1; - - /* Wrap it in a NOP_EXPR so warn_if_unused_value doesn't complain. */ - rval = build1 (NOP_EXPR, TREE_TYPE (rval), rval); - TREE_NO_UNUSED_WARNING (rval) = 1; - - if (pending_sizes) - rval = build_compound_expr (chainon (pending_sizes, - build_expr_list (NULL_TREE, rval))); - - return rval; -} - -/* If non-NULL, a POINTER_TYPE equivalent to (java::lang::Class*). */ - -static tree jclass_node = NULL_TREE; - -/* Given a Java class, return a decl for the corresponding java.lang.Class. */ - -tree -build_java_class_ref (type) - tree type; -{ - tree name, class_decl; - static tree CL_prefix = NULL_TREE; - if (CL_prefix == NULL_TREE) - CL_prefix = get_identifier("_CL_"); - if (jclass_node == NULL_TREE) - { - jclass_node = IDENTIFIER_GLOBAL_VALUE (get_identifier("jclass")); - if (jclass_node == NULL_TREE) - fatal("call to Java constructor, while `jclass' undefined"); - jclass_node = TREE_TYPE (jclass_node); - } - name = build_overload_with_type (CL_prefix, type); - class_decl = IDENTIFIER_GLOBAL_VALUE (name); - if (class_decl == NULL_TREE) - { - push_obstacks_nochange (); - end_temporary_allocation (); - class_decl = build_decl (VAR_DECL, name, TREE_TYPE (jclass_node)); - TREE_STATIC (class_decl) = 1; - DECL_EXTERNAL (class_decl) = 1; - TREE_PUBLIC (class_decl) = 1; - DECL_ARTIFICIAL (class_decl) = 1; - DECL_IGNORED_P (class_decl) = 1; - pushdecl_top_level (class_decl); - make_decl_rtl (class_decl, NULL_PTR, 1); - pop_obstacks (); - } - return class_decl; -} - -/* Called from cplus_expand_expr when expanding a NEW_EXPR. The return - value is immediately handed to expand_expr. */ - -tree -build_new_1 (exp) - tree exp; -{ - tree placement, init; - tree type, true_type, size, rval; - tree nelts = NULL_TREE; - tree alloc_expr, alloc_node = NULL_TREE; - int has_array = 0; - enum tree_code code = NEW_EXPR; - int use_cookie, nothrow, check_new; - int use_global_new; - int use_java_new = 0; - - placement = TREE_OPERAND (exp, 0); - type = TREE_OPERAND (exp, 1); - init = TREE_OPERAND (exp, 2); - use_global_new = NEW_EXPR_USE_GLOBAL (exp); - - if (TREE_CODE (type) == ARRAY_REF) - { - has_array = 1; - nelts = TREE_OPERAND (type, 1); - type = TREE_OPERAND (type, 0); - } - true_type = type; - - if (CP_TYPE_QUALS (type)) - type = TYPE_MAIN_VARIANT (type); - - /* If our base type is an array, then make sure we know how many elements - it has. */ - while (TREE_CODE (true_type) == ARRAY_TYPE) - { - tree this_nelts = array_type_nelts_top (true_type); - nelts = build_binary_op (MULT_EXPR, nelts, this_nelts, 1); - true_type = TREE_TYPE (true_type); - } - - if (!complete_type_or_else (true_type)) - return error_mark_node; - - if (has_array) - size = fold (build_binary_op (MULT_EXPR, size_in_bytes (true_type), - nelts, 1)); - else - size = size_in_bytes (type); - - if (TREE_CODE (true_type) == VOID_TYPE) - { - error ("invalid type `void' for new"); - return error_mark_node; - } - - if (TYPE_LANG_SPECIFIC (true_type) - && CLASSTYPE_ABSTRACT_VIRTUALS (true_type)) - { - abstract_virtuals_error (NULL_TREE, true_type); - return error_mark_node; - } - - if (TYPE_LANG_SPECIFIC (true_type) && IS_SIGNATURE (true_type)) - { - signature_error (NULL_TREE, true_type); - return error_mark_node; - } - -#if 1 - /* Get a little extra space to store a couple of things before the new'ed - array, if this isn't the default placement new. */ - - use_cookie = (has_array && TYPE_VEC_NEW_USES_COOKIE (true_type) - && ! (placement && ! TREE_CHAIN (placement) - && TREE_TYPE (TREE_VALUE (placement)) == ptr_type_node)); -#else - /* Get a little extra space to store a couple of things before the new'ed - array, if this is either non-placement new or new (nothrow). */ - - use_cookie = (has_array && TYPE_VEC_NEW_USES_COOKIE (true_type) - && (! placement || nothrow)); -#endif - - if (use_cookie) - { - tree extra = BI_header_size; - - size = size_binop (PLUS_EXPR, size, extra); - } - - if (has_array) - { - code = VEC_NEW_EXPR; - - if (init && pedantic) - cp_pedwarn ("initialization in array new"); - } - - /* Allocate the object. */ - - if (! has_array && ! placement && flag_this_is_variable > 0 - && TYPE_NEEDS_CONSTRUCTING (true_type) && init != void_type_node) - { - if (init == NULL_TREE || TREE_CODE (init) == TREE_LIST) - rval = NULL_TREE; - else - { - error ("constructors take parameter lists"); - return error_mark_node; - } - } - else if (! placement && TYPE_FOR_JAVA (true_type)) - { - tree class_addr, alloc_decl; - tree class_decl = build_java_class_ref (true_type); - tree class_size = size_in_bytes (true_type); - static char alloc_name[] = "_Jv_AllocObject"; - use_java_new = 1; - alloc_decl = IDENTIFIER_GLOBAL_VALUE (get_identifier (alloc_name)); - if (alloc_decl == NULL_TREE) - fatal("call to Java constructor, while `%s' undefined", alloc_name); - class_addr = build1 (ADDR_EXPR, jclass_node, class_decl); - rval = build_function_call (alloc_decl, - tree_cons (NULL_TREE, class_addr, - build_tree_list (NULL_TREE, - class_size))); - rval = cp_convert (build_pointer_type (true_type), rval); - } - else - { - int susp = 0; - - if (flag_exceptions) - /* We will use RVAL when generating an exception handler for - this new-expression, so we must save it. */ - susp = suspend_momentary (); - - rval = build_op_new_call - (code, true_type, expr_tree_cons (NULL_TREE, size, placement), - LOOKUP_NORMAL | (use_global_new * LOOKUP_GLOBAL)); - rval = cp_convert (build_pointer_type (true_type), rval); - - if (flag_exceptions) - resume_momentary (susp); - } - - /* unless an allocation function is declared with an empty excep- - tion-specification (_except.spec_), throw(), it indicates failure to - allocate storage by throwing a bad_alloc exception (clause _except_, - _lib.bad.alloc_); it returns a non-null pointer otherwise If the allo- - cation function is declared with an empty exception-specification, - throw(), it returns null to indicate failure to allocate storage and a - non-null pointer otherwise. - - So check for a null exception spec on the op new we just called. */ - - nothrow = 0; - if (rval) - { - /* The CALL_EXPR. */ - tree t = TREE_OPERAND (rval, 0); - /* The function. */ - t = TREE_OPERAND (TREE_OPERAND (t, 0), 0); - t = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (t)); - - if (t && TREE_VALUE (t) == NULL_TREE) - nothrow = 1; - } - check_new = (flag_check_new || nothrow) && ! use_java_new; - - if ((check_new || flag_exceptions) && rval) - { - alloc_expr = get_target_expr (rval); - alloc_node = rval = TREE_OPERAND (alloc_expr, 0); - } - else - alloc_expr = NULL_TREE; - - /* if rval is NULL_TREE I don't have to allocate it, but are we totally - sure we have some extra bytes in that case for the BI_header_size - cookies? And how does that interact with the code below? (mrs) */ - /* Finish up some magic for new'ed arrays */ - if (use_cookie && rval != NULL_TREE) - { - tree extra = BI_header_size; - tree cookie, exp1; - rval = convert (string_type_node, rval); /* for ptr arithmetic */ - rval = save_expr (build_binary_op (PLUS_EXPR, rval, extra, 1)); - /* Store header info. */ - cookie = build_indirect_ref (build (MINUS_EXPR, - build_pointer_type (BI_header_type), - rval, extra), NULL_PTR); - exp1 = build (MODIFY_EXPR, void_type_node, - build_component_ref (cookie, nc_nelts_field_id, - NULL_TREE, 0), - nelts); - TREE_SIDE_EFFECTS (exp1) = 1; - rval = cp_convert (build_pointer_type (true_type), rval); - rval = build_compound_expr - (expr_tree_cons (NULL_TREE, exp1, - build_expr_list (NULL_TREE, rval))); - } - - if (rval == error_mark_node) - return error_mark_node; - - /* Don't call any constructors or do any initialization. */ - if (init == void_type_node) - goto done; - - if (TYPE_NEEDS_CONSTRUCTING (type) || init) - { - if (! TYPE_NEEDS_CONSTRUCTING (type) - && ! IS_AGGR_TYPE (type) && ! has_array) - { - /* We are processing something like `new int (10)', which - means allocate an int, and initialize it with 10. */ - tree deref; - tree deref_type; - - /* At present RVAL is a temporary variable, created to hold - the value from the call to `operator new'. We transform - it to (*RVAL = INIT, RVAL). */ - rval = save_expr (rval); - deref = build_indirect_ref (rval, NULL_PTR); - - /* Even for something like `new const int (10)' we must - allow the expression to be non-const while we do the - initialization. */ - deref_type = TREE_TYPE (deref); - if (CP_TYPE_CONST_P (deref_type)) - TREE_TYPE (deref) - = cp_build_qualified_type (deref_type, - CP_TYPE_QUALS (deref_type) - & ~TYPE_QUAL_CONST); - TREE_READONLY (deref) = 0; - - if (TREE_CHAIN (init) != NULL_TREE) - pedwarn ("initializer list being treated as compound expression"); - else if (TREE_CODE (init) == CONSTRUCTOR) - { - pedwarn ("initializer list appears where operand should be used"); - init = TREE_OPERAND (init, 1); - } - init = build_compound_expr (init); - - init = convert_for_initialization (deref, type, init, LOOKUP_NORMAL, - "new", NULL_TREE, 0); - rval = build (COMPOUND_EXPR, TREE_TYPE (rval), - build_modify_expr (deref, NOP_EXPR, init), - rval); - TREE_NO_UNUSED_WARNING (rval) = 1; - TREE_SIDE_EFFECTS (rval) = 1; - } - else if (! has_array) - { - tree newrval; - /* Constructors are never virtual. If it has an initialization, we - need to complain if we aren't allowed to use the ctor that took - that argument. */ - int flags = LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_COMPLAIN; - - if (rval && TYPE_USES_VIRTUAL_BASECLASSES (true_type)) - { - init = expr_tree_cons (NULL_TREE, integer_one_node, init); - flags |= LOOKUP_HAS_IN_CHARGE; - } - - if (use_java_new) - rval = save_expr (rval); - newrval = rval; - - if (newrval && TREE_CODE (TREE_TYPE (newrval)) == POINTER_TYPE) - newrval = build_indirect_ref (newrval, NULL_PTR); - - newrval = build_method_call (newrval, ctor_identifier, - init, TYPE_BINFO (true_type), flags); - - if (newrval == NULL_TREE || newrval == error_mark_node) - return error_mark_node; - - /* Java constructors compiled by jc1 do not return this. */ - if (use_java_new) - newrval = build (COMPOUND_EXPR, TREE_TYPE (newrval), - newrval, rval); - rval = newrval; - TREE_HAS_CONSTRUCTOR (rval) = 1; - } - else - rval = build (VEC_INIT_EXPR, TREE_TYPE (rval), - save_expr (rval), init, nelts); - - /* If any part of the object initialization terminates by throwing - an exception and the new-expression does not contain a - new-placement, then the deallocation function is called to free - the memory in which the object was being constructed. */ - if (flag_exceptions && alloc_expr && ! use_java_new) - { - enum tree_code dcode = has_array ? VEC_DELETE_EXPR : DELETE_EXPR; - tree cleanup, fn = NULL_TREE; - int flags = LOOKUP_NORMAL | (use_global_new * LOOKUP_GLOBAL); - - /* All cleanups must last longer than normal. */ - int yes = suspend_momentary (); - - if (placement) - { - flags |= LOOKUP_SPECULATIVELY; - - /* We expect alloc_expr to look like a TARGET_EXPR around - a NOP_EXPR around the CALL_EXPR we want. */ - fn = TREE_OPERAND (alloc_expr, 1); - fn = TREE_OPERAND (fn, 0); - } - - /* Copy size to the saveable obstack. */ - size = copy_node (size); - - cleanup = build_op_delete_call (dcode, alloc_node, size, flags, fn); - - resume_momentary (yes); - - /* Ack! First we allocate the memory. Then we set our sentry - variable to true, and expand a cleanup that deletes the memory - if sentry is true. Then we run the constructor and store the - returned pointer in buf. Then we clear sentry and return buf. */ - - if (cleanup) - { - tree end, sentry, begin, buf, t = TREE_TYPE (rval); - - begin = get_target_expr (boolean_true_node); - sentry = TREE_OPERAND (begin, 0); - - yes = suspend_momentary (); - TREE_OPERAND (begin, 2) - = build (COND_EXPR, void_type_node, sentry, - cleanup, void_zero_node); - resume_momentary (yes); - - rval = get_target_expr (rval); - - end = build (MODIFY_EXPR, TREE_TYPE (sentry), - sentry, boolean_false_node); - TREE_SIDE_EFFECTS (end) = 1; - - buf = TREE_OPERAND (rval, 0); - - rval = build (COMPOUND_EXPR, t, begin, - build (COMPOUND_EXPR, t, rval, - build (COMPOUND_EXPR, t, end, buf))); - } - } - } - else if (CP_TYPE_CONST_P (true_type)) - cp_error ("uninitialized const in `new' of `%#T'", true_type); - - done: - - if (alloc_expr && rval == alloc_node) - { - rval = TREE_OPERAND (alloc_expr, 1); - alloc_expr = NULL_TREE; - } - - if (check_new && alloc_expr) - { - /* Did we modify the storage? */ - tree ifexp = build_binary_op (NE_EXPR, alloc_node, - integer_zero_node, 1); - rval = build_conditional_expr (ifexp, rval, alloc_node); - } - - if (alloc_expr) - rval = build (COMPOUND_EXPR, TREE_TYPE (rval), alloc_expr, rval); - - if (rval && TREE_TYPE (rval) != build_pointer_type (type)) - { - /* The type of new int [3][3] is not int *, but int [3] * */ - rval = build_c_cast (build_pointer_type (type), rval); - } - - return rval; -} - -static tree -build_vec_delete_1 (base, maxindex, type, auto_delete_vec, auto_delete, - use_global_delete) - tree base, maxindex, type; - tree auto_delete_vec, auto_delete; - int use_global_delete; -{ - tree virtual_size; - tree ptype = build_pointer_type (type = complete_type (type)); - tree size_exp = size_in_bytes (type); - - /* Temporary variables used by the loop. */ - tree tbase, tbase_init; - - /* This is the body of the loop that implements the deletion of a - single element, and moves temp variables to next elements. */ - tree body; - - /* This is the LOOP_EXPR that governs the deletion of the elements. */ - tree loop; - - /* This is the thing that governs what to do after the loop has run. */ - tree deallocate_expr = 0; - - /* This is the BIND_EXPR which holds the outermost iterator of the - loop. It is convenient to set this variable up and test it before - executing any other code in the loop. - This is also the containing expression returned by this function. */ - tree controller = NULL_TREE; - - if (! IS_AGGR_TYPE (type) || ! TYPE_NEEDS_DESTRUCTOR (type)) - { - loop = integer_zero_node; - goto no_destructor; - } - - /* The below is short by BI_header_size */ - virtual_size = fold (size_binop (MULT_EXPR, size_exp, maxindex)); - - tbase = build_decl (VAR_DECL, NULL_TREE, ptype); - tbase_init = build_modify_expr (tbase, NOP_EXPR, - fold (build (PLUS_EXPR, ptype, - base, - virtual_size))); - DECL_REGISTER (tbase) = 1; - controller = build (BIND_EXPR, void_type_node, tbase, NULL_TREE, NULL_TREE); - TREE_SIDE_EFFECTS (controller) = 1; - - if (auto_delete != integer_zero_node - && auto_delete != integer_two_node) - { - tree base_tbd = cp_convert (ptype, - build_binary_op (MINUS_EXPR, - cp_convert (ptr_type_node, base), - BI_header_size, - 1)); - /* This is the real size */ - virtual_size = size_binop (PLUS_EXPR, virtual_size, BI_header_size); - body = build_expr_list (NULL_TREE, - build_x_delete (base_tbd, - 2 | use_global_delete, - virtual_size)); - body = build (COND_EXPR, void_type_node, - build (BIT_AND_EXPR, integer_type_node, - auto_delete, integer_one_node), - body, integer_zero_node); - } - else - body = NULL_TREE; - - body = expr_tree_cons (NULL_TREE, - build_delete (ptype, tbase, auto_delete, - LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 1), - body); - - body = expr_tree_cons (NULL_TREE, - build_modify_expr (tbase, NOP_EXPR, build (MINUS_EXPR, ptype, tbase, size_exp)), - body); - - body = expr_tree_cons (NULL_TREE, - build (EXIT_EXPR, void_type_node, - build (EQ_EXPR, boolean_type_node, base, tbase)), - body); - - loop = build (LOOP_EXPR, void_type_node, build_compound_expr (body)); - - loop = expr_tree_cons (NULL_TREE, tbase_init, - expr_tree_cons (NULL_TREE, loop, NULL_TREE)); - loop = build_compound_expr (loop); - - no_destructor: - /* If the delete flag is one, or anything else with the low bit set, - delete the storage. */ - if (auto_delete_vec == integer_zero_node) - deallocate_expr = integer_zero_node; - else - { - tree base_tbd; - - /* The below is short by BI_header_size */ - virtual_size = fold (size_binop (MULT_EXPR, size_exp, maxindex)); - - if (! TYPE_VEC_NEW_USES_COOKIE (type)) - /* no header */ - base_tbd = base; - else - { - base_tbd = cp_convert (ptype, - build_binary_op (MINUS_EXPR, - cp_convert (string_type_node, base), - BI_header_size, - 1)); - /* True size with header. */ - virtual_size = size_binop (PLUS_EXPR, virtual_size, BI_header_size); - } - deallocate_expr = build_x_delete (base_tbd, - 2 | use_global_delete, - virtual_size); - if (auto_delete_vec != integer_one_node) - deallocate_expr = build (COND_EXPR, void_type_node, - build (BIT_AND_EXPR, integer_type_node, - auto_delete_vec, integer_one_node), - deallocate_expr, integer_zero_node); - } - - if (loop && deallocate_expr != integer_zero_node) - { - body = expr_tree_cons (NULL_TREE, loop, - expr_tree_cons (NULL_TREE, deallocate_expr, NULL_TREE)); - body = build_compound_expr (body); - } - else - body = loop; - - /* Outermost wrapper: If pointer is null, punt. */ - body = build (COND_EXPR, void_type_node, - build (NE_EXPR, boolean_type_node, base, integer_zero_node), - body, integer_zero_node); - body = build1 (NOP_EXPR, void_type_node, body); - - if (controller) - { - TREE_OPERAND (controller, 1) = body; - return controller; - } - else - return cp_convert (void_type_node, body); -} - -/* Protect the vector initialization with a try-block so that we can - destroy the first few elements if constructing a later element - causes an exception to be thrown. TYPE is the type of the array - elements. */ - -static void -expand_vec_init_try_block (type) - tree type; -{ - if (!TYPE_NEEDS_DESTRUCTOR (type) || !flag_exceptions) - return; - - /* The code we generate looks like: - - try { - // Initialize the vector. - } catch (...) { - // Destory the elements that need destroying. - throw; - } - - Here we're just beginning the `try'. */ - - expand_eh_region_start (); -} - -/* Add code to destroy the array elements constructed so far if the - construction of some element in the array causes an exception to be - thrown. RVAL is the address of the last element in the array. - TYPE is the type of the array elements. MAXINDEX is the maximum - allowable index into the array. ITERATOR is an integer variable - indicating how many elements remain to be constructed. */ - -static void -expand_vec_init_catch_clause (rval, type, maxindex, iterator) - tree rval; - tree type; - tree maxindex; - tree iterator; -{ - tree e; - tree cleanup; - - if (!TYPE_NEEDS_DESTRUCTOR (type) || !flag_exceptions) - return; - - /* We have to ensure that this can live to the cleanup expansion - time, since we know it is only ever needed once, generate code - now. */ - push_obstacks_nochange (); - resume_temporary_allocation (); - - cleanup = make_node (RTL_EXPR); - TREE_TYPE (cleanup) = void_type_node; - RTL_EXPR_RTL (cleanup) = const0_rtx; - TREE_SIDE_EFFECTS (cleanup) = 1; - do_pending_stack_adjust (); - start_sequence_for_rtl_expr (cleanup); - - e = build_vec_delete_1 (rval, - build_binary_op (MINUS_EXPR, maxindex, - iterator, 1), - type, - /*auto_delete_vec=*/integer_zero_node, - /*auto_delete=*/integer_zero_node, - /*use_global_delete=*/0); - expand_expr (e, const0_rtx, VOIDmode, EXPAND_NORMAL); - - do_pending_stack_adjust (); - RTL_EXPR_SEQUENCE (cleanup) = get_insns (); - end_sequence (); - cleanup = protect_with_terminate (cleanup); - expand_eh_region_end (cleanup); - pop_obstacks (); -} - -/* `expand_vec_init' performs initialization of a vector of aggregate - types. - - DECL is passed only for error reporting, and provides line number - and source file name information. - BASE is the space where the vector will be. - MAXINDEX is the maximum index of the array (one less than the - number of elements). - INIT is the (possibly NULL) initializer. - - FROM_ARRAY is 0 if we should init everything with INIT - (i.e., every element initialized from INIT). - FROM_ARRAY is 1 if we should index into INIT in parallel - with initialization of DECL. - FROM_ARRAY is 2 if we should index into INIT in parallel, - but use assignment instead of initialization. */ - -tree -expand_vec_init (decl, base, maxindex, init, from_array) - tree decl, base, maxindex, init; - int from_array; -{ - tree rval; - tree base2 = NULL_TREE; - tree type = TREE_TYPE (TREE_TYPE (base)); - tree size; - tree itype = NULL_TREE; - tree iterator; - int num_initialized_elts = 0; - - maxindex = cp_convert (ptrdiff_type_node, maxindex); - if (maxindex == error_mark_node) - return error_mark_node; - - if (current_function_decl == NULL_TREE) - { - rval = make_tree_vec (3); - TREE_VEC_ELT (rval, 0) = base; - TREE_VEC_ELT (rval, 1) = maxindex; - TREE_VEC_ELT (rval, 2) = init; - return rval; - } - - size = size_in_bytes (type); - - base = default_conversion (base); - base = cp_convert (build_pointer_type (type), base); - rval = get_temp_regvar (build_pointer_type (type), base); - base = get_temp_regvar (build_pointer_type (type), base); - iterator = get_temp_regvar (ptrdiff_type_node, maxindex); - - /* Protect the entire array initialization so that we can destroy - the partially constructed array if an exception is thrown. */ - expand_vec_init_try_block (type); - - if (init != NULL_TREE && TREE_CODE (init) == CONSTRUCTOR - && (!decl || same_type_p (TREE_TYPE (init), TREE_TYPE (decl)))) - { - /* Do non-default initialization resulting from brace-enclosed - initializers. */ - - tree elts; - tree baseref = build1 (INDIRECT_REF, type, base); - - from_array = 0; - - for (elts = CONSTRUCTOR_ELTS (init); elts; elts = TREE_CHAIN (elts)) - { - tree elt = TREE_VALUE (elts); - - num_initialized_elts++; - - if (IS_AGGR_TYPE (type) || TREE_CODE (type) == ARRAY_TYPE) - expand_aggr_init (baseref, elt, 0); - else - expand_assignment (baseref, elt, 0, 0); - - expand_assignment (base, - build (PLUS_EXPR, build_pointer_type (type), - base, size), - 0, 0); - expand_assignment (iterator, - build (MINUS_EXPR, ptrdiff_type_node, - iterator, integer_one_node), - 0, 0); - } - - /* Clear out INIT so that we don't get confused below. */ - init = NULL_TREE; - - if (obey_regdecls) - use_variable (DECL_RTL (base)); - } - else if (from_array) - { - /* If initializing one array from another, initialize element by - element. We rely upon the below calls the do argument - checking. */ - if (decl == NULL_TREE) - { - sorry ("initialization of array from dissimilar array type"); - return error_mark_node; - } - if (init) - { - base2 = default_conversion (init); - itype = TREE_TYPE (base2); - base2 = get_temp_regvar (itype, base2); - itype = TREE_TYPE (itype); - } - else if (TYPE_LANG_SPECIFIC (type) - && TYPE_NEEDS_CONSTRUCTING (type) - && ! TYPE_HAS_DEFAULT_CONSTRUCTOR (type)) - { - error ("initializer ends prematurely"); - return error_mark_node; - } - } - - /* Now, default-initialize any remaining elements. We don't need to - do that if a) the type does not need constructing, or b) we've - already initialized all the elements. - - We do need to keep going if we're copying an array. */ - - if (from_array - || (TYPE_NEEDS_CONSTRUCTING (type) - && !(TREE_CODE (maxindex) == INTEGER_CST - && num_initialized_elts == TREE_INT_CST_LOW (maxindex) + 1))) - { - /* If the ITERATOR is equal to -1, then we don't have to loop; - we've already initialized all the elements. */ - expand_start_cond (build (NE_EXPR, boolean_type_node, - iterator, minus_one), - 0); - - /* Otherwise, loop through the elements. */ - expand_start_loop_continue_elsewhere (1); - - /* The initialization of each array element is a full-expression. */ - expand_start_target_temps (); - - if (from_array) - { - tree to = build1 (INDIRECT_REF, type, base); - tree from; - - if (base2) - from = build1 (INDIRECT_REF, itype, base2); - else - from = NULL_TREE; - - if (from_array == 2) - expand_expr_stmt (build_modify_expr (to, NOP_EXPR, from)); - else if (TYPE_NEEDS_CONSTRUCTING (type)) - expand_aggr_init (to, from, 0); - else if (from) - expand_assignment (to, from, 0, 0); - else - my_friendly_abort (57); - } - else if (TREE_CODE (type) == ARRAY_TYPE) - { - if (init != 0) - sorry ("cannot initialize multi-dimensional array with initializer"); - expand_vec_init (decl, - build1 (NOP_EXPR, - build_pointer_type (TREE_TYPE - (type)), - base), - array_type_nelts (type), 0, 0); - } - else - expand_aggr_init (build1 (INDIRECT_REF, type, base), init, 0); - - expand_assignment (base, - build (PLUS_EXPR, build_pointer_type (type), - base, size), 0, 0); - if (base2) - expand_assignment (base2, - build (PLUS_EXPR, build_pointer_type (type), - base2, size), 0, 0); - - /* Cleanup any temporaries needed for the initial value. */ - expand_end_target_temps (); - - expand_loop_continue_here (); - expand_exit_loop_if_false (0, build (NE_EXPR, boolean_type_node, - build (PREDECREMENT_EXPR, - ptrdiff_type_node, - iterator, - integer_one_node), - minus_one)); - - if (obey_regdecls) - { - use_variable (DECL_RTL (base)); - if (base2) - use_variable (DECL_RTL (base2)); - } - - expand_end_loop (); - expand_end_cond (); - } - - /* Make sure to cleanup any partially constructed elements. */ - expand_vec_init_catch_clause (rval, type, maxindex, iterator); - - if (obey_regdecls) - { - use_variable (DECL_RTL (iterator)); - use_variable (DECL_RTL (rval)); - } - - return rval; -} - -/* Free up storage of type TYPE, at address ADDR. - - TYPE is a POINTER_TYPE and can be ptr_type_node for no special type - of pointer. - - VIRTUAL_SIZE is the amount of storage that was allocated, and is - used as the second argument to operator delete. It can include - things like padding and magic size cookies. It has virtual in it, - because if you have a base pointer and you delete through a virtual - destructor, it should be the size of the dynamic object, not the - static object, see Free Store 12.5 ANSI C++ WP. - - This does not call any destructors. */ - -tree -build_x_delete (addr, which_delete, virtual_size) - tree addr; - int which_delete; - tree virtual_size; -{ - int use_global_delete = which_delete & 1; - int use_vec_delete = !!(which_delete & 2); - enum tree_code code = use_vec_delete ? VEC_DELETE_EXPR : DELETE_EXPR; - int flags = LOOKUP_NORMAL | (use_global_delete * LOOKUP_GLOBAL); - - return build_op_delete_call (code, addr, virtual_size, flags, NULL_TREE); -} - -/* Generate a call to a destructor. TYPE is the type to cast ADDR to. - ADDR is an expression which yields the store to be destroyed. - AUTO_DELETE is nonzero if a call to DELETE should be made or not. - If in the program, (AUTO_DELETE & 2) is non-zero, we tear down the - virtual baseclasses. - If in the program, (AUTO_DELETE & 1) is non-zero, then we deallocate. - - FLAGS is the logical disjunction of zero or more LOOKUP_ - flags. See cp-tree.h for more info. - - This function does not delete an object's virtual base classes. */ - -tree -build_delete (type, addr, auto_delete, flags, use_global_delete) - tree type, addr; - tree auto_delete; - int flags; - int use_global_delete; -{ - tree member; - tree expr; - tree ref; - - if (addr == error_mark_node) - return error_mark_node; - - /* Can happen when CURRENT_EXCEPTION_OBJECT gets its type - set to `error_mark_node' before it gets properly cleaned up. */ - if (type == error_mark_node) - return error_mark_node; - - type = TYPE_MAIN_VARIANT (type); - - if (TREE_CODE (type) == POINTER_TYPE) - { - type = TYPE_MAIN_VARIANT (TREE_TYPE (type)); - if (!complete_type_or_else (type)) - return error_mark_node; - if (TREE_CODE (type) == ARRAY_TYPE) - goto handle_array; - if (! IS_AGGR_TYPE (type)) - { - /* Call the builtin operator delete. */ - return build_builtin_delete_call (addr); - } - if (TREE_SIDE_EFFECTS (addr)) - addr = save_expr (addr); - - /* throw away const and volatile on target type of addr */ - addr = convert_force (build_pointer_type (type), addr, 0); - ref = build_indirect_ref (addr, NULL_PTR); - } - else if (TREE_CODE (type) == ARRAY_TYPE) - { - handle_array: - if (TREE_SIDE_EFFECTS (addr)) - addr = save_expr (addr); - if (TYPE_DOMAIN (type) == NULL_TREE) - { - error ("unknown array size in delete"); - return error_mark_node; - } - return build_vec_delete (addr, array_type_nelts (type), - auto_delete, integer_zero_node, - use_global_delete); - } - else - { - /* Don't check PROTECT here; leave that decision to the - destructor. If the destructor is accessible, call it, - else report error. */ - addr = build_unary_op (ADDR_EXPR, addr, 0); - if (TREE_SIDE_EFFECTS (addr)) - addr = save_expr (addr); - - if (TREE_CONSTANT (addr)) - addr = convert_pointer_to (type, addr); - else - addr = convert_force (build_pointer_type (type), addr, 0); - - ref = build_indirect_ref (addr, NULL_PTR); - } - - my_friendly_assert (IS_AGGR_TYPE (type), 220); - - if (! TYPE_NEEDS_DESTRUCTOR (type)) - { - if (auto_delete == integer_zero_node) - return void_zero_node; - - return build_op_delete_call - (DELETE_EXPR, addr, c_sizeof_nowarn (type), - LOOKUP_NORMAL | (use_global_delete * LOOKUP_GLOBAL), - NULL_TREE); - } - - /* Below, we will reverse the order in which these calls are made. - If we have a destructor, then that destructor will take care - of the base classes; otherwise, we must do that here. */ - if (TYPE_HAS_DESTRUCTOR (type)) - { - tree passed_auto_delete; - tree do_delete = NULL_TREE; - tree ifexp; - - if (use_global_delete) - { - tree cond = fold (build (BIT_AND_EXPR, integer_type_node, - auto_delete, integer_one_node)); - tree call = build_builtin_delete_call (addr); - - cond = fold (build (COND_EXPR, void_type_node, cond, - call, void_zero_node)); - if (cond != void_zero_node) - do_delete = cond; - - passed_auto_delete = fold (build (BIT_AND_EXPR, integer_type_node, - auto_delete, integer_two_node)); - } - else - passed_auto_delete = auto_delete; - - expr = build_method_call - (ref, dtor_identifier, build_expr_list (NULL_TREE, passed_auto_delete), - NULL_TREE, flags); - - if (do_delete) - expr = build (COMPOUND_EXPR, void_type_node, expr, do_delete); - - if (flags & LOOKUP_DESTRUCTOR) - /* Explicit destructor call; don't check for null pointer. */ - ifexp = integer_one_node; - else - /* Handle deleting a null pointer. */ - ifexp = fold (build_binary_op (NE_EXPR, addr, integer_zero_node, 1)); - - if (ifexp != integer_one_node) - expr = build (COND_EXPR, void_type_node, - ifexp, expr, void_zero_node); - - return expr; - } - else - { - /* We only get here from finish_function for a destructor. */ - tree binfos = BINFO_BASETYPES (TYPE_BINFO (type)); - int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0; - tree base_binfo = n_baseclasses > 0 ? TREE_VEC_ELT (binfos, 0) : NULL_TREE; - tree exprstmt = NULL_TREE; - tree parent_auto_delete = auto_delete; - tree cond; - - /* Set this again before we call anything, as we might get called - recursively. */ - TYPE_HAS_DESTRUCTOR (type) = 1; - - /* If we have member delete or vbases, we call delete in - finish_function. */ - if (auto_delete == integer_zero_node) - cond = NULL_TREE; - else if (base_binfo == NULL_TREE - || ! TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (base_binfo))) - { - cond = build (COND_EXPR, void_type_node, - build (BIT_AND_EXPR, integer_type_node, auto_delete, integer_one_node), - build_builtin_delete_call (addr), - void_zero_node); - } - else - cond = NULL_TREE; - - if (cond) - exprstmt = build_expr_list (NULL_TREE, cond); - - if (base_binfo - && ! TREE_VIA_VIRTUAL (base_binfo) - && TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (base_binfo))) - { - tree this_auto_delete; - - if (BINFO_OFFSET_ZEROP (base_binfo)) - this_auto_delete = parent_auto_delete; - else - this_auto_delete = integer_zero_node; - - expr = build_scoped_method_call - (ref, base_binfo, dtor_identifier, - build_expr_list (NULL_TREE, this_auto_delete)); - exprstmt = expr_tree_cons (NULL_TREE, expr, exprstmt); - } - - /* Take care of the remaining baseclasses. */ - for (i = 1; i < n_baseclasses; i++) - { - base_binfo = TREE_VEC_ELT (binfos, i); - if (! TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (base_binfo)) - || TREE_VIA_VIRTUAL (base_binfo)) - continue; - - expr = build_scoped_method_call - (ref, base_binfo, dtor_identifier, - build_expr_list (NULL_TREE, integer_zero_node)); - - exprstmt = expr_tree_cons (NULL_TREE, expr, exprstmt); - } - - for (member = TYPE_FIELDS (type); member; member = TREE_CHAIN (member)) - { - if (TREE_CODE (member) != FIELD_DECL) - continue; - if (TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (member))) - { - tree this_member = build_component_ref (ref, DECL_NAME (member), NULL_TREE, 0); - tree this_type = TREE_TYPE (member); - expr = build_delete (this_type, this_member, integer_two_node, flags, 0); - exprstmt = expr_tree_cons (NULL_TREE, expr, exprstmt); - } - } - - if (exprstmt) - return build_compound_expr (exprstmt); - /* Virtual base classes make this function do nothing. */ - return void_zero_node; - } -} - -/* For type TYPE, delete the virtual baseclass objects of DECL. */ - -tree -build_vbase_delete (type, decl) - tree type, decl; -{ - tree vbases = CLASSTYPE_VBASECLASSES (type); - tree result = NULL_TREE; - tree addr = build_unary_op (ADDR_EXPR, decl, 0); - - my_friendly_assert (addr != error_mark_node, 222); - - while (vbases) - { - tree this_addr = convert_force (build_pointer_type (BINFO_TYPE (vbases)), - addr, 0); - result = expr_tree_cons (NULL_TREE, - build_delete (TREE_TYPE (this_addr), this_addr, - integer_zero_node, - LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 0), - result); - vbases = TREE_CHAIN (vbases); - } - return build_compound_expr (nreverse (result)); -} - -/* Build a C++ vector delete expression. - MAXINDEX is the number of elements to be deleted. - ELT_SIZE is the nominal size of each element in the vector. - BASE is the expression that should yield the store to be deleted. - This function expands (or synthesizes) these calls itself. - AUTO_DELETE_VEC says whether the container (vector) should be deallocated. - AUTO_DELETE say whether each item in the container should be deallocated. - - This also calls delete for virtual baseclasses of elements of the vector. - - Update: MAXINDEX is no longer needed. The size can be extracted from the - start of the vector for pointers, and from the type for arrays. We still - use MAXINDEX for arrays because it happens to already have one of the - values we'd have to extract. (We could use MAXINDEX with pointers to - confirm the size, and trap if the numbers differ; not clear that it'd - be worth bothering.) */ - -tree -build_vec_delete (base, maxindex, auto_delete_vec, auto_delete, - use_global_delete) - tree base, maxindex; - tree auto_delete_vec, auto_delete; - int use_global_delete; -{ - tree type; - - if (TREE_CODE (base) == OFFSET_REF) - base = resolve_offset_ref (base); - - type = TREE_TYPE (base); - - base = stabilize_reference (base); - - /* Since we can use base many times, save_expr it. */ - if (TREE_SIDE_EFFECTS (base)) - base = save_expr (base); - - if (TREE_CODE (type) == POINTER_TYPE) - { - /* Step back one from start of vector, and read dimension. */ - tree cookie_addr = build (MINUS_EXPR, build_pointer_type (BI_header_type), - base, BI_header_size); - tree cookie = build_indirect_ref (cookie_addr, NULL_PTR); - maxindex = build_component_ref (cookie, nc_nelts_field_id, NULL_TREE, 0); - do - type = TREE_TYPE (type); - while (TREE_CODE (type) == ARRAY_TYPE); - } - else if (TREE_CODE (type) == ARRAY_TYPE) - { - /* get the total number of things in the array, maxindex is a bad name */ - maxindex = array_type_nelts_total (type); - while (TREE_CODE (type) == ARRAY_TYPE) - type = TREE_TYPE (type); - base = build_unary_op (ADDR_EXPR, base, 1); - } - else - { - if (base != error_mark_node) - error ("type to vector delete is neither pointer or array type"); - return error_mark_node; - } - - return build_vec_delete_1 (base, maxindex, type, auto_delete_vec, auto_delete, - use_global_delete); -} diff --git a/gcc/cp/input.c b/gcc/cp/input.c deleted file mode 100755 index 376546b..0000000 --- a/gcc/cp/input.c +++ /dev/null @@ -1,213 +0,0 @@ -/* Input handling for G++. - Copyright (C) 1992, 93-98, 1999 Free Software Foundation, Inc. - Written by Ken Raeburn (raeburn@cygnus.com) while at Watchmaker Computing. - -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 -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -/* G++ needs to do enough saving and re-parsing of text that it is - necessary to abandon the simple FILE* model and use a mechanism where - we can pre-empt one input stream with another derived from saved text; - we may need to do this arbitrarily often, and cannot depend on having - the GNU library available, so FILE objects just don't cut it. - - This file is written as a separate module, but can be included by - lex.c for very minor efficiency gains (primarily in function - inlining). */ - -#include "system.h" - -extern FILE *finput; - -struct input_source { - /* saved string */ - char *str; - int length; - /* current position, when reading as input */ - int offset; - /* linked list maintenance */ - struct input_source *next; - /* values to restore after reading all of current string */ - char *filename; - int lineno; - struct pending_input *input; - int putback_char; -}; - -static struct input_source *input, *free_inputs; - -extern char *input_filename; -extern int lineno; - -#ifdef __GNUC__ -#define inline __inline__ -#else -#define inline -#endif - -#if USE_CPPLIB -extern unsigned char *yy_cur, *yy_lim; -extern int yy_get_token (); -#define GETC() (yy_cur < yy_lim ? *yy_cur++ : yy_get_token ()) -#else -#define GETC() getc (finput) -#endif - -extern void feed_input PROTO((char *, int)); -extern void put_input PROTO((int)); -extern void put_back PROTO((int)); -extern int getch PROTO((void)); -extern int input_redirected PROTO((void)); - -static inline struct input_source * allocate_input PROTO((void)); -static inline void free_input PROTO((struct input_source *)); -static inline void end_input PROTO((void)); -static inline int sub_getch PROTO((void)); - -static inline struct input_source * -allocate_input () -{ - struct input_source *inp; - if (free_inputs) - { - inp = free_inputs; - free_inputs = inp->next; - inp->next = 0; - return inp; - } - inp = (struct input_source *) xmalloc (sizeof (struct input_source)); - inp->next = 0; - return inp; -} - -static inline void -free_input (inp) - struct input_source *inp; -{ - inp->str = 0; - inp->length = 0; - inp->next = free_inputs; - free_inputs = inp; -} - -static int putback_char = -1; - -/* Some of these external functions are declared inline in case this file - is included in lex.c. */ - -inline -void -feed_input (str, len) - char *str; - int len; -{ - struct input_source *inp = allocate_input (); - - /* This shouldn't be necessary. */ - while (len && !str[len-1]) - len--; - - inp->str = str; - inp->length = len; - inp->offset = 0; - inp->next = input; - inp->filename = input_filename; - inp->lineno = lineno; - inp->input = save_pending_input (); - inp->putback_char = putback_char; - putback_char = -1; - input = inp; -} - -struct pending_input *to_be_restored; /* XXX */ -extern int end_of_file; - -static inline void -end_input () -{ - struct input_source *inp = input; - - end_of_file = 0; - input = inp->next; - input_filename = inp->filename; - lineno = inp->lineno; - /* Get interface/implementation back in sync. */ - extract_interface_info (); - putback_char = inp->putback_char; - restore_pending_input (inp->input); - free_input (inp); -} - -static inline int -sub_getch () -{ - if (putback_char != -1) - { - int ch = putback_char; - putback_char = -1; - return ch; - } - if (input) - { - if (input->offset >= input->length) - { - my_friendly_assert (putback_char == -1, 223); - ++(input->offset); - if (input->offset - input->length < 64) - return EOF; - - /* We must be stuck in an error-handling rule; give up. */ - end_input (); - return getch (); - } - return (unsigned char)input->str[input->offset++]; - } - return GETC (); -} - -inline -void -put_back (ch) - int ch; -{ - if (ch != EOF) - { - my_friendly_assert (putback_char == -1, 224); - putback_char = ch; - } -} - -extern int linemode; - -int -getch () -{ - int ch = sub_getch (); - if (linemode && ch == '\n') - { - put_back (ch); - ch = EOF; - } - return ch; -} - -inline -int -input_redirected () -{ - return input != 0; -} diff --git a/gcc/cp/lang-options.h b/gcc/cp/lang-options.h deleted file mode 100755 index 2ae409b..0000000 --- a/gcc/cp/lang-options.h +++ /dev/null @@ -1,137 +0,0 @@ -/* Definitions for switches for C++. - Copyright (C) 1995, 96-97, 1998 Free Software Foundation, Inc. - -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 -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -DEFINE_LANG_NAME ("C++") - -/* This is the contribution to the `lang_options' array in gcc.c for - g++. */ - - { "-faccess-control", "" }, - { "-fno-access-control", "Do not obey access control semantics" }, - { "-fall-virtual", "Make all member functions virtual" }, - { "-fno-all-virtual", "" }, - { "-falt-external-templates", "Change when template instances are emitted" }, - { "-fno-alt-external-templates", "" }, - { "-fansi-overloading", "" }, - { "-fno-ansi-overloading", "" }, - { "-fcheck-new", "Check the return value of new" }, - { "-fno-check-new", "" }, - { "-fconserve-space", "Reduce size of object files" }, - { "-fno-conserve-space", "" }, - { "-fconst-strings", "" }, - { "-fno-const-strings", "Make string literals `char[]' instead of `const char[]'" }, - { "-fdefault-inline", "" }, - { "-fno-default-inline", "Do not inline member functions by default"}, - { "-frtti", "" }, - { "-fno-rtti", "Do not generate run time type descriptor information" }, - { "-felide-constructors", "" }, - { "-fno-elide-constructors", "" }, -/* CYGNUS LOCAL Embedded C++ */ - { "-fembedded-cxx", "Implement Embedded C++ specification" }, - { "-fno-embedded-cxx", "" }, -/* END CYGNUS LOCAL Embedded C++ */ - { "-fenum-int-equiv", "" }, - { "-fno-enum-int-equiv", "" }, - { "-fexternal-templates", "" }, - { "-fno-external-templates", "" }, - { "-ffor-scope", "" }, - { "-fno-for-scope", "Scope of for-init-statement vars extends outside" }, - { "-fguiding-decls", "Implement guiding declarations" }, - { "-fno-guiding-decls", "" }, - { "-fgnu-keywords", "" }, - { "-fno-gnu-keywords", "Do not recognise GNU defined keywords" }, - { "-fhandle-exceptions", "" }, - { "-fno-handle-exceptions", "" }, - { "-fhandle-signatures", "Handle signature language constructs" }, - { "-fno-handle-signatures", "" }, - { "-fhonor-std", "Treat the namespace `std' as a normal namespace" }, - { "-fno-honor-std", "" }, - { "-fhuge-objects", "Enable support for huge objects" }, - { "-fno-huge-objects", "" }, - { "-fimplement-inlines", "" }, - { "-fno-implement-inlines", "Export functions even if they can be inlined" }, - { "-fimplicit-templates", "" }, - { "-fno-implicit-templates", "Only emit explicit template instatiations" }, - { "-fimplicit-inline-templates", "" }, - { "-fno-implicit-inline-templates", "Only emit explicit instatiations of inline templates" }, - { "-finit-priority", "Handle the init_priority attribute" }, - { "-fno-init-priority", "" }, - { "-flabels-ok", "Labels can be used as first class objects" }, - { "-fno-labels-ok", "" }, - { "-fmemoize-lookups", "" }, - { "-fno-memoize-lookups", "" }, - { "-fname-mangling-version-", "" }, - { "-fnew-abi", "Enable experimental ABI changes" }, - { "-fno-new-abi", "" }, - { "-fnonnull-objects", "" }, - { "-fno-nonnull-objects", "Do not assume that a reference is always valid" }, - { "-foperator-names", "Recognise and/bitand/bitor/compl/not/or/xor" }, - { "-fno-operator-names", "" }, - { "-foptional-diags", "" }, - { "-fno-optional-diags", "Disable optional diagnostics" }, - { "-fpermissive", "Downgrade conformance errors to warnings" }, - { "-fno-permissive", "" }, - { "-frepo", "Enable automatic template instantiation" }, - { "-fno-repo", "" }, - { "-fsave-memoized", "" }, - { "-fno-save-memoized", "" }, - { "-fsquangle", "Enable squashed name mangling" }, - { "-fno-squangle", "" }, - { "-fstats", "Display statistics accumulated during compilation" }, - { "-fno-stats", "" }, - { "-fstrict-prototype", "" }, - { "-fno-strict-prototype", "Do not assume that empty prototype means no args" }, - { "-ftemplate-depth-", "Specify maximum template instantiation depth"}, - { "-fthis-is-variable", "Make 'this' not be type '* const'" }, - { "-fno-this-is-variable", "" }, - { "-fvtable-gc", "Discard unused virtual functions" }, - { "-fno-vtable-gc", "" }, - { "-fvtable-thunks", "Implement vtables using thunks" }, - { "-fno-vtable-thunks", "" }, - { "-fweak", "Emit common-like symbols as weak symbols" }, - { "-fno-weak", "" }, - { "-fxref", "Emit cross referencing information" }, - { "-fno-xref", "" }, - - { "-Wreturn-type", "Warn about inconsistent return types" }, - { "-Wno-return-type", "" }, - { "-Woverloaded-virtual", "Warn about overloaded virtual function names" }, - { "-Wno-overloaded-virtual", "" }, - { "-Wctor-dtor-privacy", "" }, - { "-Wno-ctor-dtor-privacy", "Don't warn when all ctors/dtors are private" }, - { "-Wnon-virtual-dtor", "Warn about non virtual destructors" }, - { "-Wno-non-virtual-dtor", "" }, - { "-Wextern-inline", "Warn when a function is declared extern, then inline" }, - { "-Wno-extern-inline", "" }, - { "-Wreorder", "Warn when the compiler reorders code" }, - { "-Wno-reorder", "" }, - { "-Wsynth", "Warn when synthesis behaviour differs from Cfront" }, - { "-Wno-synth", "" }, - { "-Wpmf-conversions", "" }, - { "-Wno-pmf-conversions", "Don't warn when type converting pointers to member functions" }, - { "-Weffc++", "Warn about violations of Effective C++ style rules" }, - { "-Wno-effc++", "" }, - { "-Wsign-promo", "Warn when overload promotes from unsigned to signed" }, - { "-Wno-sign-promo", "" }, - { "-Wold-style-cast", "Warn if a C style cast is used in a program" }, - { "-Wno-old-style-cast", "" }, - { "-Wnon-template-friend", "" }, - { "-Wno-non-template-friend", "Don't warn when non-templatized friend functions are declared within a template" }, - diff --git a/gcc/cp/lang-specs.h b/gcc/cp/lang-specs.h deleted file mode 100755 index 13c90ab..0000000 --- a/gcc/cp/lang-specs.h +++ /dev/null @@ -1,99 +0,0 @@ -/* Definitions for specs for C++. - Copyright (C) 1995, 96-97, 1998 Free Software Foundation, Inc. - -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 -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -/* This is the contribution to the `default_compilers' array in gcc.c for - g++. */ - - {".cc", {"@c++"}}, - {".cp", {"@c++"}}, - {".cxx", {"@c++"}}, - {".cpp", {"@c++"}}, - {".c++", {"@c++"}}, - {".C", {"@c++"}}, - {"@c++", -#if USE_CPPLIB -/* CYGNUS LOCAL Embedded C++ */ - { - "%{E|M|MM:cpp -lang-c++ %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\ - %{C:%{!E:%eGNU C++ does not support -C without using -E}}\ - %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\ - -undef -D__GNUC__=%v1 -D__GNUG__=%v1 -D__cplusplus -D__GNUC_MINOR__=%v2\ - %{ansi:-trigraphs -D__STRICT_ANSI__} %{!undef:%{!ansi:%p} %P}\ - %{!fno-exceptions:-D__EXCEPTIONS}\ - %{fembedded-cxx:-D__EMBEDDED_CXX__} \ - %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}} %{trigraphs}\ - %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\ - %i %{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}} |\n}\ - %{!E:%{!M:%{!MM:cc1plus %i %1 %2\ - -lang-c++ %{nostdinc*} %{C} %{A*} %{I*} %{P} %I\ - %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\ - -undef -D__GNUC__=%v1 -D__GNUG__=%v1 -D__cplusplus\ - -D__GNUC_MINOR__=%v2\ - %{ansi:-trigraphs -D__STRICT_ANSI__} %{!undef:%{!ansi:%p} %P}\ - %{!fno-exceptions:-D__EXCEPTIONS}\ - %{fembedded-cxx:-D__EMBEDDED_CXX__} \ - %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\ - %{trigraphs}\ - %{!Q:-quiet} -dumpbase %b.cc %{d*} %{m*} %{a}\ - %{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi}\ - %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\ - %{v:-version} %{pg:-p} %{p}\ - %{f*} %{+e*} %{aux-info*}\ - %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\ - %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}}|\n\ - %{!S:as %a %Y\ - %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}\ - %{!pipe:%g.s} %A\n }}}}"}}, -/* END CYGNUS LOCAL Embedded C++ */ -#else /* ! USE_CPPLIB */ -/* CYGNUS LOCAL Embedded C++ */ - {"cpp -lang-c++ %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\ - %{C:%{!E:%eGNU C++ does not support -C without using -E}}\ - %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\ - -undef -D__GNUC__=%v1 -D__GNUG__=%v1 -D__cplusplus -D__GNUC_MINOR__=%v2\ - %{ansi:-trigraphs -D__STRICT_ANSI__} %{!undef:%{!ansi:%p} %P}\ - %{!fno-exceptions:-D__EXCEPTIONS}\ - %{fembedded-cxx:-D__EMBEDDED_CXX__} \ - %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}} %{trigraphs}\ - %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\ - %i %{!M:%{!MM:%{!E:%{!pipe:%g.ii}}}}%{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}} |\n", -/* END CYGNUS LOCAL Embedded C++ */ - "%{!M:%{!MM:%{!E:cc1plus %{!pipe:%g.ii} %1 %2\ - %{!Q:-quiet} -dumpbase %b.cc %{d*} %{m*} %{a}\ - %{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi}\ - %{v:-version} %{pg:-p} %{p}\ - %{f*} %{+e*} %{aux-info*}\ - %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\ - %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}}|\n\ - %{!S:as %a %Y\ - %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}\ - %{!pipe:%g.s} %A\n }}}}"}}, -#endif /* ! USE_CPPLIB */ - {".ii", {"@c++-cpp-output"}}, - {"@c++-cpp-output", - {"%{!M:%{!MM:%{!E:cc1plus %i %1 %2 %{!Q:-quiet} %{d*} %{m*} %{a}\ - %{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi}\ - %{v:-version} %{pg:-p} %{p}\ - %{f*} %{+e*} %{aux-info*}\ - %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\ - %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\ - %{!S:as %a %Y\ - %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}\ - %{!pipe:%g.s} %A\n }}}}"}}, diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c deleted file mode 100755 index daa61b1..0000000 --- a/gcc/cp/lex.c +++ /dev/null @@ -1,5157 +0,0 @@ -/* Separate lexical analyzer for GNU C++. - Copyright (C) 1987, 89, 92-98, 1999, 2002 Free Software Foundation, Inc. - Hacked by Michael Tiemann (tiemann@cygnus.com) - -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 -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - - -/* This file is the lexical analyzer for GNU C++. */ - -/* Cause the `yydebug' variable to be defined. */ -#define YYDEBUG 1 - -#include "config.h" -#include "system.h" -#include -#include "input.h" -#include "tree.h" -#include "lex.h" -#include "cp-tree.h" -#include "parse.h" -#include "flags.h" -#include "obstack.h" -#include "c-pragma.h" -#include "toplev.h" -#include "output.h" - -#ifdef MULTIBYTE_CHARS -#include "mbchar.h" -#include -#endif - -#define obstack_chunk_alloc xmalloc -#define obstack_chunk_free free - -#ifndef DIR_SEPARATOR -#define DIR_SEPARATOR '/' -#endif - -extern struct obstack permanent_obstack; -extern struct obstack *current_obstack, *saveable_obstack; - -extern void yyprint PROTO((FILE *, int, YYSTYPE)); -extern void compiler_error PROTO((char *, HOST_WIDE_INT, - HOST_WIDE_INT)); - -static tree get_time_identifier PROTO((char *)); -static int check_newline PROTO((void)); -static int skip_white_space PROTO((int)); -static void finish_defarg PROTO((void)); -static int my_get_run_time PROTO((void)); -static int get_last_nonwhite_on_line PROTO((void)); -static int interface_strcmp PROTO((char *)); -static int readescape PROTO((int *)); -static char *extend_token_buffer PROTO((char *)); -static void consume_string PROTO((struct obstack *, int)); -static void set_typedecl_interface_info PROTO((tree, tree)); -static void feed_defarg PROTO((tree, tree)); -static int set_vardecl_interface_info PROTO((tree, tree)); -static void store_pending_inline PROTO((tree, struct pending_inline *)); -static void reinit_parse_for_expr PROTO((struct obstack *)); -static int *init_cpp_parse PROTO((void)); -static int handle_cp_pragma PROTO((char *)); -#ifdef HANDLE_GENERIC_PRAGMAS -static int handle_generic_pragma PROTO((int)); -#endif -#ifdef GATHER_STATISTICS -#ifdef REDUCE_LENGTH -static int reduce_cmp PROTO((int *, int *)); -static int token_cmp PROTO((int *, int *)); -#endif -#endif -static void begin_definition_of_inclass_inline PROTO((struct pending_inline*)); - -/* Given a file name X, return the nondirectory portion. - Keep in mind that X can be computed more than once. */ -char * -file_name_nondirectory (x) - char *x; -{ - char *tmp = (char *) rindex (x, '/'); - if (DIR_SEPARATOR != '/' && ! tmp) - tmp = (char *) rindex (x, DIR_SEPARATOR); - if (tmp) - return (char *) (tmp + 1); - else - return x; -} - -/* This obstack is needed to hold text. It is not safe to use - TOKEN_BUFFER because `check_newline' calls `yylex'. */ -struct obstack inline_text_obstack; -char *inline_text_firstobj; - -#if USE_CPPLIB -#include "cpplib.h" -extern cpp_reader parse_in; -extern cpp_options parse_options; -extern unsigned char *yy_cur, *yy_lim; -#else -FILE *finput; -#endif -int end_of_file; - -/* CYGNUS LOCAL Embedded C++ */ -/* If non-zero, we gave an error about namespaces not being allowed by - Embedded C++. */ -static int embedded_namespace_error = 0; - -/* If non-zero, we gave an error about templates not being allowed by - Embedded C++. */ -static int embedded_template_error = 0; - -/* If non-zero, we gave an error about exception handling not being allowed by - Embedded C++. */ -static int embedded_eh_error = 0; -/* END CYGNUS LOCAL Embedded C++ */ - -/* Pending language change. - Positive is push count, negative is pop count. */ -int pending_lang_change = 0; - -/* Wrap the current header file in extern "C". */ -static int c_header_level = 0; - -extern int first_token; -extern struct obstack token_obstack; - -/* ??? Don't really know where this goes yet. */ -#if 1 -#include "input.c" -#else -extern void put_back (/* int */); -extern int input_redirected (); -extern void feed_input (/* char *, int */); -#endif - -/* Holds translations from TREE_CODEs to operator name strings, - i.e., opname_tab[PLUS_EXPR] == "+". */ -char **opname_tab; -char **assignop_tab; - -extern int yychar; /* the lookahead symbol */ -extern YYSTYPE yylval; /* the semantic value of the */ - /* lookahead symbol */ - -#if 0 -YYLTYPE yylloc; /* location data for the lookahead */ - /* symbol */ -#endif - - -/* the declaration found for the last IDENTIFIER token read in. - yylex must look this up to detect typedefs, which get token type TYPENAME, - so it is left around in case the identifier is not a typedef but is - used in a context which makes it a reference to a variable. */ -tree lastiddecl; - -/* The elements of `ridpointers' are identifier nodes - for the reserved type names and storage classes. - It is indexed by a RID_... value. */ -tree ridpointers[(int) RID_MAX]; - -/* We may keep statistics about how long which files took to compile. */ -static int header_time, body_time; -static tree filename_times; -static tree this_filename_time; - -/* Array for holding counts of the numbers of tokens seen. */ -extern int *token_count; - -/* Return something to represent absolute declarators containing a *. - TARGET is the absolute declarator that the * contains. - CV_QUALIFIERS is a list of modifiers such as const or volatile - to apply to the pointer type, represented as identifiers. - - We return an INDIRECT_REF whose "contents" are TARGET - and whose type is the modifier list. */ - -tree -make_pointer_declarator (cv_qualifiers, target) - tree cv_qualifiers, target; -{ - if (target && TREE_CODE (target) == IDENTIFIER_NODE - && ANON_AGGRNAME_P (target)) - error ("type name expected before `*'"); - target = build_parse_node (INDIRECT_REF, target); - TREE_TYPE (target) = cv_qualifiers; - return target; -} - -/* Return something to represent absolute declarators containing a &. - TARGET is the absolute declarator that the & contains. - CV_QUALIFIERS is a list of modifiers such as const or volatile - to apply to the reference type, represented as identifiers. - - We return an ADDR_EXPR whose "contents" are TARGET - and whose type is the modifier list. */ - -tree -make_reference_declarator (cv_qualifiers, target) - tree cv_qualifiers, target; -{ - if (target) - { - if (TREE_CODE (target) == ADDR_EXPR) - { - error ("cannot declare references to references"); - return target; - } - if (TREE_CODE (target) == INDIRECT_REF) - { - error ("cannot declare pointers to references"); - return target; - } - if (TREE_CODE (target) == IDENTIFIER_NODE && ANON_AGGRNAME_P (target)) - error ("type name expected before `&'"); - } - target = build_parse_node (ADDR_EXPR, target); - TREE_TYPE (target) = cv_qualifiers; - return target; -} - -tree -make_call_declarator (target, parms, cv_qualifiers, exception_specification) - tree target, parms, cv_qualifiers, exception_specification; -{ - target = build_parse_node (CALL_EXPR, target, parms, cv_qualifiers); - TREE_TYPE (target) = exception_specification; - return target; -} - -void -set_quals_and_spec (call_declarator, cv_qualifiers, exception_specification) - tree call_declarator, cv_qualifiers, exception_specification; -{ - TREE_OPERAND (call_declarator, 2) = cv_qualifiers; - TREE_TYPE (call_declarator) = exception_specification; -} - -/* Build names and nodes for overloaded operators. */ - -tree ansi_opname[LAST_CPLUS_TREE_CODE]; -tree ansi_assopname[LAST_CPLUS_TREE_CODE]; - -char * -operator_name_string (name) - tree name; -{ - char *opname = IDENTIFIER_POINTER (name) + 2; - tree *opname_table; - int i, assign; - - /* Works for builtin and user defined types. */ - if (IDENTIFIER_GLOBAL_VALUE (name) - && TREE_CODE (IDENTIFIER_GLOBAL_VALUE (name)) == TYPE_DECL) - return IDENTIFIER_POINTER (name); - - if (opname[0] == 'a' && opname[2] != '\0' && opname[2] != '_') - { - opname += 1; - assign = 1; - opname_table = ansi_assopname; - } - else - { - assign = 0; - opname_table = ansi_opname; - } - - for (i = 0; i < (int) LAST_CPLUS_TREE_CODE; i++) - { - if (opname[0] == IDENTIFIER_POINTER (opname_table[i])[2+assign] - && opname[1] == IDENTIFIER_POINTER (opname_table[i])[3+assign]) - break; - } - - if (i == LAST_CPLUS_TREE_CODE) - return ""; - - if (assign) - return assignop_tab[i]; - else - return opname_tab[i]; -} - -int interface_only; /* whether or not current file is only for - interface definitions. */ -int interface_unknown; /* whether or not we know this class - to behave according to #pragma interface. */ - -/* lexical analyzer */ - -#ifndef WCHAR_TYPE_SIZE -#ifdef INT_TYPE_SIZE -#define WCHAR_TYPE_SIZE INT_TYPE_SIZE -#else -#define WCHAR_TYPE_SIZE BITS_PER_WORD -#endif -#endif - -/* Number of bytes in a wide character. */ -#define WCHAR_BYTES (WCHAR_TYPE_SIZE / BITS_PER_UNIT) - -static int maxtoken; /* Current nominal length of token buffer. */ -char *token_buffer; /* Pointer to token buffer. - Actual allocated length is maxtoken + 2. */ - -#include "hash.h" - - -/* Nonzero tells yylex to ignore \ in string constants. */ -static int ignore_escape_flag = 0; - -static tree -get_time_identifier (name) - char *name; -{ - tree time_identifier; - int len = strlen (name); - char *buf = (char *) alloca (len + 6); - strcpy (buf, "file "); - bcopy (name, buf+5, len); - buf[len+5] = '\0'; - time_identifier = get_identifier (buf); - if (TIME_IDENTIFIER_TIME (time_identifier) == NULL_TREE) - { - push_obstacks_nochange (); - end_temporary_allocation (); - TIME_IDENTIFIER_TIME (time_identifier) = build_int_2 (0, 0); - TIME_IDENTIFIER_FILEINFO (time_identifier) - = build_int_2 (0, 1); - SET_IDENTIFIER_GLOBAL_VALUE (time_identifier, filename_times); - filename_times = time_identifier; - pop_obstacks (); - } - return time_identifier; -} - -#ifdef __GNUC__ -__inline -#endif -static int -my_get_run_time () -{ - int old_quiet_flag = quiet_flag; - int this_time; - quiet_flag = 0; - this_time = get_run_time (); - quiet_flag = old_quiet_flag; - return this_time; -} - -/* Table indexed by tree code giving a string containing a character - classifying the tree code. Possibilities are - t, d, s, c, r, <, 1 and 2. See cp/cp-tree.def for details. */ - -#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE, - -char cplus_tree_code_type[] = { - 'x', -#include "cp-tree.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, - -int cplus_tree_code_length[] = { - 0, -#include "cp-tree.def" -}; -#undef DEFTREECODE - -/* Names of tree components. - Used for printing out the tree and error messages. */ -#define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME, - -char *cplus_tree_code_name[] = { - "@@dummy", -#include "cp-tree.def" -}; -#undef DEFTREECODE - -/* toplev.c needs to call these. */ - -void -lang_init_options () -{ -#if USE_CPPLIB - cpp_reader_init (&parse_in); - parse_in.opts = &parse_options; - cpp_options_init (&parse_options); -#endif - - /* Default exceptions on. */ - flag_exceptions = 1; -} - -void -lang_init () -{ - /* the beginning of the file is a new line; check for # */ - /* With luck, we discover the real source file's name from that - and put it in input_filename. */ -#if ! USE_CPPLIB - put_back (check_newline ()); -#else - check_newline (); - yy_cur--; -#endif - if (flag_gnu_xref) GNU_xref_begin (input_filename); - init_repo (input_filename); -} - -void -lang_finish () -{ - extern int errorcount, sorrycount; - if (flag_gnu_xref) GNU_xref_end (errorcount+sorrycount); -} - -char * -lang_identify () -{ - return "cplusplus"; -} - -void -init_filename_times () -{ - this_filename_time = get_time_identifier (""); - if (flag_detailed_statistics) - { - header_time = 0; - body_time = my_get_run_time (); - TREE_INT_CST_LOW (TIME_IDENTIFIER_TIME (this_filename_time)) - = body_time; - } -} - -/* Change by Bryan Boreham, Kewill, Thu Jul 27 09:46:05 1989. - Stuck this hack in to get the files open correctly; this is called - in place of init_parse if we are an unexec'd binary. */ - -#if 0 -void -reinit_lang_specific () -{ - init_filename_times (); - reinit_search_statistics (); -} -#endif - -static int * -init_cpp_parse () -{ -#ifdef GATHER_STATISTICS -#ifdef REDUCE_LENGTH - reduce_count = (int *)malloc (sizeof (int) * (REDUCE_LENGTH + 1)); - bzero (reduce_count, sizeof (int) * (REDUCE_LENGTH + 1)); - reduce_count += 1; - token_count = (int *)malloc (sizeof (int) * (TOKEN_LENGTH + 1)); - bzero (token_count, sizeof (int) * (TOKEN_LENGTH + 1)); - token_count += 1; -#endif -#endif - return token_count; -} - -char * -init_parse (filename) - char *filename; -{ - extern int flag_no_gnu_keywords; - extern int flag_operator_names; - - int i; - -#ifdef MULTIBYTE_CHARS - /* Change to the native locale for multibyte conversions. */ - setlocale (LC_CTYPE, ""); - literal_codeset = getenv ("LANG"); -#endif - -#if USE_CPPLIB - parse_in.show_column = 1; - if (! cpp_start_read (&parse_in, filename)) - abort (); - - /* cpp_start_read always puts at least one line directive into the - token buffer. We must arrange to read it out here. */ - yy_cur = parse_in.token_buffer; - yy_lim = CPP_PWRITTEN (&parse_in); - -#else - /* Open input file. */ - if (filename == 0 || !strcmp (filename, "-")) - { - finput = stdin; - filename = "stdin"; - } - else - finput = fopen (filename, "r"); - if (finput == 0) - pfatal_with_name (filename); - -#ifdef IO_BUFFER_SIZE - setvbuf (finput, (char *) xmalloc (IO_BUFFER_SIZE), _IOFBF, IO_BUFFER_SIZE); -#endif -#endif /* !USE_CPPLIB */ - - /* Initialize the lookahead machinery. */ - init_spew (); - - /* Make identifier nodes long enough for the language-specific slots. */ - set_identifier_size (sizeof (struct lang_identifier)); - decl_printable_name = lang_printable_name; - - init_cplus_expand (); - - bcopy (cplus_tree_code_type, - tree_code_type + (int) LAST_AND_UNUSED_TREE_CODE, - (int)LAST_CPLUS_TREE_CODE - (int)LAST_AND_UNUSED_TREE_CODE); - bcopy ((char *)cplus_tree_code_length, - (char *)(tree_code_length + (int) LAST_AND_UNUSED_TREE_CODE), - (LAST_CPLUS_TREE_CODE - (int)LAST_AND_UNUSED_TREE_CODE) * sizeof (int)); - bcopy ((char *)cplus_tree_code_name, - (char *)(tree_code_name + (int) LAST_AND_UNUSED_TREE_CODE), - (LAST_CPLUS_TREE_CODE - (int)LAST_AND_UNUSED_TREE_CODE) * sizeof (char *)); - - opname_tab = (char **)oballoc ((int)LAST_CPLUS_TREE_CODE * sizeof (char *)); - bzero ((char *)opname_tab, (int)LAST_CPLUS_TREE_CODE * sizeof (char *)); - assignop_tab = (char **)oballoc ((int)LAST_CPLUS_TREE_CODE * sizeof (char *)); - bzero ((char *)assignop_tab, (int)LAST_CPLUS_TREE_CODE * sizeof (char *)); - - ansi_opname[0] = get_identifier (""); - for (i = 0; i < (int) LAST_CPLUS_TREE_CODE; i++) - { - ansi_opname[i] = ansi_opname[0]; - ansi_assopname[i] = ansi_opname[0]; - } - - ansi_opname[(int) MULT_EXPR] = get_identifier ("__ml"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) MULT_EXPR]) = 1; - ansi_opname[(int) INDIRECT_REF] = ansi_opname[(int) MULT_EXPR]; - ansi_assopname[(int) MULT_EXPR] = get_identifier ("__aml"); - IDENTIFIER_OPNAME_P (ansi_assopname[(int) MULT_EXPR]) = 1; - ansi_assopname[(int) INDIRECT_REF] = ansi_assopname[(int) MULT_EXPR]; - ansi_opname[(int) TRUNC_MOD_EXPR] = get_identifier ("__md"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) TRUNC_MOD_EXPR]) = 1; - ansi_assopname[(int) TRUNC_MOD_EXPR] = get_identifier ("__amd"); - IDENTIFIER_OPNAME_P (ansi_assopname[(int) TRUNC_MOD_EXPR]) = 1; - ansi_opname[(int) CEIL_MOD_EXPR] = ansi_opname[(int) TRUNC_MOD_EXPR]; - ansi_opname[(int) FLOOR_MOD_EXPR] = ansi_opname[(int) TRUNC_MOD_EXPR]; - ansi_opname[(int) ROUND_MOD_EXPR] = ansi_opname[(int) TRUNC_MOD_EXPR]; - ansi_opname[(int) MINUS_EXPR] = get_identifier ("__mi"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) MINUS_EXPR]) = 1; - ansi_opname[(int) NEGATE_EXPR] = ansi_opname[(int) MINUS_EXPR]; - ansi_assopname[(int) MINUS_EXPR] = get_identifier ("__ami"); - IDENTIFIER_OPNAME_P (ansi_assopname[(int) MINUS_EXPR]) = 1; - ansi_assopname[(int) NEGATE_EXPR] = ansi_assopname[(int) MINUS_EXPR]; - ansi_opname[(int) RSHIFT_EXPR] = get_identifier ("__rs"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) RSHIFT_EXPR]) = 1; - ansi_assopname[(int) RSHIFT_EXPR] = get_identifier ("__ars"); - IDENTIFIER_OPNAME_P (ansi_assopname[(int) RSHIFT_EXPR]) = 1; - ansi_opname[(int) NE_EXPR] = get_identifier ("__ne"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) NE_EXPR]) = 1; - ansi_opname[(int) GT_EXPR] = get_identifier ("__gt"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) GT_EXPR]) = 1; - ansi_opname[(int) GE_EXPR] = get_identifier ("__ge"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) GE_EXPR]) = 1; - ansi_opname[(int) BIT_IOR_EXPR] = get_identifier ("__or"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) BIT_IOR_EXPR]) = 1; - ansi_assopname[(int) BIT_IOR_EXPR] = get_identifier ("__aor"); - IDENTIFIER_OPNAME_P (ansi_assopname[(int) BIT_IOR_EXPR]) = 1; - ansi_opname[(int) TRUTH_ANDIF_EXPR] = get_identifier ("__aa"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) TRUTH_ANDIF_EXPR]) = 1; - ansi_opname[(int) TRUTH_NOT_EXPR] = get_identifier ("__nt"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) TRUTH_NOT_EXPR]) = 1; - ansi_opname[(int) PREINCREMENT_EXPR] = get_identifier ("__pp"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) PREINCREMENT_EXPR]) = 1; - ansi_opname[(int) POSTINCREMENT_EXPR] = ansi_opname[(int) PREINCREMENT_EXPR]; - ansi_opname[(int) MODIFY_EXPR] = get_identifier ("__as"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) MODIFY_EXPR]) = 1; - ansi_assopname[(int) NOP_EXPR] = ansi_opname[(int) MODIFY_EXPR]; - ansi_opname[(int) COMPOUND_EXPR] = get_identifier ("__cm"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) COMPOUND_EXPR]) = 1; - ansi_opname[(int) EXACT_DIV_EXPR] = get_identifier ("__dv"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) EXACT_DIV_EXPR]) = 1; - ansi_assopname[(int) EXACT_DIV_EXPR] = get_identifier ("__adv"); - IDENTIFIER_OPNAME_P (ansi_assopname[(int) EXACT_DIV_EXPR]) = 1; - ansi_opname[(int) TRUNC_DIV_EXPR] = ansi_opname[(int) EXACT_DIV_EXPR]; - ansi_opname[(int) CEIL_DIV_EXPR] = ansi_opname[(int) EXACT_DIV_EXPR]; - ansi_opname[(int) FLOOR_DIV_EXPR] = ansi_opname[(int) EXACT_DIV_EXPR]; - ansi_opname[(int) ROUND_DIV_EXPR] = ansi_opname[(int) EXACT_DIV_EXPR]; - ansi_opname[(int) PLUS_EXPR] = get_identifier ("__pl"); - ansi_assopname[(int) TRUNC_DIV_EXPR] = ansi_assopname[(int) EXACT_DIV_EXPR]; - ansi_assopname[(int) CEIL_DIV_EXPR] = ansi_assopname[(int) EXACT_DIV_EXPR]; - ansi_assopname[(int) FLOOR_DIV_EXPR] = ansi_assopname[(int) EXACT_DIV_EXPR]; - ansi_assopname[(int) ROUND_DIV_EXPR] = ansi_assopname[(int) EXACT_DIV_EXPR]; - IDENTIFIER_OPNAME_P (ansi_opname[(int) PLUS_EXPR]) = 1; - ansi_assopname[(int) PLUS_EXPR] = get_identifier ("__apl"); - IDENTIFIER_OPNAME_P (ansi_assopname[(int) PLUS_EXPR]) = 1; - ansi_opname[(int) CONVERT_EXPR] = ansi_opname[(int) PLUS_EXPR]; - ansi_assopname[(int) CONVERT_EXPR] = ansi_assopname[(int) PLUS_EXPR]; - ansi_opname[(int) LSHIFT_EXPR] = get_identifier ("__ls"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) LSHIFT_EXPR]) = 1; - ansi_assopname[(int) LSHIFT_EXPR] = get_identifier ("__als"); - IDENTIFIER_OPNAME_P (ansi_assopname[(int) LSHIFT_EXPR]) = 1; - ansi_opname[(int) EQ_EXPR] = get_identifier ("__eq"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) EQ_EXPR]) = 1; - ansi_opname[(int) LT_EXPR] = get_identifier ("__lt"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) LT_EXPR]) = 1; - ansi_opname[(int) LE_EXPR] = get_identifier ("__le"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) LE_EXPR]) = 1; - ansi_opname[(int) BIT_AND_EXPR] = get_identifier ("__ad"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) BIT_AND_EXPR]) = 1; - ansi_assopname[(int) BIT_AND_EXPR] = get_identifier ("__aad"); - IDENTIFIER_OPNAME_P (ansi_assopname[(int) BIT_AND_EXPR]) = 1; - ansi_opname[(int) ADDR_EXPR] = ansi_opname[(int) BIT_AND_EXPR]; - ansi_assopname[(int) ADDR_EXPR] = ansi_assopname[(int) BIT_AND_EXPR]; - ansi_opname[(int) BIT_XOR_EXPR] = get_identifier ("__er"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) BIT_XOR_EXPR]) = 1; - ansi_assopname[(int) BIT_XOR_EXPR] = get_identifier ("__aer"); - IDENTIFIER_OPNAME_P (ansi_assopname[(int) BIT_XOR_EXPR]) = 1; - ansi_opname[(int) TRUTH_ORIF_EXPR] = get_identifier ("__oo"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) TRUTH_ORIF_EXPR]) = 1; - ansi_opname[(int) BIT_NOT_EXPR] = get_identifier ("__co"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) BIT_NOT_EXPR]) = 1; - ansi_opname[(int) PREDECREMENT_EXPR] = get_identifier ("__mm"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) PREDECREMENT_EXPR]) = 1; - ansi_opname[(int) POSTDECREMENT_EXPR] = ansi_opname[(int) PREDECREMENT_EXPR]; - ansi_opname[(int) COMPONENT_REF] = get_identifier ("__rf"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) COMPONENT_REF]) = 1; - ansi_opname[(int) MEMBER_REF] = get_identifier ("__rm"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) MEMBER_REF]) = 1; - ansi_opname[(int) CALL_EXPR] = get_identifier ("__cl"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) CALL_EXPR]) = 1; - ansi_opname[(int) ARRAY_REF] = get_identifier ("__vc"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) ARRAY_REF]) = 1; - ansi_opname[(int) NEW_EXPR] = get_identifier ("__nw"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) NEW_EXPR]) = 1; - ansi_opname[(int) DELETE_EXPR] = get_identifier ("__dl"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) DELETE_EXPR]) = 1; - ansi_opname[(int) VEC_NEW_EXPR] = get_identifier ("__vn"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) VEC_NEW_EXPR]) = 1; - ansi_opname[(int) VEC_DELETE_EXPR] = get_identifier ("__vd"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) VEC_DELETE_EXPR]) = 1; - ansi_opname[(int) TYPE_EXPR] = get_identifier (OPERATOR_TYPENAME_FORMAT); - IDENTIFIER_OPNAME_P (ansi_opname[(int) TYPE_EXPR]) = 1; - - /* This is not true: these operators are not defined in ANSI, - but we need them anyway. */ - ansi_opname[(int) MIN_EXPR] = get_identifier ("__mn"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) MIN_EXPR]) = 1; - ansi_opname[(int) MAX_EXPR] = get_identifier ("__mx"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) MAX_EXPR]) = 1; - ansi_opname[(int) COND_EXPR] = get_identifier ("__cn"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) COND_EXPR]) = 1; - ansi_opname[(int) SIZEOF_EXPR] = get_identifier ("__sz"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) SIZEOF_EXPR]) = 1; - - init_method (); - init_error (); - gcc_obstack_init (&inline_text_obstack); - inline_text_firstobj = (char *) obstack_alloc (&inline_text_obstack, 0); - - /* Start it at 0, because check_newline is called at the very beginning - and will increment it to 1. */ - lineno = 0; - input_filename = ""; - current_function_decl = NULL; - - maxtoken = 40; - token_buffer = (char *) xmalloc (maxtoken + 2); - - ridpointers[(int) RID_INT] = get_identifier ("int"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_INT], - build_tree_list (NULL_TREE, ridpointers[(int) RID_INT])); - ridpointers[(int) RID_BOOL] = get_identifier ("bool"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_BOOL], - build_tree_list (NULL_TREE, ridpointers[(int) RID_BOOL])); - ridpointers[(int) RID_CHAR] = get_identifier ("char"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_CHAR], - build_tree_list (NULL_TREE, ridpointers[(int) RID_CHAR])); - ridpointers[(int) RID_VOID] = get_identifier ("void"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_VOID], - build_tree_list (NULL_TREE, ridpointers[(int) RID_VOID])); - ridpointers[(int) RID_FLOAT] = get_identifier ("float"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_FLOAT], - build_tree_list (NULL_TREE, ridpointers[(int) RID_FLOAT])); - ridpointers[(int) RID_DOUBLE] = get_identifier ("double"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_DOUBLE], - build_tree_list (NULL_TREE, ridpointers[(int) RID_DOUBLE])); - ridpointers[(int) RID_SHORT] = get_identifier ("short"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_SHORT], - build_tree_list (NULL_TREE, ridpointers[(int) RID_SHORT])); - ridpointers[(int) RID_LONG] = get_identifier ("long"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_LONG], - build_tree_list (NULL_TREE, ridpointers[(int) RID_LONG])); - ridpointers[(int) RID_UNSIGNED] = get_identifier ("unsigned"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_UNSIGNED], - build_tree_list (NULL_TREE, ridpointers[(int) RID_UNSIGNED])); - ridpointers[(int) RID_SIGNED] = get_identifier ("signed"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_SIGNED], - build_tree_list (NULL_TREE, ridpointers[(int) RID_SIGNED])); - ridpointers[(int) RID_INLINE] = get_identifier ("inline"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_INLINE], - build_tree_list (NULL_TREE, ridpointers[(int) RID_INLINE])); - ridpointers[(int) RID_CONST] = get_identifier ("const"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_CONST], - build_tree_list (NULL_TREE, ridpointers[(int) RID_CONST])); - ridpointers[(int) RID_VOLATILE] = get_identifier ("volatile"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_VOLATILE], - build_tree_list (NULL_TREE, ridpointers[(int) RID_VOLATILE])); - ridpointers[(int) RID_RESTRICT] = get_identifier ("__restrict"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_RESTRICT], - build_tree_list (NULL_TREE, ridpointers[(int) RID_RESTRICT])); - ridpointers[(int) RID_AUTO] = get_identifier ("auto"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_AUTO], - build_tree_list (NULL_TREE, ridpointers[(int) RID_AUTO])); - ridpointers[(int) RID_STATIC] = get_identifier ("static"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_STATIC], - build_tree_list (NULL_TREE, ridpointers[(int) RID_STATIC])); - ridpointers[(int) RID_EXTERN] = get_identifier ("extern"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_EXTERN], - build_tree_list (NULL_TREE, ridpointers[(int) RID_EXTERN])); - ridpointers[(int) RID_TYPEDEF] = get_identifier ("typedef"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_TYPEDEF], - build_tree_list (NULL_TREE, ridpointers[(int) RID_TYPEDEF])); - ridpointers[(int) RID_REGISTER] = get_identifier ("register"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_REGISTER], - build_tree_list (NULL_TREE, ridpointers[(int) RID_REGISTER])); - ridpointers[(int) RID_COMPLEX] = get_identifier ("__complex"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_COMPLEX], - build_tree_list (NULL_TREE, ridpointers[(int) RID_COMPLEX])); - - /* C++ extensions. These are probably not correctly named. */ - ridpointers[(int) RID_WCHAR] = get_identifier ("__wchar_t"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_WCHAR], - build_tree_list (NULL_TREE, ridpointers[(int) RID_WCHAR])); - class_type_node = build_int_2 (class_type, 0); - TREE_TYPE (class_type_node) = class_type_node; - ridpointers[(int) RID_CLASS] = class_type_node; - - record_type_node = build_int_2 (record_type, 0); - TREE_TYPE (record_type_node) = record_type_node; - ridpointers[(int) RID_RECORD] = record_type_node; - - union_type_node = build_int_2 (union_type, 0); - TREE_TYPE (union_type_node) = union_type_node; - ridpointers[(int) RID_UNION] = union_type_node; - - enum_type_node = build_int_2 (enum_type, 0); - TREE_TYPE (enum_type_node) = enum_type_node; - ridpointers[(int) RID_ENUM] = enum_type_node; - - ridpointers[(int) RID_VIRTUAL] = get_identifier ("virtual"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_VIRTUAL], - build_tree_list (NULL_TREE, ridpointers[(int) RID_VIRTUAL])); - ridpointers[(int) RID_EXPLICIT] = get_identifier ("explicit"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_EXPLICIT], - build_tree_list (NULL_TREE, ridpointers[(int) RID_EXPLICIT])); - ridpointers[(int) RID_EXPORT] = get_identifier ("export"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_EXPORT], - build_tree_list (NULL_TREE, ridpointers[(int) RID_EXPORT])); - ridpointers[(int) RID_FRIEND] = get_identifier ("friend"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_FRIEND], - build_tree_list (NULL_TREE, ridpointers[(int) RID_FRIEND])); - - ridpointers[(int) RID_PUBLIC] = get_identifier ("public"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_PUBLIC], - build_tree_list (NULL_TREE, ridpointers[(int) RID_PUBLIC])); - ridpointers[(int) RID_PRIVATE] = get_identifier ("private"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_PRIVATE], - build_tree_list (NULL_TREE, ridpointers[(int) RID_PRIVATE])); - ridpointers[(int) RID_PROTECTED] = get_identifier ("protected"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_PROTECTED], - build_tree_list (NULL_TREE, ridpointers[(int) RID_PROTECTED])); - ridpointers[(int) RID_TEMPLATE] = get_identifier ("template"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_TEMPLATE], - build_tree_list (NULL_TREE, ridpointers[(int) RID_TEMPLATE])); - /* This is for ANSI C++. */ - ridpointers[(int) RID_MUTABLE] = get_identifier ("mutable"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_MUTABLE], - build_tree_list (NULL_TREE, ridpointers[(int) RID_MUTABLE])); - - /* Signature handling extensions. */ - signature_type_node = build_int_2 (signature_type, 0); - TREE_TYPE (signature_type_node) = signature_type_node; - ridpointers[(int) RID_SIGNATURE] = signature_type_node; - - /* Create the built-in __null node. Note that we can't yet call for - type_for_size here because integer_type_node and so forth are not - set up. Therefore, we don't set the type of these nodes until - init_decl_processing. */ - null_node = build_int_2 (0, 0); - ridpointers[RID_NULL] = null_node; - - opname_tab[(int) COMPONENT_REF] = "->"; - opname_tab[(int) MEMBER_REF] = "->*"; - opname_tab[(int) INDIRECT_REF] = "*"; - opname_tab[(int) ARRAY_REF] = "[]"; - opname_tab[(int) MODIFY_EXPR] = "="; - opname_tab[(int) NEW_EXPR] = "new"; - opname_tab[(int) DELETE_EXPR] = "delete"; - opname_tab[(int) VEC_NEW_EXPR] = "new []"; - opname_tab[(int) VEC_DELETE_EXPR] = "delete []"; - opname_tab[(int) COND_EXPR] = "?:"; - opname_tab[(int) CALL_EXPR] = "()"; - opname_tab[(int) PLUS_EXPR] = "+"; - opname_tab[(int) MINUS_EXPR] = "-"; - opname_tab[(int) MULT_EXPR] = "*"; - opname_tab[(int) TRUNC_DIV_EXPR] = "/"; - opname_tab[(int) CEIL_DIV_EXPR] = "(ceiling /)"; - opname_tab[(int) FLOOR_DIV_EXPR] = "(floor /)"; - opname_tab[(int) ROUND_DIV_EXPR] = "(round /)"; - opname_tab[(int) TRUNC_MOD_EXPR] = "%"; - opname_tab[(int) CEIL_MOD_EXPR] = "(ceiling %)"; - opname_tab[(int) FLOOR_MOD_EXPR] = "(floor %)"; - opname_tab[(int) ROUND_MOD_EXPR] = "(round %)"; - opname_tab[(int) NEGATE_EXPR] = "-"; - opname_tab[(int) MIN_EXPR] = "?"; - opname_tab[(int) ABS_EXPR] = "abs"; - opname_tab[(int) FFS_EXPR] = "ffs"; - opname_tab[(int) LSHIFT_EXPR] = "<<"; - opname_tab[(int) RSHIFT_EXPR] = ">>"; - opname_tab[(int) BIT_IOR_EXPR] = "|"; - opname_tab[(int) BIT_XOR_EXPR] = "^"; - opname_tab[(int) BIT_AND_EXPR] = "&"; - opname_tab[(int) BIT_ANDTC_EXPR] = "&~"; - opname_tab[(int) BIT_NOT_EXPR] = "~"; - opname_tab[(int) TRUTH_ANDIF_EXPR] = "&&"; - opname_tab[(int) TRUTH_ORIF_EXPR] = "||"; - opname_tab[(int) TRUTH_AND_EXPR] = "strict &&"; - opname_tab[(int) TRUTH_OR_EXPR] = "strict ||"; - opname_tab[(int) TRUTH_NOT_EXPR] = "!"; - opname_tab[(int) LT_EXPR] = "<"; - opname_tab[(int) LE_EXPR] = "<="; - opname_tab[(int) GT_EXPR] = ">"; - opname_tab[(int) GE_EXPR] = ">="; - opname_tab[(int) EQ_EXPR] = "=="; - opname_tab[(int) NE_EXPR] = "!="; - opname_tab[(int) IN_EXPR] = "in"; - opname_tab[(int) RANGE_EXPR] = "..."; - opname_tab[(int) CONVERT_EXPR] = "+"; - opname_tab[(int) ADDR_EXPR] = "&"; - opname_tab[(int) PREDECREMENT_EXPR] = "--"; - opname_tab[(int) PREINCREMENT_EXPR] = "++"; - opname_tab[(int) POSTDECREMENT_EXPR] = "--"; - opname_tab[(int) POSTINCREMENT_EXPR] = "++"; - opname_tab[(int) COMPOUND_EXPR] = ","; - - assignop_tab[(int) NOP_EXPR] = "="; - assignop_tab[(int) PLUS_EXPR] = "+="; - assignop_tab[(int) CONVERT_EXPR] = "+="; - assignop_tab[(int) MINUS_EXPR] = "-="; - assignop_tab[(int) NEGATE_EXPR] = "-="; - assignop_tab[(int) MULT_EXPR] = "*="; - assignop_tab[(int) INDIRECT_REF] = "*="; - assignop_tab[(int) TRUNC_DIV_EXPR] = "/="; - assignop_tab[(int) EXACT_DIV_EXPR] = "(exact /=)"; - assignop_tab[(int) CEIL_DIV_EXPR] = "(ceiling /=)"; - assignop_tab[(int) FLOOR_DIV_EXPR] = "(floor /=)"; - assignop_tab[(int) ROUND_DIV_EXPR] = "(round /=)"; - assignop_tab[(int) TRUNC_MOD_EXPR] = "%="; - assignop_tab[(int) CEIL_MOD_EXPR] = "(ceiling %=)"; - assignop_tab[(int) FLOOR_MOD_EXPR] = "(floor %=)"; - assignop_tab[(int) ROUND_MOD_EXPR] = "(round %=)"; - assignop_tab[(int) MIN_EXPR] = "?="; - assignop_tab[(int) LSHIFT_EXPR] = "<<="; - assignop_tab[(int) RSHIFT_EXPR] = ">>="; - assignop_tab[(int) BIT_IOR_EXPR] = "|="; - assignop_tab[(int) BIT_XOR_EXPR] = "^="; - assignop_tab[(int) BIT_AND_EXPR] = "&="; - assignop_tab[(int) ADDR_EXPR] = "&="; - - init_filename_times (); - - /* Some options inhibit certain reserved words. - Clear those words out of the hash table so they won't be recognized. */ -#define UNSET_RESERVED_WORD(STRING) \ - do { struct resword *s = is_reserved_word (STRING, sizeof (STRING) - 1); \ - if (s) s->name = ""; } while (0) - -#if 0 - /* let's parse things, and if they use it, then give them an error. */ - if (!flag_exceptions) - { - UNSET_RESERVED_WORD ("throw"); - UNSET_RESERVED_WORD ("try"); - UNSET_RESERVED_WORD ("catch"); - } -#endif - - if (!flag_rtti || flag_no_gnu_keywords) - { - UNSET_RESERVED_WORD ("classof"); - UNSET_RESERVED_WORD ("headof"); - } - - if (! flag_handle_signatures || flag_no_gnu_keywords) - { - /* Easiest way to not recognize signature - handling extensions... */ - UNSET_RESERVED_WORD ("signature"); - UNSET_RESERVED_WORD ("sigof"); - } - if (flag_no_asm || flag_no_gnu_keywords) - UNSET_RESERVED_WORD ("typeof"); - if (! flag_operator_names) - { - /* These are new ANSI keywords that may break code. */ - UNSET_RESERVED_WORD ("and"); - UNSET_RESERVED_WORD ("and_eq"); - UNSET_RESERVED_WORD ("bitand"); - UNSET_RESERVED_WORD ("bitor"); - UNSET_RESERVED_WORD ("compl"); - UNSET_RESERVED_WORD ("not"); - UNSET_RESERVED_WORD ("not_eq"); - UNSET_RESERVED_WORD ("or"); - UNSET_RESERVED_WORD ("or_eq"); - UNSET_RESERVED_WORD ("xor"); - UNSET_RESERVED_WORD ("xor_eq"); - } - - token_count = init_cpp_parse (); - interface_unknown = 1; - - return filename; -} - -void -finish_parse () -{ -#if USE_CPPLIB - cpp_finish (&parse_in); -#else - fclose (finput); -#endif -} - -void -reinit_parse_for_function () -{ - current_base_init_list = NULL_TREE; - current_member_init_list = NULL_TREE; -} - -#ifdef __GNUC__ -__inline -#endif -void -yyprint (file, yychar, yylval) - FILE *file; - int yychar; - YYSTYPE yylval; -{ - tree t; - switch (yychar) - { - case IDENTIFIER: - case TYPENAME: - case TYPESPEC: - case PTYPENAME: - case IDENTIFIER_DEFN: - case TYPENAME_DEFN: - case PTYPENAME_DEFN: - case SCSPEC: - case PRE_PARSED_CLASS_DECL: - t = yylval.ttype; - if (TREE_CODE (t) == TYPE_DECL || TREE_CODE (t) == TEMPLATE_DECL) - { - fprintf (file, " `%s'", IDENTIFIER_POINTER (DECL_NAME (t))); - break; - } - my_friendly_assert (TREE_CODE (t) == IDENTIFIER_NODE, 224); - if (IDENTIFIER_POINTER (t)) - fprintf (file, " `%s'", IDENTIFIER_POINTER (t)); - break; - case AGGR: - if (yylval.ttype == class_type_node) - fprintf (file, " `class'"); - else if (yylval.ttype == record_type_node) - fprintf (file, " `struct'"); - else if (yylval.ttype == union_type_node) - fprintf (file, " `union'"); - else if (yylval.ttype == enum_type_node) - fprintf (file, " `enum'"); - else if (yylval.ttype == signature_type_node) - fprintf (file, " `signature'"); - else - my_friendly_abort (80); - break; - } -} - -#if defined(GATHER_STATISTICS) && defined(REDUCE_LENGTH) -static int *reduce_count; -#endif - -int *token_count; - -#if 0 -#define REDUCE_LENGTH (sizeof (yyr2) / sizeof (yyr2[0])) -#define TOKEN_LENGTH (256 + sizeof (yytname) / sizeof (yytname[0])) -#endif - -#ifdef GATHER_STATISTICS -#ifdef REDUCE_LENGTH -void -yyhook (yyn) - int yyn; -{ - reduce_count[yyn] += 1; -} - -static int -reduce_cmp (p, q) - int *p, *q; -{ - return reduce_count[*q] - reduce_count[*p]; -} - -static int -token_cmp (p, q) - int *p, *q; -{ - return token_count[*q] - token_count[*p]; -} -#endif -#endif - -void -print_parse_statistics () -{ -#ifdef GATHER_STATISTICS -#ifdef REDUCE_LENGTH -#if YYDEBUG != 0 - int i; - int maxlen = REDUCE_LENGTH; - unsigned *sorted; - - if (reduce_count[-1] == 0) - return; - - if (TOKEN_LENGTH > REDUCE_LENGTH) - maxlen = TOKEN_LENGTH; - sorted = (unsigned *) alloca (sizeof (int) * maxlen); - - for (i = 0; i < TOKEN_LENGTH; i++) - sorted[i] = i; - qsort (sorted, TOKEN_LENGTH, sizeof (int), token_cmp); - for (i = 0; i < TOKEN_LENGTH; i++) - { - int idx = sorted[i]; - if (token_count[idx] == 0) - break; - if (token_count[idx] < token_count[-1]) - break; - fprintf (stderr, "token %d, `%s', count = %d\n", - idx, yytname[YYTRANSLATE (idx)], token_count[idx]); - } - fprintf (stderr, "\n"); - for (i = 0; i < REDUCE_LENGTH; i++) - sorted[i] = i; - qsort (sorted, REDUCE_LENGTH, sizeof (int), reduce_cmp); - for (i = 0; i < REDUCE_LENGTH; i++) - { - int idx = sorted[i]; - if (reduce_count[idx] == 0) - break; - if (reduce_count[idx] < reduce_count[-1]) - break; - fprintf (stderr, "rule %d, line %d, count = %d\n", - idx, yyrline[idx], reduce_count[idx]); - } - fprintf (stderr, "\n"); -#endif -#endif -#endif -} - -/* Sets the value of the 'yydebug' variable to VALUE. - This is a function so we don't have to have YYDEBUG defined - in order to build the compiler. */ - -void -set_yydebug (value) - int value; -{ -#if YYDEBUG != 0 - extern int yydebug; - yydebug = value; -#else - warning ("YYDEBUG not defined."); -#endif -} - - -/* Functions and data structures for #pragma interface. - - `#pragma implementation' means that the main file being compiled - is considered to implement (provide) the classes that appear in - its main body. I.e., if this is file "foo.cc", and class `bar' - is defined in "foo.cc", then we say that "foo.cc implements bar". - - All main input files "implement" themselves automagically. - - `#pragma interface' means that unless this file (of the form "foo.h" - is not presently being included by file "foo.cc", the - CLASSTYPE_INTERFACE_ONLY bit gets set. The effect is that none - of the vtables nor any of the inline functions defined in foo.h - will ever be output. - - There are cases when we want to link files such as "defs.h" and - "main.cc". In this case, we give "defs.h" a `#pragma interface', - and "main.cc" has `#pragma implementation "defs.h"'. */ - -struct impl_files -{ - char *filename; - struct impl_files *next; -}; - -static struct impl_files *impl_file_chain; - -/* Helper function to load global variables with interface - information. */ - -void -extract_interface_info () -{ - tree fileinfo = 0; - - if (flag_alt_external_templates) - { - struct tinst_level *til = tinst_for_decl (); - - if (til) - fileinfo = get_time_identifier (til->file); - } - if (!fileinfo) - fileinfo = get_time_identifier (input_filename); - fileinfo = TIME_IDENTIFIER_FILEINFO (fileinfo); - interface_only = TREE_INT_CST_LOW (fileinfo); - interface_unknown = TREE_INT_CST_HIGH (fileinfo); -} - -/* Return nonzero if S is not considered part of an - INTERFACE/IMPLEMENTATION pair. Otherwise, return 0. */ - -static int -interface_strcmp (s) - char *s; -{ - /* Set the interface/implementation bits for this scope. */ - struct impl_files *ifiles; - char *s1; - - for (ifiles = impl_file_chain; ifiles; ifiles = ifiles->next) - { - char *t1 = ifiles->filename; - s1 = s; - - if (*s1 != *t1 || *s1 == 0) - continue; - - while (*s1 == *t1 && *s1 != 0) - s1++, t1++; - - /* A match. */ - if (*s1 == *t1) - return 0; - - /* Don't get faked out by xxx.yyy.cc vs xxx.zzz.cc. */ - if (index (s1, '.') || index (t1, '.')) - continue; - - if (*s1 == '\0' || s1[-1] != '.' || t1[-1] != '.') - continue; - - /* A match. */ - return 0; - } - - /* No matches. */ - return 1; -} - -static void -set_typedecl_interface_info (prev, vars) - tree prev ATTRIBUTE_UNUSED, vars; -{ - tree id = get_time_identifier (DECL_SOURCE_FILE (vars)); - tree fileinfo = TIME_IDENTIFIER_FILEINFO (id); - tree type = TREE_TYPE (vars); - - CLASSTYPE_INTERFACE_ONLY (type) = TREE_INT_CST_LOW (fileinfo) - = interface_strcmp (file_name_nondirectory (DECL_SOURCE_FILE (vars))); -} - -static int -set_vardecl_interface_info (prev, vars) - tree prev, vars; -{ - tree type = DECL_CONTEXT (vars); - - if (CLASSTYPE_INTERFACE_KNOWN (type)) - { - if (CLASSTYPE_INTERFACE_ONLY (type)) - set_typedecl_interface_info (prev, TYPE_MAIN_DECL (type)); - else - CLASSTYPE_VTABLE_NEEDS_WRITING (type) = 1; - DECL_EXTERNAL (vars) = CLASSTYPE_INTERFACE_ONLY (type); - TREE_PUBLIC (vars) = 1; - return 1; - } - return 0; -} - -/* Set up the state required to correctly handle the definition of the - inline function whose preparsed state has been saved in PI. */ - -static void -begin_definition_of_inclass_inline (pi) - struct pending_inline* pi; -{ - tree context; - - if (!pi->fndecl) - return; - - /* If this is an inline function in a local class, we must make sure - that we save all pertinent information about the function - surrounding the local class. */ - context = hack_decl_function_context (pi->fndecl); - if (context) - push_cp_function_context (context); - - feed_input (pi->buf, pi->len); - lineno = pi->lineno; - input_filename = pi->filename; - yychar = PRE_PARSED_FUNCTION_DECL; - yylval.ttype = build_tree_list ((tree) pi, pi->fndecl); - /* Pass back a handle to the rest of the inline functions, so that they - can be processed later. */ - DECL_PENDING_INLINE_INFO (pi->fndecl) = 0; - interface_unknown = pi->interface == 1; - interface_only = pi->interface == 0; -} - -/* Called from the top level: if there are any pending inlines to - do, set up to process them now. This function sets up the first function - to be parsed; after it has been, the rule for fndef in parse.y will - call process_next_inline to start working on the next one. */ - -void -do_pending_inlines () -{ - struct pending_inline *t; - - /* Oops, we're still dealing with the last batch. */ - if (yychar == PRE_PARSED_FUNCTION_DECL) - return; - - /* Reverse the pending inline functions, since - they were cons'd instead of appended. */ - { - struct pending_inline *prev = 0, *tail; - t = pending_inlines; - pending_inlines = 0; - - for (; t; t = tail) - { - tail = t->next; - t->next = prev; - t->deja_vu = 1; - prev = t; - } - t = prev; - } - - if (t == 0) - return; - - /* Now start processing the first inline function. */ - begin_definition_of_inclass_inline (t); -} - -static int nextchar = -1; - -/* Called from the fndecl rule in the parser when the function just parsed - was declared using a PRE_PARSED_FUNCTION_DECL (i.e. came from - do_pending_inlines). */ - -void -process_next_inline (t) - tree t; -{ - tree context; - struct pending_inline *i = (struct pending_inline *) TREE_PURPOSE (t); - context = hack_decl_function_context (i->fndecl); - if (context) - pop_cp_function_context (context); - i = i->next; - if (yychar == YYEMPTY) - yychar = yylex (); - if (yychar != END_OF_SAVED_INPUT) - { - error ("parse error at end of saved function text"); - - /* restore_pending_input will abort unless yychar is either - END_OF_SAVED_INPUT or YYEMPTY; since we already know we're - hosed, feed back YYEMPTY. We also need to discard nextchar, - since that may have gotten set as well. */ - nextchar = -1; - } - yychar = YYEMPTY; - end_input (); - if (i) - begin_definition_of_inclass_inline (i); - else - extract_interface_info (); -} - -/* Since inline methods can refer to text which has not yet been seen, - we store the text of the method in a structure which is placed in the - DECL_PENDING_INLINE_INFO field of the FUNCTION_DECL. - After parsing the body of the class definition, the FUNCTION_DECL's are - scanned to see which ones have this field set. Those are then digested - one at a time. - - This function's FUNCTION_DECL will have a bit set in its common so - that we know to watch out for it. */ - -#ifdef MULTIBYTE_CHARS -static int consume_string_buffer_max = 0; -static int consume_string_buffer_size = 0; -static char *consume_string_buffer = 0; - -static void -consume_string_buffer_add (c) - char c; -{ - if (consume_string_buffer_size >= consume_string_buffer_max) - { - consume_string_buffer_max += 10; /* arbitrary */ - consume_string_buffer = (char *) xrealloc (consume_string_buffer, - consume_string_buffer_max); - } - consume_string_buffer[consume_string_buffer_size++] = c; -} -#endif - -static void -consume_string (this_obstack, matching_char) - register struct obstack *this_obstack; - int matching_char; -{ - register int c; - int starting_lineno = lineno; -#ifdef MULTIBYTE_CHARS - int longest_char = local_mb_cur_max (); - (void) local_mbtowc (NULL_PTR, NULL_PTR, 0); -#endif - - do - { - c = getch (); - try_again: - if (c == EOF) - { - int save_lineno = lineno; - lineno = starting_lineno; - if (matching_char == '"') - error ("end of file encountered inside string constant"); - else - error ("end of file encountered inside character constant"); - lineno = save_lineno; - return; - } - if (c == '\\') - { - obstack_1grow (this_obstack, c); - c = getch (); - obstack_1grow (this_obstack, c); - - /* Make sure we continue the loop */ - c = 0; - continue; - } - if (c == '\n') - { - if (pedantic) - pedwarn ("ANSI C++ forbids newline in string constant"); - lineno++; - } -#ifdef MULTIBYTE_CHARS - { - wchar_t wc; - int i; - int char_len = -1; - - consume_string_buffer_size = 0; - for (i = 1; i <= longest_char; ++i) - { - consume_string_buffer_add(c); - char_len = local_mbtowc (& wc, - consume_string_buffer, - i); - if (char_len != -1) - break; - c = getch (); - } - - if (char_len > 0) - { - obstack_grow (this_obstack, consume_string_buffer, char_len - 1); - /* mbtowc sometimes needs an extra char before accepting */ - if (char_len < i) - goto try_again; - } - else - warning ("Ignoring invalid multibyte character"); - } -#endif /* MULTIBYTE_CHARS */ - obstack_1grow (this_obstack, c); - } - while (c != matching_char); -} - -static int nextyychar = YYEMPTY; -static YYSTYPE nextyylval; - -struct pending_input { - int nextchar, yychar, nextyychar, eof; - YYSTYPE yylval, nextyylval; - struct obstack token_obstack; - int first_token; -}; - -struct pending_input * -save_pending_input () -{ - struct pending_input *p; - p = (struct pending_input *) xmalloc (sizeof (struct pending_input)); - p->nextchar = nextchar; - p->yychar = yychar; - p->nextyychar = nextyychar; - p->yylval = yylval; - p->nextyylval = nextyylval; - p->eof = end_of_file; - yychar = nextyychar = YYEMPTY; - nextchar = -1; - p->first_token = first_token; - p->token_obstack = token_obstack; - - first_token = 0; - gcc_obstack_init (&token_obstack); - end_of_file = 0; - return p; -} - -void -restore_pending_input (p) - struct pending_input *p; -{ - my_friendly_assert (nextchar == -1, 229); - nextchar = p->nextchar; - my_friendly_assert (yychar == YYEMPTY || yychar == END_OF_SAVED_INPUT, 230); - yychar = p->yychar; - my_friendly_assert (nextyychar == YYEMPTY, 231); - nextyychar = p->nextyychar; - yylval = p->yylval; - nextyylval = p->nextyylval; - first_token = p->first_token; - obstack_free (&token_obstack, (char *) 0); - token_obstack = p->token_obstack; - end_of_file = p->eof; - free (p); -} - -/* Unget character CH from the input stream. - If RESCAN is non-zero, then we want to `see' this - character as the next input token. */ - -void -yyungetc (ch, rescan) - int ch; - int rescan; -{ - /* Unget a character from the input stream. */ - if (yychar == YYEMPTY || rescan == 0) - { - if (nextchar >= 0) - put_back (nextchar); - nextchar = ch; - } - else - { - my_friendly_assert (nextyychar == YYEMPTY, 232); - nextyychar = yychar; - nextyylval = yylval; - yychar = ch; - } -} - -void -clear_inline_text_obstack () -{ - obstack_free (&inline_text_obstack, inline_text_firstobj); -} - -/* This function stores away the text for an inline function that should - be processed later. It decides how much later, and may need to move - the info between obstacks; therefore, the caller should not refer to - the T parameter after calling this function. */ - -static void -store_pending_inline (decl, t) - tree decl; - struct pending_inline *t; -{ - t->fndecl = decl; - DECL_PENDING_INLINE_INFO (decl) = t; - - /* Because we use obstacks, we must process these in precise order. */ - t->next = pending_inlines; - pending_inlines = t; -} - -void -reinit_parse_for_method (yychar, decl) - int yychar; - tree decl; -{ - int len; - int starting_lineno = lineno; - char *starting_filename = input_filename; - - reinit_parse_for_block (yychar, &inline_text_obstack); - - len = obstack_object_size (&inline_text_obstack); - current_base_init_list = NULL_TREE; - current_member_init_list = NULL_TREE; - if (decl == void_type_node - || (current_class_type && TYPE_REDEFINED (current_class_type))) - { - /* Happens when we get two declarations of the same - function in the same scope. */ - char *buf = obstack_finish (&inline_text_obstack); - obstack_free (&inline_text_obstack, buf); - return; - } - else - { - struct pending_inline *t; - char *buf = obstack_finish (&inline_text_obstack); - - t = (struct pending_inline *) obstack_alloc (&inline_text_obstack, - sizeof (struct pending_inline)); - t->lineno = starting_lineno; - t->filename = starting_filename; - t->token = YYEMPTY; - t->token_value = 0; - t->buf = buf; - t->len = len; - t->deja_vu = 0; -#if 0 - if (interface_unknown && processing_template_defn && flag_external_templates && ! DECL_IN_SYSTEM_HEADER (decl)) - warn_if_unknown_interface (decl); -#endif - t->interface = (interface_unknown ? 1 : (interface_only ? 0 : 2)); - store_pending_inline (decl, t); - } -} - -/* Consume a block -- actually, a method beginning - with `:' or `{' -- and save it away on the specified obstack. */ - -void -reinit_parse_for_block (pyychar, obstackp) - int pyychar; - struct obstack *obstackp; -{ - register int c = 0; - int blev = 1; - int starting_lineno = lineno; - char *starting_filename = input_filename; - int len; - int look_for_semicolon = 0; - int look_for_lbrac = 0; - - if (pyychar == '{') - obstack_1grow (obstackp, '{'); - else if (pyychar == '=') - look_for_semicolon = 1; - else if (pyychar == ':') - { - obstack_1grow (obstackp, pyychar); - /* Add a space so we don't get confused by ': ::A(20)'. */ - obstack_1grow (obstackp, ' '); - look_for_lbrac = 1; - blev = 0; - } - else if (pyychar == RETURN) - { - obstack_grow (obstackp, "return", 6); - look_for_lbrac = 1; - blev = 0; - } - else if (pyychar == TRY) - { - obstack_grow (obstackp, "try", 3); - look_for_lbrac = 1; - blev = 0; - } - else - { - yyerror ("parse error in method specification"); - obstack_1grow (obstackp, '{'); - } - - if (nextchar != EOF) - { - c = nextchar; - nextchar = EOF; - } - else - c = getch (); - - while (c != EOF) - { - int this_lineno = lineno; - - c = skip_white_space (c); - - /* Don't lose our cool if there are lots of comments. */ - if (lineno == this_lineno + 1) - obstack_1grow (obstackp, '\n'); - else if (lineno == this_lineno) - ; - else if (lineno - this_lineno < 10) - { - int i; - for (i = lineno - this_lineno; i > 0; i--) - obstack_1grow (obstackp, '\n'); - } - else - { - char buf[16]; - sprintf (buf, "\n# %d \"", lineno); - len = strlen (buf); - obstack_grow (obstackp, buf, len); - - len = strlen (input_filename); - obstack_grow (obstackp, input_filename, len); - obstack_1grow (obstackp, '\"'); - obstack_1grow (obstackp, '\n'); - } - - while (c > ' ') /* ASCII dependent... */ - { - obstack_1grow (obstackp, c); - if (c == '{') - { - look_for_lbrac = 0; - blev++; - } - else if (c == '}') - { - blev--; - if (blev == 0 && !look_for_semicolon) - { - if (pyychar == TRY) - { - if (peekyylex () == CATCH) - { - yylex (); - obstack_grow (obstackp, " catch ", 7); - look_for_lbrac = 1; - } - else - { - yychar = '{'; - goto done; - } - } - else - { - goto done; - } - } - } - else if (c == '\\') - { - /* Don't act on the next character...e.g, doing an escaped - double-quote. */ - c = getch (); - if (c == EOF) - { - error_with_file_and_line (starting_filename, - starting_lineno, - "end of file read inside definition"); - goto done; - } - obstack_1grow (obstackp, c); - } - else if (c == '\"') - consume_string (obstackp, c); - else if (c == '\'') - consume_string (obstackp, c); - else if (c == ';') - { - if (look_for_lbrac) - { - error ("function body for constructor missing"); - obstack_1grow (obstackp, '{'); - obstack_1grow (obstackp, '}'); - len += 2; - goto done; - } - else if (look_for_semicolon && blev == 0) - goto done; - } - c = getch (); - } - - if (c == EOF) - { - error_with_file_and_line (starting_filename, - starting_lineno, - "end of file read inside definition"); - goto done; - } - else if (c != '\n') - { - obstack_1grow (obstackp, c); - c = getch (); - } - } - done: - obstack_1grow (obstackp, '\0'); -} - -/* Consume a no-commas expression -- actually, a default argument -- and - save it away on the specified obstack. */ - -static void -reinit_parse_for_expr (obstackp) - struct obstack *obstackp; -{ - register int c = 0; - int starting_lineno = lineno; - char *starting_filename = input_filename; - int len; - int plev = 0; - - if (nextchar != EOF) - { - c = nextchar; - nextchar = EOF; - } - else - c = getch (); - - while (c != EOF) - { - int this_lineno = lineno; - - c = skip_white_space (c); - - /* Don't lose our cool if there are lots of comments. */ - if (lineno == this_lineno + 1) - obstack_1grow (obstackp, '\n'); - else if (lineno == this_lineno) - ; - else if (lineno - this_lineno < 10) - { - int i; - for (i = lineno - this_lineno; i > 0; --i) - obstack_1grow (obstackp, '\n'); - } - else - { - char buf[16]; - sprintf (buf, "\n# %d \"", lineno); - len = strlen (buf); - obstack_grow (obstackp, buf, len); - - len = strlen (input_filename); - obstack_grow (obstackp, input_filename, len); - obstack_1grow (obstackp, '\"'); - obstack_1grow (obstackp, '\n'); - } - - while (c > ' ') /* ASCII dependent... */ - { - if (plev <= 0 && (c == ')' || c == ',')) - { - put_back (c); - goto done; - } - obstack_1grow (obstackp, c); - if (c == '(' || c == '[') - ++plev; - else if (c == ']' || c == ')') - --plev; - else if (c == '\\') - { - /* Don't act on the next character...e.g, doing an escaped - double-quote. */ - c = getch (); - if (c == EOF) - { - error_with_file_and_line (starting_filename, - starting_lineno, - "end of file read inside definition"); - goto done; - } - obstack_1grow (obstackp, c); - } - else if (c == '\"') - consume_string (obstackp, c); - else if (c == '\'') - consume_string (obstackp, c); - c = getch (); - } - - if (c == EOF) - { - error_with_file_and_line (starting_filename, - starting_lineno, - "end of file read inside definition"); - goto done; - } - else if (c != '\n') - { - obstack_1grow (obstackp, c); - c = getch (); - } - } - done: - obstack_1grow (obstackp, '\0'); -} - -int do_snarf_defarg; - -/* Decide whether the default argument we are about to see should be - gobbled up as text for later parsing. */ - -void -maybe_snarf_defarg () -{ - if (current_class_type && TYPE_BEING_DEFINED (current_class_type)) - do_snarf_defarg = 1; -} - -/* When we see a default argument in a method declaration, we snarf it as - text using snarf_defarg. When we get up to namespace scope, we then go - through and parse all of them using do_pending_defargs. Since yacc - parsers are not reentrant, we retain defargs state in these two - variables so that subsequent calls to do_pending_defargs can resume - where the previous call left off. */ - -tree defarg_fns; -tree defarg_parm; - -tree -snarf_defarg () -{ - int len; - char *buf; - tree arg; - - reinit_parse_for_expr (&inline_text_obstack); - len = obstack_object_size (&inline_text_obstack); - buf = obstack_finish (&inline_text_obstack); - - push_obstacks (&inline_text_obstack, &inline_text_obstack); - arg = make_node (DEFAULT_ARG); - DEFARG_LENGTH (arg) = len - 1; - DEFARG_POINTER (arg) = buf; - pop_obstacks (); - - return arg; -} - -/* Called from grokfndecl to note a function decl with unparsed default - arguments for later processing. Also called from grokdeclarator - for function types with unparsed defargs; the call from grokfndecl - will always come second, so we can overwrite the entry from the type. */ - -void -add_defarg_fn (decl) - tree decl; -{ - if (TREE_CODE (decl) == FUNCTION_DECL) - TREE_VALUE (defarg_fns) = decl; - else - { - push_obstacks (&inline_text_obstack, &inline_text_obstack); - defarg_fns = tree_cons (current_class_type, decl, defarg_fns); - pop_obstacks (); - } -} - -/* Helper for do_pending_defargs. Starts the parsing of a default arg. */ - -static void -feed_defarg (f, p) - tree f, p; -{ - tree d = TREE_PURPOSE (p); - feed_input (DEFARG_POINTER (d), DEFARG_LENGTH (d)); - if (TREE_CODE (f) == FUNCTION_DECL) - { - lineno = DECL_SOURCE_LINE (f); - input_filename = DECL_SOURCE_FILE (f); - } - yychar = DEFARG_MARKER; - yylval.ttype = p; -} - -/* Helper for do_pending_defargs. Ends the parsing of a default arg. */ - -static void -finish_defarg () -{ - if (yychar == YYEMPTY) - yychar = yylex (); - if (yychar != END_OF_SAVED_INPUT) - { - error ("parse error at end of saved function text"); - - /* restore_pending_input will abort unless yychar is either - END_OF_SAVED_INPUT or YYEMPTY; since we already know we're - hosed, feed back YYEMPTY. We also need to discard nextchar, - since that may have gotten set as well. */ - nextchar = -1; - } - yychar = YYEMPTY; - end_input (); -} - -/* Main function for deferred parsing of default arguments. Called from - the parser. */ - -void -do_pending_defargs () -{ - if (defarg_parm) - finish_defarg (); - - for (; defarg_fns; defarg_fns = TREE_CHAIN (defarg_fns)) - { - tree defarg_fn = TREE_VALUE (defarg_fns); - if (defarg_parm == NULL_TREE) - { - push_nested_class (TREE_PURPOSE (defarg_fns), 1); - pushlevel (0); - if (TREE_CODE (defarg_fn) == FUNCTION_DECL) - maybe_begin_member_template_processing (defarg_fn); - - if (TREE_CODE (defarg_fn) == FUNCTION_DECL) - { -#if 0 - tree p; - for (p = DECL_ARGUMENTS (defarg_fn); p; p = TREE_CHAIN (p)) - pushdecl (copy_node (p)); -#endif - defarg_parm = TYPE_ARG_TYPES (TREE_TYPE (defarg_fn)); - } - else - defarg_parm = TYPE_ARG_TYPES (defarg_fn); - } - else - defarg_parm = TREE_CHAIN (defarg_parm); - - for (; defarg_parm; defarg_parm = TREE_CHAIN (defarg_parm)) - if (TREE_PURPOSE (defarg_parm) - && TREE_CODE (TREE_PURPOSE (defarg_parm)) == DEFAULT_ARG) - { - feed_defarg (defarg_fn, defarg_parm); - - /* Return to the parser, which will process this defarg - and call us again. */ - return; - } - - if (TREE_CODE (defarg_fn) == FUNCTION_DECL) - { - maybe_end_member_template_processing (); - check_default_args (defarg_fn); - } - - poplevel (0, 0, 0); - pop_nested_class (1); - } -} - -/* Build a default function named NAME for type TYPE. - KIND says what to build. - - When KIND == 0, build default destructor. - When KIND == 1, build virtual destructor. - When KIND == 2, build default constructor. - When KIND == 3, build default X(const X&) constructor. - When KIND == 4, build default X(X&) constructor. - When KIND == 5, build default operator = (const X&). - When KIND == 6, build default operator = (X&). */ - -tree -cons_up_default_function (type, full_name, kind) - tree type, full_name; - int kind; -{ - extern tree void_list_node; - tree declspecs = NULL_TREE; - tree fn, args = NULL_TREE; - tree argtype; - int retref = 0; - tree name = constructor_name (full_name); - - switch (kind) - { - /* Destructors. */ - case 1: - declspecs = build_decl_list (NULL_TREE, ridpointers [(int) RID_VIRTUAL]); - /* Fall through... */ - case 0: - name = build_parse_node (BIT_NOT_EXPR, name); - args = void_list_node; - break; - - case 2: - /* Default constructor. */ - args = void_list_node; - break; - - case 3: - type = build_qualified_type (type, TYPE_QUAL_CONST); - /* Fall through... */ - case 4: - /* According to ARM $12.8, the default copy ctor will be declared, but - not defined, unless it's needed. */ - argtype = build_reference_type (type); - args = tree_cons (NULL_TREE, - build_tree_list (hash_tree_chain (argtype, NULL_TREE), - get_identifier ("_ctor_arg")), - void_list_node); - break; - - case 5: - case 6: - retref = 1; - declspecs = build_decl_list (NULL_TREE, type); - - if (kind == 5) - type = build_qualified_type (type, TYPE_QUAL_CONST); - - name = ansi_opname [(int) MODIFY_EXPR]; - - argtype = build_reference_type (type); - args = tree_cons (NULL_TREE, - build_tree_list (hash_tree_chain (argtype, NULL_TREE), - get_identifier ("_ctor_arg")), - void_list_node); - break; - - default: - my_friendly_abort (59); - } - - declspecs = decl_tree_cons (NULL_TREE, ridpointers [(int) RID_INLINE], - declspecs); - - TREE_PARMLIST (args) = 1; - - { - tree declarator = make_call_declarator (name, args, NULL_TREE, NULL_TREE); - if (retref) - declarator = build_parse_node (ADDR_EXPR, declarator); - - fn = grokfield (declarator, declspecs, NULL_TREE, NULL_TREE, NULL_TREE); - } - - if (fn == void_type_node) - return fn; - - if (kind > 2) - SET_DECL_ARTIFICIAL (TREE_CHAIN (DECL_ARGUMENTS (fn))); - -#if 0 - if (processing_template_defn) - { - SET_DECL_IMPLICIT_INSTANTIATION (fn); - repo_template_used (fn); - } -#endif - -#if 0 - if (CLASSTYPE_INTERFACE_KNOWN (type)) - { - DECL_INTERFACE_KNOWN (fn) = 1; - DECL_NOT_REALLY_EXTERN (fn) = (!CLASSTYPE_INTERFACE_ONLY (type) - && flag_implement_inlines); - } - else -#endif - DECL_NOT_REALLY_EXTERN (fn) = 1; - - mark_inline_for_output (fn); - -#ifdef DEBUG_DEFAULT_FUNCTIONS - { char *fn_type = NULL; - tree t = name; - switch (kind) - { - case 0: fn_type = "default destructor"; break; - case 1: fn_type = "virtual destructor"; break; - case 2: fn_type = "default constructor"; break; - case 3: fn_type = "default X(const X&)"; break; - case 4: fn_type = "default X(X&)"; break; - } - if (fn_type) - { - if (TREE_CODE (name) == BIT_NOT_EXPR) - t = TREE_OPERAND (name, 0); - fprintf (stderr, "[[[[ %s for %s:\n%s]]]]\n", fn_type, - IDENTIFIER_POINTER (t), func_buf); - } - } -#endif /* DEBUG_DEFAULT_FUNCTIONS */ - - /* Show that this function was generated by the compiler. */ - SET_DECL_ARTIFICIAL (fn); - - return fn; -} - -/* Heuristic to tell whether the user is missing a semicolon - after a struct or enum declaration. Emit an error message - if we know the user has blown it. */ - -void -check_for_missing_semicolon (type) - tree type; -{ - if (yychar < 0) - yychar = yylex (); - - if ((yychar > 255 - && yychar != SCSPEC - && yychar != IDENTIFIER - && yychar != TYPENAME - && yychar != CV_QUALIFIER - && yychar != SELFNAME) - || end_of_file) - { - if (ANON_AGGRNAME_P (TYPE_IDENTIFIER (type))) - error ("semicolon missing after %s declaration", - TREE_CODE (type) == ENUMERAL_TYPE ? "enum" : "struct"); - else - cp_error ("semicolon missing after declaration of `%T'", type); - shadow_tag (build_tree_list (0, type)); - } - /* Could probably also hack cases where class { ... } f (); appears. */ - clear_anon_tags (); -} - -void -note_got_semicolon (type) - tree type; -{ - if (TREE_CODE_CLASS (TREE_CODE (type)) != 't') - my_friendly_abort (60); - if (CLASS_TYPE_P (type)) - CLASSTYPE_GOT_SEMICOLON (type) = 1; -} - -void -note_list_got_semicolon (declspecs) - tree declspecs; -{ - tree link; - - for (link = declspecs; link; link = TREE_CHAIN (link)) - { - tree type = TREE_VALUE (link); - if (TREE_CODE_CLASS (TREE_CODE (type)) == 't') - note_got_semicolon (type); - } - clear_anon_tags (); -} - -/* If C is not whitespace, return C. - Otherwise skip whitespace and return first nonwhite char read. */ - -static int -skip_white_space (c) - register int c; -{ - for (;;) - { - switch (c) - { - case '\n': - c = check_newline (); - break; - - case ' ': - case '\t': - case '\f': - case '\r': - case '\v': - case '\b': - do - c = getch (); - while (c == ' ' || c == '\t'); - break; - - case '\\': - c = getch (); - if (c == '\n') - lineno++; - else - error ("stray '\\' in program"); - c = getch (); - break; - - default: - return (c); - } - } -} - - - -/* Make the token buffer longer, preserving the data in it. - P should point to just beyond the last valid character in the old buffer. - The value we return is a pointer to the new buffer - at a place corresponding to P. */ - -static char * -extend_token_buffer (p) - char *p; -{ - int offset = p - token_buffer; - - maxtoken = maxtoken * 2 + 10; - token_buffer = (char *) xrealloc (token_buffer, maxtoken + 2); - - return token_buffer + offset; -} - -static int -get_last_nonwhite_on_line () -{ - register int c; - - /* Is this the last nonwhite stuff on the line? */ - if (nextchar >= 0) - c = nextchar, nextchar = -1; - else - c = getch (); - - while (c == ' ' || c == '\t') - c = getch (); - return c; -} - -#if defined HANDLE_PRAGMA -/* Local versions of these macros, that can be passed as function pointers. */ -static int -pragma_getc () -{ - int c; - - if (nextchar != EOF) - { - c = nextchar; - nextchar = EOF; - } - else - c = getch (); - - return c; -} - -static void -pragma_ungetc (arg) - int arg; -{ - yyungetc (arg, 0); -} -#endif /* HANDLE_PRAGMA */ - -/* At the beginning of a line, increment the line number - and process any #-directive on this line. - If the line is a #-directive, read the entire line and return a newline. - Otherwise, return the line's first non-whitespace character. */ - -int linemode; - -static int handle_cp_pragma PROTO((char *)); - -static int -check_newline () -{ - register int c; - register int token; - int saw_line = 0; - - /* Read first nonwhite char on the line. Do this before incrementing the - line number, in case we're at the end of saved text. */ - - do - c = getch (); - while (c == ' ' || c == '\t'); - - lineno++; - - if (c != '#') - { - /* If not #, return it so caller will use it. */ - return c; - } - - /* Don't read beyond this line. */ - linemode = 1; - - /* Read first nonwhite char after the `#'. */ - - do - c = getch (); - while (c == ' ' || c == '\t'); - - /* If a letter follows, then if the word here is `line', skip - it and ignore it; otherwise, ignore the line, with an error - if the word isn't `pragma'. */ - - if (ISALPHA (c)) - { - if (c == 'p') - { - if (getch () == 'r' - && getch () == 'a' - && getch () == 'g' - && getch () == 'm' - && getch () == 'a') - { - token = real_yylex (); - if (token == IDENTIFIER - && TREE_CODE (yylval.ttype) == IDENTIFIER_NODE) - { - /* If this is 1, we handled it; if it's -1, it was one we - wanted but had something wrong with it. Only if it's - 0 was it not handled. */ - if (handle_cp_pragma (IDENTIFIER_POINTER (yylval.ttype))) - goto skipline; - } - else if (token == END_OF_LINE) - goto skipline; - -#ifdef HANDLE_PRAGMA - /* We invoke HANDLE_PRAGMA before HANDLE_GENERIC_PRAGMAS - (if both are defined), in order to give the back - end a chance to override the interpretation of - SYSV style pragmas. */ - if (HANDLE_PRAGMA (pragma_getc, pragma_ungetc, - IDENTIFIER_POINTER (yylval.ttype))) - goto skipline; -#endif /* HANDLE_PRAGMA */ - -#ifdef HANDLE_GENERIC_PRAGMAS - if (handle_generic_pragma (token)) - goto skipline; -#endif /* HANDLE_GENERIC_PRAGMAS */ - - /* Issue a warning message if we have been asked to do so. - Ignoring unknown pragmas in system header file unless - an explcit -Wunknown-pragmas has been given. */ - if (warn_unknown_pragmas > 1 - || (warn_unknown_pragmas && ! in_system_header)) - warning ("ignoring pragma: %s", token_buffer); - } - - goto skipline; - } - else if (c == 'd') - { - if (getch () == 'e' - && getch () == 'f' - && getch () == 'i' - && getch () == 'n' - && getch () == 'e' - && ((c = getch ()) == ' ' || c == '\t')) - { - debug_define (lineno, GET_DIRECTIVE_LINE ()); - goto skipline; - } - } - else if (c == 'u') - { - if (getch () == 'n' - && getch () == 'd' - && getch () == 'e' - && getch () == 'f' - && ((c = getch ()) == ' ' || c == '\t')) - { - debug_undef (lineno, GET_DIRECTIVE_LINE ()); - goto skipline; - } - } - else if (c == 'l') - { - if (getch () == 'i' - && getch () == 'n' - && getch () == 'e' - && ((c = getch ()) == ' ' || c == '\t')) - { - saw_line = 1; - goto linenum; - } - } - else if (c == 'i') - { - if (getch () == 'd' - && getch () == 'e' - && getch () == 'n' - && getch () == 't' - && ((c = getch ()) == ' ' || c == '\t')) - { - /* #ident. The pedantic warning is now in cccp.c. */ - - /* Here we have just seen `#ident '. - A string constant should follow. */ - - token = real_yylex (); - if (token == END_OF_LINE) - goto skipline; - if (token != STRING - || TREE_CODE (yylval.ttype) != STRING_CST) - { - error ("invalid #ident"); - goto skipline; - } - - if (! flag_no_ident) - { -#ifdef ASM_OUTPUT_IDENT - ASM_OUTPUT_IDENT (asm_out_file, - TREE_STRING_POINTER (yylval.ttype)); -#endif - } - - /* Skip the rest of this line. */ - goto skipline; - } - } - else if (c == 'n') - { - if (getch () == 'e' - && getch () == 'w' - && getch () == 'w' - && getch () == 'o' - && getch () == 'r' - && getch () == 'l' - && getch () == 'd' - && ((c = getch ()) == ' ' || c == '\t')) - { - /* Used to test incremental compilation. */ - sorry ("#pragma newworld"); - goto skipline; - } - } - error ("undefined or invalid # directive"); - goto skipline; - } - -linenum: - /* Here we have either `#line' or `# '. - In either case, it should be a line number; a digit should follow. */ - - while (c == ' ' || c == '\t') - c = getch (); - - /* If the # is the only nonwhite char on the line, - just ignore it. Check the new newline. */ - if (c == EOF) - goto skipline; - - /* Something follows the #; read a token. */ - - put_back (c); - token = real_yylex (); - - if (token == CONSTANT - && TREE_CODE (yylval.ttype) == INTEGER_CST) - { - int old_lineno = lineno; - enum { act_none, act_push, act_pop } action = act_none; - int entering_system_header = 0; - int entering_c_header = 0; - - /* subtract one, because it is the following line that - gets the specified number */ - - int l = TREE_INT_CST_LOW (yylval.ttype) - 1; - c = get_last_nonwhite_on_line (); - if (c == EOF) - { - /* No more: store the line number and check following line. */ - lineno = l; - goto skipline; - } - put_back (c); - - /* More follows: it must be a string constant (filename). */ - - if (saw_line) - { - /* Don't treat \ as special if we are processing #line 1 "...". - If you want it to be treated specially, use # 1 "...". */ - ignore_escape_flag = 1; - } - - /* Read the string constant. */ - token = real_yylex (); - - ignore_escape_flag = 0; - - if (token != STRING || TREE_CODE (yylval.ttype) != STRING_CST) - { - error ("invalid #line"); - goto skipline; - } - - /* Changing files again. This means currently collected time - is charged against header time, and body time starts back - at 0. */ - if (flag_detailed_statistics) - { - int this_time = my_get_run_time (); - tree time_identifier = get_time_identifier (TREE_STRING_POINTER (yylval.ttype)); - header_time += this_time - body_time; - TREE_INT_CST_LOW (TIME_IDENTIFIER_TIME (this_filename_time)) - += this_time - body_time; - this_filename_time = time_identifier; - body_time = this_time; - } - - input_filename - = (char *) permalloc (TREE_STRING_LENGTH (yylval.ttype) + 1); - strcpy (input_filename, TREE_STRING_POINTER (yylval.ttype)); - lineno = l; - GNU_xref_file (input_filename); - - if (main_input_filename == 0) - { - struct impl_files *ifiles = impl_file_chain; - - if (ifiles) - { - while (ifiles->next) - ifiles = ifiles->next; - ifiles->filename = file_name_nondirectory (input_filename); - } - - main_input_filename = input_filename; - if (write_virtuals == 3) - walk_vtables (set_typedecl_interface_info, set_vardecl_interface_info); - } - - extract_interface_info (); - - c = get_last_nonwhite_on_line (); - if (c == EOF) - { - /* Update the name in the top element of input_file_stack. */ - if (input_file_stack) - input_file_stack->name = input_filename; - } - else - { - put_back (c); - - token = real_yylex (); - - /* `1' after file name means entering new file. - `2' after file name means just left a file. */ - - if (token == CONSTANT - && TREE_CODE (yylval.ttype) == INTEGER_CST) - { - if (TREE_INT_CST_LOW (yylval.ttype) == 1) - action = act_push; - else if (TREE_INT_CST_LOW (yylval.ttype) == 2) - action = act_pop; - - if (action) - { - c = get_last_nonwhite_on_line (); - if (c != EOF) - { - put_back (c); - token = real_yylex (); - } - } - } - - /* `3' after file name means this is a system header file. */ - - if (token == CONSTANT - && TREE_CODE (yylval.ttype) == INTEGER_CST - && TREE_INT_CST_LOW (yylval.ttype) == 3) - { - entering_system_header = 1; - - c = get_last_nonwhite_on_line (); - if (c != EOF) - { - put_back (c); - token = real_yylex (); - } - } - - /* `4' after file name means this is a C header file. */ - - if (token == CONSTANT - && TREE_CODE (yylval.ttype) == INTEGER_CST - && TREE_INT_CST_LOW (yylval.ttype) == 4) - { - entering_c_header = 1; - - c = get_last_nonwhite_on_line (); - if (c != EOF) - { - put_back (c); - token = real_yylex (); - } - } - - /* Do the actions implied by the preceding numbers. */ - - if (action == act_push) - { - /* Pushing to a new file. */ - struct file_stack *p; - - p = (struct file_stack *) xmalloc (sizeof (struct file_stack)); - input_file_stack->line = old_lineno; - p->next = input_file_stack; - p->name = input_filename; - input_file_stack = p; - input_file_stack_tick++; - debug_start_source_file (input_filename); - in_system_header = entering_system_header; - if (c_header_level) - ++c_header_level; - else if (entering_c_header) - { - c_header_level = 1; - ++pending_lang_change; - } - } - else if (action == act_pop) - { - /* Popping out of a file. */ - if (input_file_stack->next) - { - struct file_stack *p; - - if (c_header_level && --c_header_level == 0) - { - if (entering_c_header) - warning ("badly nested C headers from preprocessor"); - --pending_lang_change; - } - in_system_header = entering_system_header; - - p = input_file_stack; - input_file_stack = p->next; - free (p); - input_file_stack_tick++; - debug_end_source_file (input_file_stack->line); - } - else - error ("#-lines for entering and leaving files don't match"); - } - else - in_system_header = entering_system_header; - } - - /* If NEXTCHAR is not end of line, we don't care what it is. */ - if (nextchar == EOF) - c = EOF; - } - else - error ("invalid #-line"); - - /* skip the rest of this line. */ - skipline: - linemode = 0; - end_of_file = 0; - nextchar = -1; - while ((c = getch ()) != EOF && c != '\n'); - return c; -} - -void -do_pending_lang_change () -{ - for (; pending_lang_change > 0; --pending_lang_change) - push_lang_context (lang_name_c); - for (; pending_lang_change < 0; ++pending_lang_change) - pop_lang_context (); -} - -#define ENDFILE -1 /* token that represents end-of-file */ - -/* Read an escape sequence, returning its equivalent as a character, - or store 1 in *ignore_ptr if it is backslash-newline. */ - -static int -readescape (ignore_ptr) - int *ignore_ptr; -{ - register int c = getch (); - register int code; - register unsigned count; - unsigned firstdig = 0; - int nonnull; - - switch (c) - { - case 'x': - code = 0; - count = 0; - nonnull = 0; - while (1) - { - c = getch (); - if (! ISXDIGIT (c)) - { - put_back (c); - break; - } - code *= 16; - if (c >= 'a' && c <= 'f') - code += c - 'a' + 10; - if (c >= 'A' && c <= 'F') - code += c - 'A' + 10; - if (c >= '0' && c <= '9') - code += c - '0'; - if (code != 0 || count != 0) - { - if (count == 0) - firstdig = code; - count++; - } - nonnull = 1; - } - if (! nonnull) - error ("\\x used with no following hex digits"); - else if (count == 0) - /* Digits are all 0's. Ok. */ - ; - else if ((count - 1) * 4 >= TYPE_PRECISION (integer_type_node) - || (count > 1 - && (((unsigned)1 << - (TYPE_PRECISION (integer_type_node) - (count - 1) * 4)) - <= firstdig))) - pedwarn ("hex escape out of range"); - return code; - - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': - code = 0; - count = 0; - while ((c <= '7') && (c >= '0') && (count++ < 3)) - { - code = (code * 8) + (c - '0'); - c = getch (); - } - put_back (c); - return code; - - case '\\': case '\'': case '"': - return c; - - case '\n': - lineno++; - *ignore_ptr = 1; - return 0; - - case 'n': - return TARGET_NEWLINE; - - case 't': - return TARGET_TAB; - - case 'r': - return TARGET_CR; - - case 'f': - return TARGET_FF; - - case 'b': - return TARGET_BS; - - case 'a': - return TARGET_BELL; - - case 'v': - return TARGET_VT; - - case 'e': - case 'E': - if (pedantic) - pedwarn ("non-ANSI-standard escape sequence, `\\%c'", c); - return 033; - - case '?': - return c; - - /* `\(', etc, are used at beginning of line to avoid confusing Emacs. */ - case '(': - case '{': - case '[': - /* `\%' is used to prevent SCCS from getting confused. */ - case '%': - if (pedantic) - pedwarn ("unknown escape sequence `\\%c'", c); - return c; - } - if (ISGRAPH (c)) - pedwarn ("unknown escape sequence `\\%c'", c); - else - pedwarn ("unknown escape sequence: `\\' followed by char code 0x%x", c); - return c; -} - -/* Value is 1 (or 2) if we should try to make the next identifier look like - a typename (when it may be a local variable or a class variable). - Value is 0 if we treat this name in a default fashion. */ -int looking_for_typename; - -#ifdef __GNUC__ -__inline -#endif -int -identifier_type (decl) - tree decl; -{ - tree t; - if (TREE_CODE (decl) == TEMPLATE_DECL) - { - if (TREE_CODE (DECL_RESULT (decl)) == TYPE_DECL) - return PTYPENAME; - else if (looking_for_template) - return PFUNCNAME; - } - if (looking_for_template && really_overloaded_fn (decl)) - { - /* See through a baselink. */ - if (TREE_CODE (decl) == TREE_LIST) - decl = TREE_VALUE (decl); - - for (t = decl; t != NULL_TREE; t = OVL_CHAIN (t)) - if (DECL_FUNCTION_TEMPLATE_P (OVL_FUNCTION (t))) - return PFUNCNAME; - } - if (TREE_CODE (decl) == NAMESPACE_DECL) - return NSNAME; - if (TREE_CODE (decl) != TYPE_DECL) - return IDENTIFIER; - if (DECL_ARTIFICIAL (decl) && TREE_TYPE (decl) == current_class_type) - return SELFNAME; - - /* A constructor declarator for a template type will get here as an - implicit typename, a TYPENAME_TYPE with a type. */ - t = got_scope; - if (t && TREE_CODE (t) == TYPENAME_TYPE) - t = TREE_TYPE (t); - decl = TREE_TYPE (decl); - if (TREE_CODE (decl) == TYPENAME_TYPE) - decl = TREE_TYPE (decl); - if (t && t == decl) - return SELFNAME; - - return TYPENAME; -} - -void -see_typename () -{ - /* Only types expected, not even namespaces. */ - looking_for_typename = 2; - if (yychar < 0) - if ((yychar = yylex ()) < 0) yychar = 0; - looking_for_typename = 0; - if (yychar == IDENTIFIER) - { - lastiddecl = lookup_name (yylval.ttype, -2); - if (lastiddecl == 0) - { - if (flag_labels_ok) - lastiddecl = IDENTIFIER_LABEL_VALUE (yylval.ttype); - } - else - yychar = identifier_type (lastiddecl); - } -} - -/* Return true if d is in a global scope. */ - -static int -is_global (d) - tree d; -{ - while (1) - switch (TREE_CODE (d)) - { - case ERROR_MARK: - return 1; - - case OVERLOAD: d = OVL_FUNCTION (d); continue; - case TREE_LIST: d = TREE_VALUE (d); continue; - default: - my_friendly_assert (TREE_CODE_CLASS (TREE_CODE (d)) == 'd', 980629); - d = CP_DECL_CONTEXT (d); - return TREE_CODE (d) == NAMESPACE_DECL; - } -} - -tree -do_identifier (token, parsing, args) - register tree token; - int parsing; - tree args; -{ - register tree id; - int lexing = (parsing == 1); - int in_call = (parsing == 2); - - if (! lexing || IDENTIFIER_OPNAME_P (token)) - id = lookup_name (token, 0); - else - id = lastiddecl; - - /* Scope class declarations before global - declarations. */ - if ((!id || is_global (id)) - && current_class_type != 0 - && TYPE_SIZE (current_class_type) == 0) - { - /* Could be from one of the base classes. */ - tree field = lookup_field (current_class_type, token, 1, 0); - if (field == 0) - ; - else if (field == error_mark_node) - /* We have already generated the error message. - But we still want to return this value. */ - id = lookup_field (current_class_type, token, 0, 0); - else if (TREE_CODE (field) == VAR_DECL - || TREE_CODE (field) == CONST_DECL - || TREE_CODE (field) == TEMPLATE_DECL) - id = field; - else if (TREE_CODE (field) != FIELD_DECL) - my_friendly_abort (61); - else - { - cp_error ("invalid use of member `%D'", field); - id = error_mark_node; - return id; - } - } - - /* Do Koenig lookup if appropriate (inside templates we build lookup - expressions instead). */ - if (args && !current_template_parms && (!id || is_global (id))) - /* If we have arguments and we only found global names, do Koenig - lookup. */ - id = lookup_arg_dependent (token, id, args); - - /* Remember that this name has been used in the class definition, as per - [class.scope0] */ - if (id && current_class_type && parsing - && TYPE_BEING_DEFINED (current_class_type) - && ! IDENTIFIER_CLASS_VALUE (token) - /* Avoid breaking if we get called for a default argument that - refers to an overloaded method. Eventually this will not be - necessary, since default arguments shouldn't be parsed until - after the class is complete. (jason 3/12/97) */ - && TREE_CODE (id) != OVERLOAD) - pushdecl_class_level (id); - - if (!id || id == error_mark_node) - { - if (id == error_mark_node && current_class_type != NULL_TREE) - { - id = lookup_nested_field (token, 1); - /* In lookup_nested_field(), we marked this so we can gracefully - leave this whole mess. */ - if (id && id != error_mark_node && TREE_TYPE (id) == error_mark_node) - return id; - } - - if (current_template_parms) - return build_min_nt (LOOKUP_EXPR, token); - else if (IDENTIFIER_OPNAME_P (token)) - { - if (token != ansi_opname[ERROR_MARK]) - cp_error ("`%D' not defined", token); - id = error_mark_node; - } - else if (in_call && ! flag_strict_prototype) - { - id = implicitly_declare (token); - } - else if (current_function_decl == 0) - { - cp_error ("`%D' was not declared in this scope", token); - id = error_mark_node; - } - else - { - if (IDENTIFIER_NAMESPACE_VALUE (token) != error_mark_node - || IDENTIFIER_ERROR_LOCUS (token) != current_function_decl) - { - static int undeclared_variable_notice; - - cp_error ("`%D' undeclared (first use this function)", token); - - if (! undeclared_variable_notice) - { - error ("(Each undeclared identifier is reported only once"); - error ("for each function it appears in.)"); - undeclared_variable_notice = 1; - } - } - id = error_mark_node; - /* Prevent repeated error messages. */ - SET_IDENTIFIER_NAMESPACE_VALUE (token, error_mark_node); - SET_IDENTIFIER_ERROR_LOCUS (token, current_function_decl); - } - } - - if (TREE_CODE (id) == VAR_DECL && DECL_DEAD_FOR_LOCAL (id)) - { - tree shadowed = DECL_SHADOWED_FOR_VAR (id); - while (shadowed != NULL_TREE && TREE_CODE (shadowed) == VAR_DECL - && DECL_DEAD_FOR_LOCAL (shadowed)) - shadowed = DECL_SHADOWED_FOR_VAR (shadowed); - if (!shadowed) - shadowed = IDENTIFIER_NAMESPACE_VALUE (DECL_NAME (id)); - if (shadowed) - { - if (!DECL_ERROR_REPORTED (id)) - { - warning ("name lookup of `%s' changed", - IDENTIFIER_POINTER (token)); - cp_warning_at (" matches this `%D' under current ANSI rules", - shadowed); - cp_warning_at (" matches this `%D' under old rules", id); - DECL_ERROR_REPORTED (id) = 1; - } - id = shadowed; - } - else if (!DECL_ERROR_REPORTED (id)) - { - static char msg[] - = "name lookup of `%s' changed for new ANSI `for' scoping"; - DECL_ERROR_REPORTED (id) = 1; - if (TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (id))) - { - error (msg, IDENTIFIER_POINTER (token)); - cp_error_at (" cannot use obsolete binding at `%D' because it has a destructor", id); - id = error_mark_node; - } - else - { - pedwarn (msg, IDENTIFIER_POINTER (token)); - cp_pedwarn_at (" using obsolete binding at `%D'", id); - } - } - } - /* TREE_USED is set in `hack_identifier'. */ - if (TREE_CODE (id) == CONST_DECL) - { - if (IDENTIFIER_CLASS_VALUE (token) == id) - { - /* Check access. */ - tree access = compute_access (TYPE_BINFO (current_class_type), id); - if (access == access_private_node) - cp_error ("enum `%D' is private", id); - /* protected is OK, since it's an enum of `this'. */ - } - if (!processing_template_decl || DECL_TEMPLATE_PARM_P (id)) - id = DECL_INITIAL (id); - } - else - id = hack_identifier (id, token); - - /* We must look up dependent names when the template is - instantiated, not while parsing it. For now, we don't - distinguish between dependent and independent names. So, for - example, we look up all overloaded functions at - instantiation-time, even though in some cases we should just use - the DECL we have here. We also use LOOKUP_EXPRs to find things - like local variables, rather than creating TEMPLATE_DECLs for the - local variables and then finding matching instantiations. */ - if (current_template_parms - && (is_overloaded_fn (id) - /* If it's not going to be around at instantiation time, we - look it up then. This is a hack, and should go when we - really get dependent/independent name lookup right. */ - || !TREE_PERMANENT (id) - /* Some local VAR_DECLs (such as those for local variables - in member functions of local classes) are built on the - permanent obstack. */ - || (TREE_CODE (id) == VAR_DECL - && CP_DECL_CONTEXT (id) - && TREE_CODE (CP_DECL_CONTEXT (id)) == FUNCTION_DECL) - || TREE_CODE (id) == PARM_DECL - || TREE_CODE (id) == RESULT_DECL - || TREE_CODE (id) == USING_DECL)) - id = build_min_nt (LOOKUP_EXPR, token); - - return id; -} - -tree -do_scoped_id (token, parsing) - tree token; - int parsing; -{ - tree id; - /* during parsing, this is ::name. Otherwise, it is black magic. */ - if (parsing) - { - struct tree_binding _b; - id = binding_init (&_b); - if (!qualified_lookup_using_namespace (token, global_namespace, id, 0)) - id = NULL_TREE; - else - id = BINDING_VALUE (id); - } - else - id = IDENTIFIER_GLOBAL_VALUE (token); - if (parsing && yychar == YYEMPTY) - yychar = yylex (); - if (! id) - { - if (processing_template_decl) - { - id = build_min_nt (LOOKUP_EXPR, token); - LOOKUP_EXPR_GLOBAL (id) = 1; - return id; - } - if (parsing && (yychar == '(' || yychar == LEFT_RIGHT) - && ! flag_strict_prototype) - id = implicitly_declare (token); - else - { - if (IDENTIFIER_NAMESPACE_VALUE (token) != error_mark_node) - cp_error ("`::%D' undeclared (first use here)", token); - id = error_mark_node; - /* Prevent repeated error messages. */ - SET_IDENTIFIER_NAMESPACE_VALUE (token, error_mark_node); - } - } - else - { - if (TREE_CODE (id) == ADDR_EXPR) - mark_used (TREE_OPERAND (id, 0)); - else if (TREE_CODE (id) != OVERLOAD) - mark_used (id); - } - if (TREE_CODE (id) == CONST_DECL && ! processing_template_decl) - { - /* XXX CHS - should we set TREE_USED of the constant? */ - id = DECL_INITIAL (id); - /* This is to prevent an enum whose value is 0 - from being considered a null pointer constant. */ - id = build1 (NOP_EXPR, TREE_TYPE (id), id); - TREE_CONSTANT (id) = 1; - } - - if (processing_template_decl) - { - if (is_overloaded_fn (id)) - { - id = build_min_nt (LOOKUP_EXPR, token); - LOOKUP_EXPR_GLOBAL (id) = 1; - return id; - } - /* else just use the decl */ - } - return convert_from_reference (id); -} - -tree -identifier_typedecl_value (node) - tree node; -{ - tree t, type; - type = IDENTIFIER_TYPE_VALUE (node); - if (type == NULL_TREE) - return NULL_TREE; - - if (IDENTIFIER_BINDING (node)) - { - t = IDENTIFIER_VALUE (node); - if (t && TREE_CODE (t) == TYPE_DECL && TREE_TYPE (t) == type) - return t; - } - if (IDENTIFIER_NAMESPACE_VALUE (node)) - { - t = IDENTIFIER_NAMESPACE_VALUE (node); - if (t && TREE_CODE (t) == TYPE_DECL && TREE_TYPE (t) == type) - return t; - } - - /* Will this one ever happen? */ - if (TYPE_MAIN_DECL (type)) - return TYPE_MAIN_DECL (type); - - /* We used to do an internal error of 62 here, but instead we will - handle the return of a null appropriately in the callers. */ - return NULL_TREE; -} - -/* CYGNUS LOCAL Embedded C++ */ - -static inline void -embedded_pedwarn (s) - char *s; -{ - pedwarn ("Embedded C++ prohibits use of %s", s); -} -/* END CYGNUS LOCAL Embedded C++ */ - -int -real_yylex () -{ - register int c; - register int value; - int wide_flag = 0; - int dollar_seen = 0; - int i; - - if (nextchar >= 0) - c = nextchar, nextchar = -1; - else - c = getch (); - - /* Effectively do c = skip_white_space (c) - but do it faster in the usual cases. */ - while (1) - switch (c) - { - case ' ': - case '\t': - case '\f': - case '\v': - case '\b': - c = getch (); - break; - - case '\r': - /* Call skip_white_space so we can warn if appropriate. */ - - case '\n': - case '/': - case '\\': - c = skip_white_space (c); - default: - goto found_nonwhite; - } - found_nonwhite: - - token_buffer[0] = c; - token_buffer[1] = 0; - -/* yylloc.first_line = lineno; */ - - switch (c) - { - case EOF: - token_buffer[0] = '\0'; - end_of_file = 1; - if (input_redirected ()) - value = END_OF_SAVED_INPUT; - else if (linemode) - value = END_OF_LINE; - else - value = ENDFILE; - break; - - case '$': - if (! dollars_in_ident) - error ("`$' in identifier"); - else if (pedantic) - pedwarn ("`$' in identifier"); - dollar_seen = 1; - goto letter; - - case 'L': - /* Capital L may start a wide-string or wide-character constant. */ - { - register int c = getch (); - if (c == '\'') - { - wide_flag = 1; - goto char_constant; - } - if (c == '"') - { - wide_flag = 1; - goto string_constant; - } - put_back (c); - } - - case 'A': case 'B': case 'C': case 'D': case 'E': - case 'F': case 'G': case 'H': case 'I': case 'J': - case 'K': case 'M': case 'N': case 'O': - case 'P': case 'Q': case 'R': case 'S': case 'T': - case 'U': case 'V': case 'W': case 'X': case 'Y': - case 'Z': - case 'a': case 'b': case 'c': case 'd': case 'e': - case 'f': case 'g': case 'h': case 'i': case 'j': - case 'k': case 'l': case 'm': case 'n': case 'o': - case 'p': case 'q': case 'r': case 's': case 't': - case 'u': case 'v': case 'w': case 'x': case 'y': - case 'z': - case '_': - letter: - { - register char *p; - - p = token_buffer; - if (input == 0) - { - /* We know that `token_buffer' can hold at least on char, - so we install C immediately. - We may have to read the value in `putback_char', so call - `getch' once. */ - *p++ = c; - c = getch (); - - /* Make this run fast. We know that we are reading straight - from FINPUT in this case (since identifiers cannot straddle - input sources. */ - while (ISALNUM (c) || (c == '_') || c == '$') - { - if (c == '$') - { - if (! dollars_in_ident) - error ("`$' in identifier"); - else if (pedantic) - pedwarn ("`$' in identifier"); - } - - if (p >= token_buffer + maxtoken) - p = extend_token_buffer (p); - - *p++ = c; - c = getch (); - } - - if (linemode && c == '\n') - { - put_back (c); - c = EOF; - } - } - else - { - /* We know that `token_buffer' can hold at least on char, - so we install C immediately. */ - *p++ = c; - c = getch (); - - while (ISALNUM (c) || (c == '_') || c == '$') - { - if (c == '$') - { - if (! dollars_in_ident) - error ("`$' in identifier"); - else if (pedantic) - pedwarn ("`$' in identifier"); - } - - if (p >= token_buffer + maxtoken) - p = extend_token_buffer (p); - - *p++ = c; - c = getch (); - } - } - - *p = 0; - nextchar = c; - - value = IDENTIFIER; - yylval.itype = 0; - - /* Try to recognize a keyword. Uses minimum-perfect hash function */ - - { - register struct resword *ptr; - - if ((ptr = is_reserved_word (token_buffer, p - token_buffer))) - { - if (ptr->rid) - { - tree old_ttype = ridpointers[(int) ptr->rid]; - - /* If this provides a type for us, then revert lexical - state to standard state. */ - if (TREE_CODE (old_ttype) == IDENTIFIER_NODE - && IDENTIFIER_GLOBAL_VALUE (old_ttype) != 0 - && TREE_CODE (IDENTIFIER_GLOBAL_VALUE (old_ttype)) == TYPE_DECL) - looking_for_typename = 0; - else if (ptr->token == AGGR || ptr->token == ENUM) - looking_for_typename = 2; - - /* Check if this is a language-type declaration. - Just glimpse the next non-white character. */ - nextchar = skip_white_space (nextchar); - if (nextchar == '"') - { - /* We are looking at a string. Complain - if the token before the string is no `extern'. - - Could cheat some memory by placing this string - on the temporary_, instead of the saveable_ - obstack. */ - - if (ptr->rid != RID_EXTERN) - error ("invalid modifier `%s' for language string", - ptr->name); - real_yylex (); - value = EXTERN_LANG_STRING; - yylval.ttype = get_identifier (TREE_STRING_POINTER (yylval.ttype)); - break; - } - if (ptr->token == VISSPEC) - { - switch (ptr->rid) - { - case RID_PUBLIC: - yylval.ttype = access_public_node; - break; - case RID_PRIVATE: - yylval.ttype = access_private_node; - break; - case RID_PROTECTED: - yylval.ttype = access_protected_node; - break; - default: - my_friendly_abort (63); - } - } - else - yylval.ttype = old_ttype; - } - else if (ptr->token == EQCOMPARE) - { - yylval.code = NE_EXPR; - token_buffer[0] = '!'; - token_buffer[1] = '='; - token_buffer[2] = 0; - } - else if (ptr->token == ASSIGN) - { - if (strcmp ("and_eq", token_buffer) == 0) - { - yylval.code = BIT_AND_EXPR; - token_buffer[0] = '&'; - } - else if (strcmp ("or_eq", token_buffer) == 0) - { - yylval.code = BIT_IOR_EXPR; - token_buffer[0] = '|'; - } - else if (strcmp ("xor_eq", token_buffer) == 0) - { - yylval.code = BIT_XOR_EXPR; - token_buffer[0] = '^'; - } - token_buffer[1] = '='; - token_buffer[2] = 0; - } - else if (ptr->token == '&') - { - yylval.code = BIT_AND_EXPR; - token_buffer[0] = '&'; - token_buffer[1] = 0; - } - else if (ptr->token == '|') - { - yylval.code = BIT_IOR_EXPR; - token_buffer[0] = '|'; - token_buffer[1] = 0; - } - else if (ptr->token == '^') - { - yylval.code = BIT_XOR_EXPR; - token_buffer[0] = '^'; - token_buffer[1] = 0; - } - - value = (int) ptr->token; - } - } - - /* If we did not find a keyword, look for an identifier - (or a typename). */ - - if (value == IDENTIFIER || value == TYPESPEC) - GNU_xref_ref (current_function_decl, token_buffer); - - if (value == IDENTIFIER) - { - register tree tmp = get_identifier (token_buffer); - -#if !defined(VMS) && defined(JOINER) - /* Make sure that user does not collide with our internal - naming scheme. */ - if (JOINER == '$' - && dollar_seen - && (THIS_NAME_P (tmp) - || VPTR_NAME_P (tmp) - || DESTRUCTOR_NAME_P (tmp) - || VTABLE_NAME_P (tmp) - || TEMP_NAME_P (tmp) - || ANON_AGGRNAME_P (tmp) - || ANON_PARMNAME_P (tmp))) - warning ("identifier name `%s' conflicts with GNU C++ internal naming strategy", - token_buffer); -#endif - - yylval.ttype = tmp; - } - if (value == NEW && ! global_bindings_p ()) - { - value = NEW; - goto done; - } - } - -/* CYGNUS LOCAL Embedded C++ */ - if (flag_embedded_cxx) - { - if (value == USING || value == NAMESPACE) - { - if (! embedded_namespace_error) - { - embedded_namespace_error = 1; - embedded_pedwarn ("namespaces"); - } - else - pedwarn ("further uses of namespaces with Embedded C++ enabled"); - } - else if (value == TEMPLATE || value == TYPENAME) - { - if (! embedded_namespace_error) - { - embedded_namespace_error = 1; - embedded_pedwarn ("templates"); - } - else - pedwarn ("further uses of templates with Embedded C++ enabled"); - } - else if (value == CATCH || value == THROW || value == TRY) - { - if (! embedded_eh_error) - { - embedded_eh_error = 1; - embedded_pedwarn ("exception handling"); - } - else - pedwarn ("further uses of exception handling with Embedded C++ enabled"); - } - else if (value == DYNAMIC_CAST) - embedded_pedwarn ("dynamic_cast"); - else if (value == STATIC_CAST) - embedded_pedwarn ("static_cast"); - else if (value == REINTERPRET_CAST) - embedded_pedwarn ("reinterpret_cast"); - else if (value == CONST_CAST) - embedded_pedwarn ("const_cast"); - else if (value == TYPEID) - embedded_pedwarn ("typeid"); - } -/* END CYGNUS LOCAL Embedded C++ */ - - break; - - case '.': - { - register int c1 = getch (); - token_buffer[0] = c; - token_buffer[1] = c1; - if (c1 == '*') - { - value = DOT_STAR; - token_buffer[2] = 0; - goto done; - } - if (c1 == '.') - { - c1 = getch (); - if (c1 == '.') - { - token_buffer[2] = c1; - token_buffer[3] = 0; - value = ELLIPSIS; - goto done; - } - error ("parse error at `..'"); - } - if (ISDIGIT (c1)) - { - put_back (c1); - goto resume_numerical_scan; - } - nextchar = c1; - value = '.'; - token_buffer[1] = 0; - goto done; - } - case '0': case '1': - /* Optimize for most frequent case. */ - { - register int c1 = getch (); - if (! ISALNUM (c1) && c1 != '.') - { - /* Terminate string. */ - token_buffer[0] = c; - token_buffer[1] = 0; - if (c == '0') - yylval.ttype = integer_zero_node; - else - yylval.ttype = integer_one_node; - nextchar = c1; - value = CONSTANT; - goto done; - } - put_back (c1); - } - /* fall through... */ - case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - resume_numerical_scan: - { - register char *p; - int base = 10; - int count = 0; - int largest_digit = 0; - int numdigits = 0; - /* for multi-precision arithmetic, - we actually store only HOST_BITS_PER_CHAR bits in each part. - The number of parts is chosen so as to be sufficient to hold - the enough bits to fit into the two HOST_WIDE_INTs that contain - the integer value (this is always at least as many bits as are - in a target `long long' value, but may be wider). */ -#define TOTAL_PARTS ((HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR) * 2 + 2) - int parts[TOTAL_PARTS]; - int overflow = 0; - - enum anon1 { NOT_FLOAT, AFTER_POINT, TOO_MANY_POINTS} floatflag - = NOT_FLOAT; - - for (count = 0; count < TOTAL_PARTS; count++) - parts[count] = 0; - - p = token_buffer; - *p++ = c; - - if (c == '0') - { - *p++ = (c = getch ()); - if ((c == 'x') || (c == 'X')) - { - base = 16; - *p++ = (c = getch ()); - } - /* Leading 0 forces octal unless the 0 is the only digit. */ - else if (c >= '0' && c <= '9') - { - base = 8; - numdigits++; - } - else - numdigits++; - } - - /* Read all the digits-and-decimal-points. */ - - while (c == '.' - || (ISALNUM (c) && (c != 'l') && (c != 'L') - && (c != 'u') && (c != 'U') - && c != 'i' && c != 'I' && c != 'j' && c != 'J' - && (floatflag == NOT_FLOAT || ((c != 'f') && (c != 'F'))))) - { - if (c == '.') - { - if (base == 16) - error ("floating constant may not be in radix 16"); - if (floatflag == TOO_MANY_POINTS) - /* We have already emitted an error. Don't need another. */ - ; - else if (floatflag == AFTER_POINT) - { - error ("malformed floating constant"); - floatflag = TOO_MANY_POINTS; - /* Avoid another error from atof by forcing all characters - from here on to be ignored. */ - p[-1] = '\0'; - } - else - floatflag = AFTER_POINT; - - base = 10; - *p++ = c = getch (); - /* Accept '.' as the start of a floating-point number - only when it is followed by a digit. - Otherwise, unread the following non-digit - and use the '.' as a structural token. */ - if (p == token_buffer + 2 && !ISDIGIT (c)) - { - if (c == '.') - { - c = getch (); - if (c == '.') - { - *p++ = '.'; - *p = '\0'; - value = ELLIPSIS; - goto done; - } - error ("parse error at `..'"); - } - nextchar = c; - token_buffer[1] = '\0'; - value = '.'; - goto done; - } - } - else - { - /* It is not a decimal point. - It should be a digit (perhaps a hex digit). */ - - if (ISDIGIT (c)) - { - c = c - '0'; - } - else if (base <= 10) - { - if (c == 'e' || c == 'E') - { - base = 10; - floatflag = AFTER_POINT; - break; /* start of exponent */ - } - error ("nondigits in number and not hexadecimal"); - c = 0; - } - else if (c >= 'a') - { - c = c - 'a' + 10; - } - else - { - c = c - 'A' + 10; - } - if (c >= largest_digit) - largest_digit = c; - numdigits++; - - for (count = 0; count < TOTAL_PARTS; count++) - { - parts[count] *= base; - if (count) - { - parts[count] - += (parts[count-1] >> HOST_BITS_PER_CHAR); - parts[count-1] - &= (1 << HOST_BITS_PER_CHAR) - 1; - } - else - parts[0] += c; - } - - /* If the extra highest-order part ever gets anything in it, - the number is certainly too big. */ - if (parts[TOTAL_PARTS - 1] != 0) - overflow = 1; - - if (p >= token_buffer + maxtoken - 3) - p = extend_token_buffer (p); - *p++ = (c = getch ()); - } - } - - if (numdigits == 0) - error ("numeric constant with no digits"); - - if (largest_digit >= base) - error ("numeric constant contains digits beyond the radix"); - - /* Remove terminating char from the token buffer and delimit the string */ - *--p = 0; - - if (floatflag != NOT_FLOAT) - { - tree type = double_type_node; - int exceeds_double = 0; - int imag = 0; - REAL_VALUE_TYPE value; - jmp_buf handler; - - /* Read explicit exponent if any, and put it in tokenbuf. */ - - if ((c == 'e') || (c == 'E')) - { - if (p >= token_buffer + maxtoken - 3) - p = extend_token_buffer (p); - *p++ = c; - c = getch (); - if ((c == '+') || (c == '-')) - { - *p++ = c; - c = getch (); - } - if (! ISDIGIT (c)) - error ("floating constant exponent has no digits"); - while (ISDIGIT (c)) - { - if (p >= token_buffer + maxtoken - 3) - p = extend_token_buffer (p); - *p++ = c; - c = getch (); - } - } - - *p = 0; - errno = 0; - - /* Convert string to a double, checking for overflow. */ - if (setjmp (handler)) - { - error ("floating constant out of range"); - value = dconst0; - } - else - { - int fflag = 0, lflag = 0; - /* Copy token_buffer now, while it has just the number - and not the suffixes; once we add `f' or `i', - REAL_VALUE_ATOF may not work any more. */ - char *copy = (char *) alloca (p - token_buffer + 1); - bcopy (token_buffer, copy, p - token_buffer + 1); - - set_float_handler (handler); - - while (1) - { - int lose = 0; - - /* Read the suffixes to choose a data type. */ - switch (c) - { - case 'f': case 'F': - if (fflag) - error ("more than one `f' in numeric constant"); - fflag = 1; - break; - - case 'l': case 'L': - if (lflag) - error ("more than one `l' in numeric constant"); - lflag = 1; - break; - - case 'i': case 'I': - if (imag) - error ("more than one `i' or `j' in numeric constant"); - else if (pedantic) - pedwarn ("ANSI C++ forbids imaginary numeric constants"); - imag = 1; - break; - - default: - lose = 1; - } - - if (lose) - break; - - if (p >= token_buffer + maxtoken - 3) - p = extend_token_buffer (p); - *p++ = c; - *p = 0; - c = getch (); - } - - /* The second argument, machine_mode, of REAL_VALUE_ATOF - tells the desired precision of the binary result - of decimal-to-binary conversion. */ - - if (fflag) - { - if (lflag) - error ("both `f' and `l' in floating constant"); - - type = float_type_node; - value = REAL_VALUE_ATOF (copy, TYPE_MODE (type)); - /* A diagnostic is required here by some ANSI C testsuites. - This is not pedwarn, become some people don't want - an error for this. */ - if (REAL_VALUE_ISINF (value) && pedantic) - warning ("floating point number exceeds range of `float'"); - } - else if (lflag) - { - type = long_double_type_node; - value = REAL_VALUE_ATOF (copy, TYPE_MODE (type)); - if (REAL_VALUE_ISINF (value) && pedantic) - warning ("floating point number exceeds range of `long double'"); - } - else - { - value = REAL_VALUE_ATOF (copy, TYPE_MODE (type)); - if (REAL_VALUE_ISINF (value) && pedantic) - warning ("floating point number exceeds range of `double'"); - } - - set_float_handler (NULL_PTR); - } -#ifdef ERANGE - if (errno == ERANGE && pedantic) - { - /* ERANGE is also reported for underflow, - so test the value to distinguish overflow from that. */ - if (REAL_VALUES_LESS (dconst1, value) - || REAL_VALUES_LESS (value, dconstm1)) - { - pedwarn ("floating point number exceeds range of `%s'", - IDENTIFIER_POINTER (TYPE_IDENTIFIER (type))); - exceeds_double = 1; - } - } -#endif - - /* If the result is not a number, assume it must have been - due to some error message above, so silently convert - it to a zero. */ - if (REAL_VALUE_ISNAN (value)) - value = dconst0; - - /* Create a node with determined type and value. */ - if (imag) - yylval.ttype = build_complex (NULL_TREE, - cp_convert (type, integer_zero_node), - build_real (type, value)); - else - yylval.ttype = build_real (type, value); - } - else - { - tree type; - HOST_WIDE_INT high, low; - int spec_unsigned = 0; - int spec_long = 0; - int spec_long_long = 0; - int spec_imag = 0; - int bytes, warn; - - while (1) - { - if (c == 'u' || c == 'U') - { - if (spec_unsigned) - error ("two `u's in integer constant"); - spec_unsigned = 1; - } - else if (c == 'l' || c == 'L') - { - if (spec_long) - { - if (spec_long_long) - error ("three `l's in integer constant"); - else if (pedantic && ! in_system_header && warn_long_long) - pedwarn ("ANSI C++ forbids long long integer constants"); - spec_long_long = 1; - } - spec_long = 1; - } - else if (c == 'i' || c == 'j' || c == 'I' || c == 'J') - { - if (spec_imag) - error ("more than one `i' or `j' in numeric constant"); - else if (pedantic) - pedwarn ("ANSI C++ forbids imaginary numeric constants"); - spec_imag = 1; - } - else - break; - if (p >= token_buffer + maxtoken - 3) - p = extend_token_buffer (p); - *p++ = c; - c = getch (); - } - - /* If the constant is not long long and it won't fit in an - unsigned long, or if the constant is long long and won't fit - in an unsigned long long, then warn that the constant is out - of range. */ - - /* ??? This assumes that long long and long integer types are - a multiple of 8 bits. This better than the original code - though which assumed that long was exactly 32 bits and long - long was exactly 64 bits. */ - - if (spec_long_long) - bytes = TYPE_PRECISION (long_long_integer_type_node) / 8; - else - bytes = TYPE_PRECISION (long_integer_type_node) / 8; - - warn = overflow; - for (i = bytes; i < TOTAL_PARTS; i++) - if (parts[i]) - warn = 1; - if (warn) - pedwarn ("integer constant out of range"); - - /* This is simplified by the fact that our constant - is always positive. */ - high = low = 0; - - for (i = 0; i < HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR; i++) - { - high |= ((HOST_WIDE_INT) parts[i + (HOST_BITS_PER_WIDE_INT - / HOST_BITS_PER_CHAR)] - << (i * HOST_BITS_PER_CHAR)); - low |= (HOST_WIDE_INT) parts[i] << (i * HOST_BITS_PER_CHAR); - } - - - yylval.ttype = build_int_2 (low, high); - TREE_TYPE (yylval.ttype) = long_long_unsigned_type_node; - - /* Calculate the ANSI type. */ - if (!spec_long && !spec_unsigned - && int_fits_type_p (yylval.ttype, integer_type_node)) - type = integer_type_node; - else if (!spec_long && (base != 10 || spec_unsigned) - && int_fits_type_p (yylval.ttype, unsigned_type_node)) - /* Nondecimal constants try unsigned even in traditional C. */ - type = unsigned_type_node; - else if (!spec_unsigned && !spec_long_long - && int_fits_type_p (yylval.ttype, long_integer_type_node)) - type = long_integer_type_node; - else if (! spec_long_long) - type = long_unsigned_type_node; - else if (! spec_unsigned - /* Verify value does not overflow into sign bit. */ - && TREE_INT_CST_HIGH (yylval.ttype) >= 0 - && int_fits_type_p (yylval.ttype, - long_long_integer_type_node)) - type = long_long_integer_type_node; - else - type = long_long_unsigned_type_node; - - if (!int_fits_type_p (yylval.ttype, type) && !warn) - pedwarn ("integer constant out of range"); - - if (base == 10 && ! spec_unsigned && TREE_UNSIGNED (type)) - warning ("decimal integer constant is so large that it is unsigned"); - - if (spec_imag) - { - if (TYPE_PRECISION (type) - <= TYPE_PRECISION (integer_type_node)) - yylval.ttype - = build_complex (NULL_TREE, integer_zero_node, - cp_convert (integer_type_node, - yylval.ttype)); - else - error ("complex integer constant is too wide for `__complex int'"); - } - else - TREE_TYPE (yylval.ttype) = type; - } - - put_back (c); - *p = 0; - - value = CONSTANT; break; - } - - case '\'': - char_constant: - { - register int result = 0; - register int num_chars = 0; - int chars_seen = 0; - unsigned width = TYPE_PRECISION (char_type_node); - int max_chars; -#ifdef MULTIBYTE_CHARS - int longest_char = local_mb_cur_max (); - (void) local_mbtowc (NULL_PTR, NULL_PTR, 0); -#endif - - max_chars = TYPE_PRECISION (integer_type_node) / width; - if (wide_flag) - width = WCHAR_TYPE_SIZE; - - while (1) - { - tryagain: - c = getch (); - - if (c == '\'' || c == EOF) - break; - - ++chars_seen; - if (c == '\\') - { - int ignore = 0; - c = readescape (&ignore); - if (ignore) - goto tryagain; - if (width < HOST_BITS_PER_INT - && (unsigned) c >= ((unsigned)1 << width)) - pedwarn ("escape sequence out of range for character"); -#ifdef MAP_CHARACTER - if (ISPRINT (c)) - c = MAP_CHARACTER (c); -#endif - } - else if (c == '\n') - { - if (pedantic) - pedwarn ("ANSI C forbids newline in character constant"); - lineno++; - } - else - { -#ifdef MULTIBYTE_CHARS - wchar_t wc; - int i; - int char_len = -1; - for (i = 1; i <= longest_char; ++i) - { - if (i > maxtoken - 4) - extend_token_buffer (token_buffer); - - token_buffer[i] = c; - char_len = local_mbtowc (& wc, - token_buffer + 1, - i); - if (char_len != -1) - break; - c = getch (); - } - if (char_len > 1) - { - /* mbtowc sometimes needs an extra char before accepting */ - if (char_len < i) - put_back (c); - if (! wide_flag) - { - /* Merge character into result; ignore excess chars. */ - for (i = 1; i <= char_len; ++i) - { - if (i > max_chars) - break; - if (width < HOST_BITS_PER_INT) - result = (result << width) - | (token_buffer[i] - & ((1 << width) - 1)); - else - result = token_buffer[i]; - } - num_chars += char_len; - goto tryagain; - } - c = wc; - } - else - { - if (char_len == -1) - warning ("Ignoring invalid multibyte character"); - if (wide_flag) - c = wc; -#ifdef MAP_CHARACTER - else - c = MAP_CHARACTER (c); -#endif - } -#else /* ! MULTIBYTE_CHARS */ -#ifdef MAP_CHARACTER - c = MAP_CHARACTER (c); -#endif -#endif /* ! MULTIBYTE_CHARS */ - } - - if (wide_flag) - { - if (chars_seen == 1) /* only keep the first one */ - result = c; - goto tryagain; - } - - /* Merge character into result; ignore excess chars. */ - num_chars++; - if (num_chars < max_chars + 1) - { - if (width < HOST_BITS_PER_INT) - result = (result << width) | (c & ((1 << width) - 1)); - else - result = c; - } - } - - if (c != '\'') - error ("malformatted character constant"); - else if (chars_seen == 0) - error ("empty character constant"); - else if (num_chars > max_chars) - { - num_chars = max_chars; - error ("character constant too long"); - } - else if (chars_seen != 1 && warn_multichar) - warning ("multi-character character constant"); - - /* If char type is signed, sign-extend the constant. */ - if (! wide_flag) - { - int num_bits = num_chars * width; - if (num_bits == 0) - /* We already got an error; avoid invalid shift. */ - yylval.ttype = build_int_2 (0, 0); - else if (TREE_UNSIGNED (char_type_node) - || ((result >> (num_bits - 1)) & 1) == 0) - yylval.ttype - = build_int_2 (result & (~(unsigned HOST_WIDE_INT) 0 - >> (HOST_BITS_PER_WIDE_INT - num_bits)), - 0); - else - yylval.ttype - = build_int_2 (result | ~(~(unsigned HOST_WIDE_INT) 0 - >> (HOST_BITS_PER_WIDE_INT - num_bits)), - -1); - if (chars_seen <= 1) - TREE_TYPE (yylval.ttype) = char_type_node; - else - TREE_TYPE (yylval.ttype) = integer_type_node; - } - else - { - yylval.ttype = build_int_2 (result, 0); - TREE_TYPE (yylval.ttype) = wchar_type_node; - } - - value = CONSTANT; - break; - } - - case '"': - string_constant: - { - register char *p; - unsigned width = wide_flag ? WCHAR_TYPE_SIZE - : TYPE_PRECISION (char_type_node); -#ifdef MULTIBYTE_CHARS - int longest_char = local_mb_cur_max (); - (void) local_mbtowc (NULL_PTR, NULL_PTR, 0); -#endif - - c = getch (); - p = token_buffer + 1; - - while (c != '"' && c >= 0) - { - /* ignore_escape_flag is set for reading the filename in #line. */ - if (!ignore_escape_flag && c == '\\') - { - int ignore = 0; - c = readescape (&ignore); - if (ignore) - goto skipnewline; - if (width < HOST_BITS_PER_INT - && (unsigned) c >= ((unsigned)1 << width)) - warning ("escape sequence out of range for character"); - } - else if (c == '\n') - { - if (pedantic) - pedwarn ("ANSI C++ forbids newline in string constant"); - lineno++; - } - else - { -#ifdef MULTIBYTE_CHARS - wchar_t wc; - int i; - int char_len = -1; - for (i = 0; i < longest_char; ++i) - { - if (p + i >= token_buffer + maxtoken) - p = extend_token_buffer (p); - p[i] = c; - - char_len = local_mbtowc (& wc, p, i + 1); - if (char_len != -1) - break; - c = getch (); - } - if (char_len == -1) - warning ("Ignoring invalid multibyte character"); - else - { - /* mbtowc sometimes needs an extra char before accepting */ - if (char_len <= i) - put_back (c); - if (! wide_flag) - { - p += (i + 1); - c = getch (); - continue; - } - c = wc; - } -#endif /* MULTIBYTE_CHARS */ - } - - /* Add this single character into the buffer either as a wchar_t - or as a single byte. */ - if (wide_flag) - { - unsigned width = TYPE_PRECISION (char_type_node); - unsigned bytemask = (1 << width) - 1; - int byte; - - if (p + WCHAR_BYTES > token_buffer + maxtoken) - p = extend_token_buffer (p); - - for (byte = 0; byte < WCHAR_BYTES; ++byte) - { - int value; - if (byte >= (int) sizeof(c)) - value = 0; - else - value = (c >> (byte * width)) & bytemask; - if (BYTES_BIG_ENDIAN) - p[WCHAR_BYTES - byte - 1] = value; - else - p[byte] = value; - } - p += WCHAR_BYTES; - } - else - { - if (p >= token_buffer + maxtoken) - p = extend_token_buffer (p); - *p++ = c; - } - - skipnewline: - c = getch (); - if (c == EOF) { - error ("Unterminated string"); - break; - } - } - - /* Terminate the string value, either with a single byte zero - or with a wide zero. */ - if (wide_flag) - { - if (p + WCHAR_BYTES > token_buffer + maxtoken) - p = extend_token_buffer (p); - bzero (p, WCHAR_BYTES); - p += WCHAR_BYTES; - } - else - { - if (p >= token_buffer + maxtoken) - p = extend_token_buffer (p); - *p++ = 0; - } - - /* We have read the entire constant. - Construct a STRING_CST for the result. */ - - if (processing_template_decl) - push_obstacks (&permanent_obstack, &permanent_obstack); - yylval.ttype = build_string (p - (token_buffer + 1), token_buffer + 1); - if (processing_template_decl) - pop_obstacks (); - - if (wide_flag) - TREE_TYPE (yylval.ttype) = wchar_array_type_node; - else - TREE_TYPE (yylval.ttype) = char_array_type_node; - - value = STRING; break; - } - - case '+': - case '-': - case '&': - case '|': - case '<': - case '>': - case '*': - case '/': - case '%': - case '^': - case '!': - case '=': - { - register int c1; - - combine: - - switch (c) - { - case '+': - yylval.code = PLUS_EXPR; break; - case '-': - yylval.code = MINUS_EXPR; break; - case '&': - yylval.code = BIT_AND_EXPR; break; - case '|': - yylval.code = BIT_IOR_EXPR; break; - case '*': - yylval.code = MULT_EXPR; break; - case '/': - yylval.code = TRUNC_DIV_EXPR; break; - case '%': - yylval.code = TRUNC_MOD_EXPR; break; - case '^': - yylval.code = BIT_XOR_EXPR; break; - case LSHIFT: - yylval.code = LSHIFT_EXPR; break; - case RSHIFT: - yylval.code = RSHIFT_EXPR; break; - case '<': - yylval.code = LT_EXPR; break; - case '>': - yylval.code = GT_EXPR; break; - } - - token_buffer[1] = c1 = getch (); - token_buffer[2] = 0; - - if (c1 == '=') - { - switch (c) - { - case '<': - value = ARITHCOMPARE; yylval.code = LE_EXPR; goto done; - case '>': - value = ARITHCOMPARE; yylval.code = GE_EXPR; goto done; - case '!': - value = EQCOMPARE; yylval.code = NE_EXPR; goto done; - case '=': - value = EQCOMPARE; yylval.code = EQ_EXPR; goto done; - } - value = ASSIGN; goto done; - } - else if (c == c1) - switch (c) - { - case '+': - value = PLUSPLUS; goto done; - case '-': - value = MINUSMINUS; goto done; - case '&': - value = ANDAND; goto done; - case '|': - value = OROR; goto done; - case '<': - c = LSHIFT; - goto combine; - case '>': - c = RSHIFT; - goto combine; - } - else if ((c == '-') && (c1 == '>')) - { - nextchar = getch (); - if (nextchar == '*') - { - nextchar = -1; - value = POINTSAT_STAR; - } - else - value = POINTSAT; - goto done; - } - else if (c1 == '?' && (c == '<' || c == '>')) - { - token_buffer[3] = 0; - - c1 = getch (); - yylval.code = (c == '<' ? MIN_EXPR : MAX_EXPR); - if (c1 == '=') - { - /* ?= expression. */ - token_buffer[2] = c1; - value = ASSIGN; - } - else - { - value = MIN_MAX; - nextchar = c1; - } - if (pedantic) - pedwarn ("use of `operator %s' is not standard C++", - token_buffer); - goto done; - } - /* digraphs */ - else if (c == '<' && c1 == '%') - { value = '{'; goto done; } - else if (c == '<' && c1 == ':') - { value = '['; goto done; } - else if (c == '%' && c1 == '>') - { value = '}'; goto done; } - else if (c == '%' && c1 == ':') - { value = '#'; goto done; } - - nextchar = c1; - token_buffer[1] = 0; - - value = c; - goto done; - } - - case ':': - c = getch (); - if (c == ':') - { - token_buffer[1] = ':'; - token_buffer[2] = '\0'; - value = SCOPE; - yylval.itype = 1; - } - else if (c == '>') - { - value = ']'; - goto done; - } - else - { - nextchar = c; - value = ':'; - } - break; - - case 0: - /* Don't make yyparse think this is eof. */ - value = 1; - break; - - case '(': - /* try, weakly, to handle casts to pointers to functions. */ - nextchar = skip_white_space (getch ()); - if (nextchar == '*') - { - int next_c = skip_white_space (getch ()); - if (next_c == ')') - { - nextchar = -1; - yylval.ttype = build1 (INDIRECT_REF, 0, 0); - value = PAREN_STAR_PAREN; - } - else - { - put_back (next_c); - value = c; - } - } - else if (nextchar == ')') - { - nextchar = -1; - yylval.ttype = NULL_TREE; - value = LEFT_RIGHT; - } - else value = c; - break; - - default: - value = c; - } - -done: -/* yylloc.last_line = lineno; */ -#ifdef GATHER_STATISTICS -#ifdef REDUCE_LENGTH - token_count[value] += 1; -#endif -#endif - - return value; -} - -int -is_rid (t) - tree t; -{ - return !!is_reserved_word (IDENTIFIER_POINTER (t), IDENTIFIER_LENGTH (t)); -} - -#ifdef GATHER_STATISTICS -/* The original for tree_node_kind is in the toplevel tree.c; changes there - need to be brought into here, unless this were actually put into a header - instead. */ -/* Statistics-gathering stuff. */ -typedef enum -{ - d_kind, - t_kind, - b_kind, - s_kind, - r_kind, - e_kind, - c_kind, - id_kind, - op_id_kind, - perm_list_kind, - temp_list_kind, - vec_kind, - x_kind, - lang_decl, - lang_type, - all_kinds -} tree_node_kind; - -extern int tree_node_counts[]; -extern int tree_node_sizes[]; -#endif - -/* Place to save freed lang_decls which were allocated on the - permanent_obstack. @@ Not currently used. */ -tree free_lang_decl_chain; - -tree -build_lang_decl (code, name, type) - enum tree_code code; - tree name; - tree type; -{ - register tree t = build_decl (code, name, type); - retrofit_lang_decl (t); - return t; -} - -/* Add DECL_LANG_SPECIFIC info to T. Called from build_lang_decl - and pushdecl (for functions generated by the backend). */ - -void -retrofit_lang_decl (t) - tree t; -{ - struct obstack *obstack = current_obstack; - register int i = sizeof (struct lang_decl) / sizeof (int); - register int *pi; - - if (! TREE_PERMANENT (t)) - obstack = saveable_obstack; - else - /* Could be that saveable is permanent and current is not. */ - obstack = &permanent_obstack; - - if (free_lang_decl_chain && obstack == &permanent_obstack) - { - pi = (int *)free_lang_decl_chain; - free_lang_decl_chain = TREE_CHAIN (free_lang_decl_chain); - } - else - pi = (int *) obstack_alloc (obstack, sizeof (struct lang_decl)); - - while (i > 0) - pi[--i] = 0; - - DECL_LANG_SPECIFIC (t) = (struct lang_decl *) pi; - LANG_DECL_PERMANENT ((struct lang_decl *) pi) - = obstack == &permanent_obstack; - my_friendly_assert (LANG_DECL_PERMANENT ((struct lang_decl *) pi) - == TREE_PERMANENT (t), 234); - DECL_MAIN_VARIANT (t) = t; - if (current_lang_name == lang_name_cplusplus) - DECL_LANGUAGE (t) = lang_cplusplus; - else if (current_lang_name == lang_name_c) - DECL_LANGUAGE (t) = lang_c; - else if (current_lang_name == lang_name_java) - DECL_LANGUAGE (t) = lang_java; - else my_friendly_abort (64); - -#if 0 /* not yet, should get fixed properly later */ - if (code == TYPE_DECL) - { - tree id; - id = get_identifier (build_overload_name (type, 1, 1)); - DECL_ASSEMBLER_NAME (t) = id; - } - -#endif -#ifdef GATHER_STATISTICS - tree_node_counts[(int)lang_decl] += 1; - tree_node_sizes[(int)lang_decl] += sizeof (struct lang_decl); -#endif -} - -tree -build_lang_field_decl (code, name, type) - enum tree_code code; - tree name; - tree type; -{ - extern struct obstack *current_obstack, *saveable_obstack; - register tree t = build_decl (code, name, type); - struct obstack *obstack = current_obstack; - register int i = sizeof (struct lang_decl_flags) / sizeof (int); - register int *pi; -#if 0 /* not yet, should get fixed properly later */ - - if (code == TYPE_DECL) - { - tree id; - id = get_identifier (build_overload_name (type, 1, 1)); - DECL_ASSEMBLER_NAME (t) = id; - } -#endif - - if (! TREE_PERMANENT (t)) - obstack = saveable_obstack; - else - my_friendly_assert (obstack == &permanent_obstack, 235); - - pi = (int *) obstack_alloc (obstack, sizeof (struct lang_decl_flags)); - while (i > 0) - pi[--i] = 0; - - DECL_LANG_SPECIFIC (t) = (struct lang_decl *) pi; - return t; -} - -void -copy_lang_decl (node) - tree node; -{ - int size; - int *pi; - - if (! DECL_LANG_SPECIFIC (node)) - return; - - if (TREE_CODE (node) == FIELD_DECL) - size = sizeof (struct lang_decl_flags); - else - size = sizeof (struct lang_decl); - pi = (int *)obstack_alloc (&permanent_obstack, size); - bcopy ((char *)DECL_LANG_SPECIFIC (node), (char *)pi, size); - DECL_LANG_SPECIFIC (node) = (struct lang_decl *)pi; -} - -tree -make_lang_type (code) - enum tree_code code; -{ - extern struct obstack *current_obstack, *saveable_obstack; - register tree t = make_node (code); - - /* Set up some flags that give proper default behavior. */ - if (IS_AGGR_TYPE_CODE (code)) - { - struct obstack *obstack = current_obstack; - struct lang_type *pi; - - SET_IS_AGGR_TYPE (t, 1); - - if (! TREE_PERMANENT (t)) - obstack = saveable_obstack; - else - my_friendly_assert (obstack == &permanent_obstack, 236); - - pi = (struct lang_type *) obstack_alloc (obstack, sizeof (struct lang_type)); - bzero ((char *) pi, (int) sizeof (struct lang_type)); - - TYPE_LANG_SPECIFIC (t) = pi; - CLASSTYPE_AS_LIST (t) = build_expr_list (NULL_TREE, t); - SET_CLASSTYPE_INTERFACE_UNKNOWN_X (t, interface_unknown); - CLASSTYPE_INTERFACE_ONLY (t) = interface_only; - TYPE_BINFO (t) = make_binfo (integer_zero_node, t, NULL_TREE, NULL_TREE); - CLASSTYPE_BINFO_AS_LIST (t) - = build_tree_list (NULL_TREE, TYPE_BINFO (t)); - - /* Make sure this is laid out, for ease of use later. In the - presence of parse errors, the normal was of assuring this - might not ever get executed, so we lay it out *immediately*. */ - build_pointer_type (t); - -#ifdef GATHER_STATISTICS - tree_node_counts[(int)lang_type] += 1; - tree_node_sizes[(int)lang_type] += sizeof (struct lang_type); -#endif - } - else - /* We use TYPE_ALIAS_SET for the CLASSTYPE_MARKED bits. But, - TYPE_ALIAS_SET is initialized to -1 by default, so we must - clear it here. */ - TYPE_ALIAS_SET (t) = 0; - - return t; -} - -void -dump_time_statistics () -{ - register tree prev = 0, decl, next; - int this_time = my_get_run_time (); - TREE_INT_CST_LOW (TIME_IDENTIFIER_TIME (this_filename_time)) - += this_time - body_time; - - fprintf (stderr, "\n******\n"); - print_time ("header files (total)", header_time); - print_time ("main file (total)", this_time - body_time); - fprintf (stderr, "ratio = %g : 1\n", - (double)header_time / (double)(this_time - body_time)); - fprintf (stderr, "\n******\n"); - - for (decl = filename_times; decl; decl = next) - { - next = IDENTIFIER_GLOBAL_VALUE (decl); - SET_IDENTIFIER_GLOBAL_VALUE (decl, prev); - prev = decl; - } - - for (decl = prev; decl; decl = IDENTIFIER_GLOBAL_VALUE (decl)) - print_time (IDENTIFIER_POINTER (decl), - TREE_INT_CST_LOW (TIME_IDENTIFIER_TIME (decl))); -} - -void -compiler_error (s, v, v2) - char *s; - HOST_WIDE_INT v, v2; /* @@also used as pointer */ -{ - char buf[1024]; - sprintf (buf, s, v, v2); - error_with_file_and_line (input_filename, lineno, "%s (compiler error)", buf); -} - -void -yyerror (string) - char *string; -{ - extern int end_of_file; - char buf[200]; - - strcpy (buf, string); - - /* We can't print string and character constants well - because the token_buffer contains the result of processing escapes. */ - if (end_of_file) - strcat (buf, input_redirected () - ? " at end of saved text" - : " at end of input"); - else if (token_buffer[0] == 0) - strcat (buf, " at null character"); - else if (token_buffer[0] == '"') - strcat (buf, " before string constant"); - else if (token_buffer[0] == '\'') - strcat (buf, " before character constant"); - else if (!ISGRAPH ((unsigned char)token_buffer[0])) - sprintf (buf + strlen (buf), " before character 0%o", - (unsigned char) token_buffer[0]); - else - strcat (buf, " before `%s'"); - - error (buf, token_buffer); -} - -static int -handle_cp_pragma (pname) - char *pname; -{ - register int token; - - if (! strcmp (pname, "vtable")) - { - extern tree pending_vtables; - - /* More follows: it must be a string constant (class name). */ - token = real_yylex (); - if (token != STRING || TREE_CODE (yylval.ttype) != STRING_CST) - { - error ("invalid #pragma vtable"); - return -1; - } - - if (write_virtuals != 2) - { - warning ("use `+e2' option to enable #pragma vtable"); - return -1; - } - pending_vtables - = perm_tree_cons (NULL_TREE, - get_identifier (TREE_STRING_POINTER (yylval.ttype)), - pending_vtables); - token = real_yylex (); - if (token != END_OF_LINE) - warning ("trailing characters ignored"); - return 1; - } - else if (! strcmp (pname, "unit")) - { - /* More follows: it must be a string constant (unit name). */ - token = real_yylex (); - if (token != STRING || TREE_CODE (yylval.ttype) != STRING_CST) - { - error ("invalid #pragma unit"); - return -1; - } - token = real_yylex (); - if (token != END_OF_LINE) - warning ("trailing characters ignored"); - return 1; - } - else if (! strcmp (pname, "interface")) - { - tree fileinfo - = TIME_IDENTIFIER_FILEINFO (get_time_identifier (input_filename)); - char *main_filename = input_filename; - - main_filename = file_name_nondirectory (main_filename); - - token = real_yylex (); - - if (token != END_OF_LINE) - { - if (token != STRING - || TREE_CODE (yylval.ttype) != STRING_CST) - { - error ("invalid `#pragma interface'"); - return -1; - } - main_filename = TREE_STRING_POINTER (yylval.ttype); - token = real_yylex (); - } - - if (token != END_OF_LINE) - warning ("garbage after `#pragma interface' ignored"); - - write_virtuals = 3; - - if (impl_file_chain == 0) - { - /* If this is zero at this point, then we are - auto-implementing. */ - if (main_input_filename == 0) - main_input_filename = input_filename; - -#ifdef AUTO_IMPLEMENT - filename = file_name_nondirectory (main_input_filename); - fi = get_time_identifier (filename); - fi = TIME_IDENTIFIER_FILEINFO (fi); - TREE_INT_CST_LOW (fi) = 0; - TREE_INT_CST_HIGH (fi) = 1; - /* Get default. */ - impl_file_chain = (struct impl_files *)permalloc (sizeof (struct impl_files)); - impl_file_chain->filename = filename; - impl_file_chain->next = 0; -#endif - } - - interface_only = interface_strcmp (main_filename); -#ifdef MULTIPLE_SYMBOL_SPACES - if (! interface_only) - interface_unknown = 0; -#else /* MULTIPLE_SYMBOL_SPACES */ - interface_unknown = 0; -#endif /* MULTIPLE_SYMBOL_SPACES */ - TREE_INT_CST_LOW (fileinfo) = interface_only; - TREE_INT_CST_HIGH (fileinfo) = interface_unknown; - - return 1; - } - else if (! strcmp (pname, "implementation")) - { - tree fileinfo - = TIME_IDENTIFIER_FILEINFO (get_time_identifier (input_filename)); - char *main_filename = main_input_filename ? main_input_filename : input_filename; - - main_filename = file_name_nondirectory (main_filename); - token = real_yylex (); - if (token != END_OF_LINE) - { - if (token != STRING - || TREE_CODE (yylval.ttype) != STRING_CST) - { - error ("invalid `#pragma implementation'"); - return -1; - } - main_filename = TREE_STRING_POINTER (yylval.ttype); - token = real_yylex (); - } - - if (token != END_OF_LINE) - warning ("garbage after `#pragma implementation' ignored"); - - if (write_virtuals == 3) - { - struct impl_files *ifiles = impl_file_chain; - while (ifiles) - { - if (! strcmp (ifiles->filename, main_filename)) - break; - ifiles = ifiles->next; - } - if (ifiles == 0) - { - ifiles = (struct impl_files*) permalloc (sizeof (struct impl_files)); - ifiles->filename = main_filename; - ifiles->next = impl_file_chain; - impl_file_chain = ifiles; - } - } - else if ((main_input_filename != 0 - && ! strcmp (main_input_filename, input_filename)) - || ! strcmp (input_filename, main_filename)) - { - write_virtuals = 3; - if (impl_file_chain == 0) - { - impl_file_chain = (struct impl_files*) permalloc (sizeof (struct impl_files)); - impl_file_chain->filename = main_filename; - impl_file_chain->next = 0; - } - } - else - error ("`#pragma implementation' can only appear at top-level"); - interface_only = 0; -#if 1 - /* We make this non-zero so that we infer decl linkage - in the impl file only for variables first declared - in the interface file. */ - interface_unknown = 1; -#else - /* We make this zero so that templates in the impl - file will be emitted properly. */ - interface_unknown = 0; -#endif - TREE_INT_CST_LOW (fileinfo) = interface_only; - TREE_INT_CST_HIGH (fileinfo) = interface_unknown; - - return 1; - } - - return 0; -} - -/* Return the type-qualifier corresponding to the identifier given by - RID. */ - -int -cp_type_qual_from_rid (rid) - tree rid; -{ - if (rid == ridpointers[(int) RID_CONST]) - return TYPE_QUAL_CONST; - else if (rid == ridpointers[(int) RID_VOLATILE]) - return TYPE_QUAL_VOLATILE; - else if (rid == ridpointers[(int) RID_RESTRICT]) - return TYPE_QUAL_RESTRICT; - - my_friendly_abort (0); - return TYPE_UNQUALIFIED; -} - - -#ifdef HANDLE_GENERIC_PRAGMAS - -/* Handle a #pragma directive. TOKEN is the type of the word following - the #pragma directive on the line. Process the entire input line and - return non-zero iff the directive successfully parsed. */ - -/* This function has to be in this file, in order to get at - the token types. */ - -static int -handle_generic_pragma (token) - register int token; -{ - for (;;) - { - switch (token) - { - case IDENTIFIER: - case TYPENAME: - case STRING: - case CONSTANT: - handle_pragma_token (token_buffer, yylval.ttype); - break; - - case LEFT_RIGHT: - handle_pragma_token ("(", NULL_TREE); - handle_pragma_token (")", NULL_TREE); - break; - - case END_OF_LINE: - return handle_pragma_token (NULL_PTR, NULL_TREE); - - default: - handle_pragma_token (token_buffer, NULL); - } - - token = real_yylex (); - } -} -#endif /* HANDLE_GENERIC_PRAGMAS */ diff --git a/gcc/cp/lex.h b/gcc/cp/lex.h deleted file mode 100755 index 249eef9..0000000 --- a/gcc/cp/lex.h +++ /dev/null @@ -1,137 +0,0 @@ -/* Define constants and variables for communication with parse.y. - Copyright (C) 1987, 92-97, 1998 Free Software Foundation, Inc. - Hacked by Michael Tiemann (tiemann@cygnus.com) - and by Brendan Kehoe (brendan@cygnus.com). - -This file is part of GNU CC. - -GNU CC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY. No author or distributor -accepts responsibility to anyone for the consequences of using it -or for whether it serves any particular purpose or works at all, -unless he says so in writing. Refer to the GNU CC General Public -License for full details. - -Everyone is granted permission to copy, modify and redistribute -GNU CC, but only under the conditions described in the -GNU CC General Public License. A copy of this license is -supposed to have been given to you along with GNU CC so you -can know your rights and responsibilities. It should be in a -file named COPYING. Among other things, the copyright notice -and this notice must be preserved on all copies. */ - - - -enum rid -{ - RID_UNUSED, - RID_INT, - RID_BOOL, - RID_CHAR, - RID_WCHAR, - RID_FLOAT, - RID_DOUBLE, - RID_VOID, - - /* C++ extension */ - RID_CLASS, - RID_RECORD, - RID_UNION, - RID_ENUM, - RID_LONGLONG, - - /* This is where grokdeclarator starts its search when setting the specbits. - The first seven are in the order of most frequently used, as found - building libg++. */ - - RID_EXTERN, - RID_CONST, - RID_LONG, - RID_TYPEDEF, - RID_UNSIGNED, - RID_SHORT, - RID_INLINE, - - RID_STATIC, - - RID_REGISTER, - RID_VOLATILE, - RID_FRIEND, - RID_VIRTUAL, - RID_EXPLICIT, - RID_EXPORT, - RID_SIGNED, - RID_AUTO, - RID_MUTABLE, - RID_COMPLEX, - RID_RESTRICT, - - /* This is where grokdeclarator ends its search when setting the - specbits. */ - - RID_PUBLIC, - RID_PRIVATE, - RID_PROTECTED, - RID_EXCEPTION, - RID_TEMPLATE, - RID_SIGNATURE, - RID_NULL, - /* Before adding enough to get up to 64, the RIDBIT_* macros - will have to be changed a little. */ - RID_MAX -}; - -#define NORID RID_UNUSED - -#define RID_FIRST_MODIFIER RID_EXTERN -#define RID_LAST_MODIFIER RID_COMPLEX - -/* The type that can represent all values of RIDBIT. */ -/* We assume that we can stick in at least 32 bits into this. */ -typedef struct { unsigned long idata[2]; } - RID_BIT_TYPE; - -/* Be careful, all these modify N twice. */ -#define RIDBIT_SETP(N, V) (((unsigned long)1 << (int) ((N)%32)) \ - & (V).idata[(N)/32]) -#define RIDBIT_NOTSETP(NN, VV) (! RIDBIT_SETP (NN, VV)) -#define RIDBIT_SET(N, V) do { \ - (V).idata[(N)/32] \ - |= ((unsigned long)1 << (int) ((N)%32)); \ - } while (0) -#define RIDBIT_RESET(N, V) do { \ - (V).idata[(N)/32] \ - &= ~((unsigned long)1 << (int) ((N)%32)); \ - } while (0) -#define RIDBIT_RESET_ALL(V) do { \ - (V).idata[0] = 0; \ - (V).idata[1] = 0; \ - } while (0) -#define RIDBIT_ANY_SET(V) ((V).idata[0] || (V).idata[1]) - -/* The elements of `ridpointers' are identifier nodes - for the reserved type names and storage classes. - It is indexed by a RID_... value. */ -extern tree ridpointers[(int) RID_MAX]; - -/* the declaration found for the last IDENTIFIER token read in. - yylex must look this up to detect typedefs, which get token type TYPENAME, - so it is left around in case the identifier is not a typedef but is - used in a context which makes it a reference to a variable. */ -extern tree lastiddecl; - -extern char *token_buffer; /* Pointer to token buffer. */ - -/* Back-door communication channel to the lexer. */ -extern int looking_for_typename; -extern int looking_for_template; - -/* Tell the lexer where to look for names. */ -extern tree got_scope; -extern tree got_object; - -/* Pending language change. - Positive is push count, negative is pop count. */ -extern int pending_lang_change; - -extern int yylex PROTO((void)); diff --git a/gcc/cp/lex_990205.c b/gcc/cp/lex_990205.c deleted file mode 100755 index f5e8e67..0000000 --- a/gcc/cp/lex_990205.c +++ /dev/null @@ -1,5105 +0,0 @@ -/* Separate lexical analyzer for GNU C++. - Copyright (C) 1987, 89, 92-98, 1999 Free Software Foundation, Inc. - Hacked by Michael Tiemann (tiemann@cygnus.com) - -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 -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - - -/* This file is the lexical analyzer for GNU C++. */ - -/* Cause the `yydebug' variable to be defined. */ -#define YYDEBUG 1 - -#include "config.h" -#include "system.h" -#include -#include "input.h" -#include "tree.h" -#include "lex.h" -#include "cp-tree.h" -#include "parse.h" -#include "flags.h" -#include "obstack.h" -#include "c-pragma.h" -#include "toplev.h" -#include "output.h" - -#ifdef MULTIBYTE_CHARS -#include "mbchar.h" -#include -#endif - -#define obstack_chunk_alloc xmalloc -#define obstack_chunk_free free - -#ifndef DIR_SEPARATOR -#define DIR_SEPARATOR '/' -#endif - -extern struct obstack permanent_obstack; -extern struct obstack *current_obstack, *saveable_obstack; - -extern void yyprint PROTO((FILE *, int, YYSTYPE)); -extern void compiler_error PROTO((char *, HOST_WIDE_INT, - HOST_WIDE_INT)); - -static tree get_time_identifier PROTO((char *)); -static int check_newline PROTO((void)); -static int skip_white_space PROTO((int)); -static void finish_defarg PROTO((void)); -static int my_get_run_time PROTO((void)); -static int get_last_nonwhite_on_line PROTO((void)); -static int interface_strcmp PROTO((char *)); -static int readescape PROTO((int *)); -static char *extend_token_buffer PROTO((char *)); -static void consume_string PROTO((struct obstack *, int)); -static void set_typedecl_interface_info PROTO((tree, tree)); -static void feed_defarg PROTO((tree, tree)); -static int set_vardecl_interface_info PROTO((tree, tree)); -static void store_pending_inline PROTO((tree, struct pending_inline *)); -static void reinit_parse_for_expr PROTO((struct obstack *)); -static int *init_cpp_parse PROTO((void)); -static int handle_cp_pragma PROTO((char *)); -#ifdef HANDLE_GENERIC_PRAGMAS -static int handle_generic_pragma PROTO((int)); -#endif -#ifdef GATHER_STATISTICS -#ifdef REDUCE_LENGTH -static int reduce_cmp PROTO((int *, int *)); -static int token_cmp PROTO((int *, int *)); -#endif -#endif -static void begin_definition_of_inclass_inline PROTO((struct pending_inline*)); - -/* Given a file name X, return the nondirectory portion. - Keep in mind that X can be computed more than once. */ -char * -file_name_nondirectory (x) - char *x; -{ - char *tmp = (char *) rindex (x, '/'); - if (DIR_SEPARATOR != '/' && ! tmp) - tmp = (char *) rindex (x, DIR_SEPARATOR); - if (tmp) - return (char *) (tmp + 1); - else - return x; -} - -/* This obstack is needed to hold text. It is not safe to use - TOKEN_BUFFER because `check_newline' calls `yylex'. */ -struct obstack inline_text_obstack; -char *inline_text_firstobj; - -#if USE_CPPLIB -#include "cpplib.h" -extern cpp_reader parse_in; -extern cpp_options parse_options; -extern unsigned char *yy_cur, *yy_lim; -#else -FILE *finput; -#endif -int end_of_file; - -/* CYGNUS LOCAL Embedded C++ */ -/* If non-zero, we gave an error about namespaces not being allowed by - Embedded C++. */ -static int embedded_namespace_error = 0; - -/* If non-zero, we gave an error about templates not being allowed by - Embedded C++. */ -static int embedded_template_error = 0; - -/* If non-zero, we gave an error about exception handling not being allowed by - Embedded C++. */ -static int embedded_eh_error = 0; -/* END CYGNUS LOCAL Embedded C++ */ - -/* Pending language change. - Positive is push count, negative is pop count. */ -int pending_lang_change = 0; - -/* Wrap the current header file in extern "C". */ -static int c_header_level = 0; - -extern int first_token; -extern struct obstack token_obstack; - -/* ??? Don't really know where this goes yet. */ -#if 1 -#include "input.c" -#else -extern void put_back (/* int */); -extern int input_redirected (); -extern void feed_input (/* char *, int */); -#endif - -/* Holds translations from TREE_CODEs to operator name strings, - i.e., opname_tab[PLUS_EXPR] == "+". */ -char **opname_tab; -char **assignop_tab; - -extern int yychar; /* the lookahead symbol */ -extern YYSTYPE yylval; /* the semantic value of the */ - /* lookahead symbol */ - -#if 0 -YYLTYPE yylloc; /* location data for the lookahead */ - /* symbol */ -#endif - - -/* the declaration found for the last IDENTIFIER token read in. - yylex must look this up to detect typedefs, which get token type TYPENAME, - so it is left around in case the identifier is not a typedef but is - used in a context which makes it a reference to a variable. */ -tree lastiddecl; - -/* The elements of `ridpointers' are identifier nodes - for the reserved type names and storage classes. - It is indexed by a RID_... value. */ -tree ridpointers[(int) RID_MAX]; - -/* We may keep statistics about how long which files took to compile. */ -static int header_time, body_time; -static tree filename_times; -static tree this_filename_time; - -/* Array for holding counts of the numbers of tokens seen. */ -extern int *token_count; - -/* Return something to represent absolute declarators containing a *. - TARGET is the absolute declarator that the * contains. - CV_QUALIFIERS is a list of modifiers such as const or volatile - to apply to the pointer type, represented as identifiers. - - We return an INDIRECT_REF whose "contents" are TARGET - and whose type is the modifier list. */ - -tree -make_pointer_declarator (cv_qualifiers, target) - tree cv_qualifiers, target; -{ - if (target && TREE_CODE (target) == IDENTIFIER_NODE - && ANON_AGGRNAME_P (target)) - error ("type name expected before `*'"); - target = build_parse_node (INDIRECT_REF, target); - TREE_TYPE (target) = cv_qualifiers; - return target; -} - -/* Return something to represent absolute declarators containing a &. - TARGET is the absolute declarator that the & contains. - CV_QUALIFIERS is a list of modifiers such as const or volatile - to apply to the reference type, represented as identifiers. - - We return an ADDR_EXPR whose "contents" are TARGET - and whose type is the modifier list. */ - -tree -make_reference_declarator (cv_qualifiers, target) - tree cv_qualifiers, target; -{ - if (target) - { - if (TREE_CODE (target) == ADDR_EXPR) - { - error ("cannot declare references to references"); - return target; - } - if (TREE_CODE (target) == INDIRECT_REF) - { - error ("cannot declare pointers to references"); - return target; - } - if (TREE_CODE (target) == IDENTIFIER_NODE && ANON_AGGRNAME_P (target)) - error ("type name expected before `&'"); - } - target = build_parse_node (ADDR_EXPR, target); - TREE_TYPE (target) = cv_qualifiers; - return target; -} - -tree -make_call_declarator (target, parms, cv_qualifiers, exception_specification) - tree target, parms, cv_qualifiers, exception_specification; -{ - target = build_parse_node (CALL_EXPR, target, parms, cv_qualifiers); - TREE_TYPE (target) = exception_specification; - return target; -} - -void -set_quals_and_spec (call_declarator, cv_qualifiers, exception_specification) - tree call_declarator, cv_qualifiers, exception_specification; -{ - TREE_OPERAND (call_declarator, 2) = cv_qualifiers; - TREE_TYPE (call_declarator) = exception_specification; -} - -/* Build names and nodes for overloaded operators. */ - -tree ansi_opname[LAST_CPLUS_TREE_CODE]; -tree ansi_assopname[LAST_CPLUS_TREE_CODE]; - -char * -operator_name_string (name) - tree name; -{ - char *opname = IDENTIFIER_POINTER (name) + 2; - tree *opname_table; - int i, assign; - - /* Works for builtin and user defined types. */ - if (IDENTIFIER_GLOBAL_VALUE (name) - && TREE_CODE (IDENTIFIER_GLOBAL_VALUE (name)) == TYPE_DECL) - return IDENTIFIER_POINTER (name); - - if (opname[0] == 'a' && opname[2] != '\0' && opname[2] != '_') - { - opname += 1; - assign = 1; - opname_table = ansi_assopname; - } - else - { - assign = 0; - opname_table = ansi_opname; - } - - for (i = 0; i < (int) LAST_CPLUS_TREE_CODE; i++) - { - if (opname[0] == IDENTIFIER_POINTER (opname_table[i])[2+assign] - && opname[1] == IDENTIFIER_POINTER (opname_table[i])[3+assign]) - break; - } - - if (i == LAST_CPLUS_TREE_CODE) - return ""; - - if (assign) - return assignop_tab[i]; - else - return opname_tab[i]; -} - -int interface_only; /* whether or not current file is only for - interface definitions. */ -int interface_unknown; /* whether or not we know this class - to behave according to #pragma interface. */ - -/* lexical analyzer */ - -#ifndef WCHAR_TYPE_SIZE -#ifdef INT_TYPE_SIZE -#define WCHAR_TYPE_SIZE INT_TYPE_SIZE -#else -#define WCHAR_TYPE_SIZE BITS_PER_WORD -#endif -#endif - -/* Number of bytes in a wide character. */ -#define WCHAR_BYTES (WCHAR_TYPE_SIZE / BITS_PER_UNIT) - -static int maxtoken; /* Current nominal length of token buffer. */ -char *token_buffer; /* Pointer to token buffer. - Actual allocated length is maxtoken + 2. */ - -#include "hash.h" - - -/* Nonzero tells yylex to ignore \ in string constants. */ -static int ignore_escape_flag = 0; - -static tree -get_time_identifier (name) - char *name; -{ - tree time_identifier; - int len = strlen (name); - char *buf = (char *) alloca (len + 6); - strcpy (buf, "file "); - bcopy (name, buf+5, len); - buf[len+5] = '\0'; - time_identifier = get_identifier (buf); - if (TIME_IDENTIFIER_TIME (time_identifier) == NULL_TREE) - { - push_obstacks_nochange (); - end_temporary_allocation (); - TIME_IDENTIFIER_TIME (time_identifier) = build_int_2 (0, 0); - TIME_IDENTIFIER_FILEINFO (time_identifier) - = build_int_2 (0, 1); - SET_IDENTIFIER_GLOBAL_VALUE (time_identifier, filename_times); - filename_times = time_identifier; - pop_obstacks (); - } - return time_identifier; -} - -#ifdef __GNUC__ -__inline -#endif -static int -my_get_run_time () -{ - int old_quiet_flag = quiet_flag; - int this_time; - quiet_flag = 0; - this_time = get_run_time (); - quiet_flag = old_quiet_flag; - return this_time; -} - -/* Table indexed by tree code giving a string containing a character - classifying the tree code. Possibilities are - t, d, s, c, r, <, 1 and 2. See cp/cp-tree.def for details. */ - -#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE, - -char cplus_tree_code_type[] = { - 'x', -#include "cp-tree.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, - -int cplus_tree_code_length[] = { - 0, -#include "cp-tree.def" -}; -#undef DEFTREECODE - -/* Names of tree components. - Used for printing out the tree and error messages. */ -#define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME, - -char *cplus_tree_code_name[] = { - "@@dummy", -#include "cp-tree.def" -}; -#undef DEFTREECODE - -/* toplev.c needs to call these. */ - -void -lang_init_options () -{ -#if USE_CPPLIB - cpp_reader_init (&parse_in); - parse_in.opts = &parse_options; - cpp_options_init (&parse_options); -#endif - - /* Default exceptions on. */ - flag_exceptions = 1; -} - -void -lang_init () -{ - /* the beginning of the file is a new line; check for # */ - /* With luck, we discover the real source file's name from that - and put it in input_filename. */ -#if ! USE_CPPLIB - put_back (check_newline ()); -#else - check_newline (); - yy_cur--; -#endif - if (flag_gnu_xref) GNU_xref_begin (input_filename); - init_repo (input_filename); -} - -void -lang_finish () -{ - extern int errorcount, sorrycount; - if (flag_gnu_xref) GNU_xref_end (errorcount+sorrycount); -} - -char * -lang_identify () -{ - return "cplusplus"; -} - -void -init_filename_times () -{ - this_filename_time = get_time_identifier (""); - if (flag_detailed_statistics) - { - header_time = 0; - body_time = my_get_run_time (); - TREE_INT_CST_LOW (TIME_IDENTIFIER_TIME (this_filename_time)) - = body_time; - } -} - -/* Change by Bryan Boreham, Kewill, Thu Jul 27 09:46:05 1989. - Stuck this hack in to get the files open correctly; this is called - in place of init_parse if we are an unexec'd binary. */ - -#if 0 -void -reinit_lang_specific () -{ - init_filename_times (); - reinit_search_statistics (); -} -#endif - -static int * -init_cpp_parse () -{ -#ifdef GATHER_STATISTICS -#ifdef REDUCE_LENGTH - reduce_count = (int *)malloc (sizeof (int) * (REDUCE_LENGTH + 1)); - bzero (reduce_count, sizeof (int) * (REDUCE_LENGTH + 1)); - reduce_count += 1; - token_count = (int *)malloc (sizeof (int) * (TOKEN_LENGTH + 1)); - bzero (token_count, sizeof (int) * (TOKEN_LENGTH + 1)); - token_count += 1; -#endif -#endif - return token_count; -} - -char * -init_parse (filename) - char *filename; -{ - extern int flag_no_gnu_keywords; - extern int flag_operator_names; - - int i; - -#ifdef MULTIBYTE_CHARS - /* Change to the native locale for multibyte conversions. */ - setlocale (LC_CTYPE, ""); - literal_codeset = getenv ("LANG"); -#endif - -#if USE_CPPLIB - parse_in.show_column = 1; - if (! cpp_start_read (&parse_in, filename)) - abort (); - - /* cpp_start_read always puts at least one line directive into the - token buffer. We must arrange to read it out here. */ - yy_cur = parse_in.token_buffer; - yy_lim = CPP_PWRITTEN (&parse_in); - -#else - /* Open input file. */ - if (filename == 0 || !strcmp (filename, "-")) - { - finput = stdin; - filename = "stdin"; - } - else - finput = fopen (filename, "r"); - if (finput == 0) - pfatal_with_name (filename); - -#ifdef IO_BUFFER_SIZE - setvbuf (finput, (char *) xmalloc (IO_BUFFER_SIZE), _IOFBF, IO_BUFFER_SIZE); -#endif -#endif /* !USE_CPPLIB */ - - /* Initialize the lookahead machinery. */ - init_spew (); - - /* Make identifier nodes long enough for the language-specific slots. */ - set_identifier_size (sizeof (struct lang_identifier)); - decl_printable_name = lang_printable_name; - - init_cplus_expand (); - - bcopy (cplus_tree_code_type, - tree_code_type + (int) LAST_AND_UNUSED_TREE_CODE, - (int)LAST_CPLUS_TREE_CODE - (int)LAST_AND_UNUSED_TREE_CODE); - bcopy ((char *)cplus_tree_code_length, - (char *)(tree_code_length + (int) LAST_AND_UNUSED_TREE_CODE), - (LAST_CPLUS_TREE_CODE - (int)LAST_AND_UNUSED_TREE_CODE) * sizeof (int)); - bcopy ((char *)cplus_tree_code_name, - (char *)(tree_code_name + (int) LAST_AND_UNUSED_TREE_CODE), - (LAST_CPLUS_TREE_CODE - (int)LAST_AND_UNUSED_TREE_CODE) * sizeof (char *)); - - opname_tab = (char **)oballoc ((int)LAST_CPLUS_TREE_CODE * sizeof (char *)); - bzero ((char *)opname_tab, (int)LAST_CPLUS_TREE_CODE * sizeof (char *)); - assignop_tab = (char **)oballoc ((int)LAST_CPLUS_TREE_CODE * sizeof (char *)); - bzero ((char *)assignop_tab, (int)LAST_CPLUS_TREE_CODE * sizeof (char *)); - - ansi_opname[0] = get_identifier (""); - for (i = 0; i < (int) LAST_CPLUS_TREE_CODE; i++) - { - ansi_opname[i] = ansi_opname[0]; - ansi_assopname[i] = ansi_opname[0]; - } - - ansi_opname[(int) MULT_EXPR] = get_identifier ("__ml"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) MULT_EXPR]) = 1; - ansi_opname[(int) INDIRECT_REF] = ansi_opname[(int) MULT_EXPR]; - ansi_assopname[(int) MULT_EXPR] = get_identifier ("__aml"); - IDENTIFIER_OPNAME_P (ansi_assopname[(int) MULT_EXPR]) = 1; - ansi_assopname[(int) INDIRECT_REF] = ansi_assopname[(int) MULT_EXPR]; - ansi_opname[(int) TRUNC_MOD_EXPR] = get_identifier ("__md"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) TRUNC_MOD_EXPR]) = 1; - ansi_assopname[(int) TRUNC_MOD_EXPR] = get_identifier ("__amd"); - IDENTIFIER_OPNAME_P (ansi_assopname[(int) TRUNC_MOD_EXPR]) = 1; - ansi_opname[(int) CEIL_MOD_EXPR] = ansi_opname[(int) TRUNC_MOD_EXPR]; - ansi_opname[(int) FLOOR_MOD_EXPR] = ansi_opname[(int) TRUNC_MOD_EXPR]; - ansi_opname[(int) ROUND_MOD_EXPR] = ansi_opname[(int) TRUNC_MOD_EXPR]; - ansi_opname[(int) MINUS_EXPR] = get_identifier ("__mi"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) MINUS_EXPR]) = 1; - ansi_opname[(int) NEGATE_EXPR] = ansi_opname[(int) MINUS_EXPR]; - ansi_assopname[(int) MINUS_EXPR] = get_identifier ("__ami"); - IDENTIFIER_OPNAME_P (ansi_assopname[(int) MINUS_EXPR]) = 1; - ansi_assopname[(int) NEGATE_EXPR] = ansi_assopname[(int) MINUS_EXPR]; - ansi_opname[(int) RSHIFT_EXPR] = get_identifier ("__rs"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) RSHIFT_EXPR]) = 1; - ansi_assopname[(int) RSHIFT_EXPR] = get_identifier ("__ars"); - IDENTIFIER_OPNAME_P (ansi_assopname[(int) RSHIFT_EXPR]) = 1; - ansi_opname[(int) NE_EXPR] = get_identifier ("__ne"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) NE_EXPR]) = 1; - ansi_opname[(int) GT_EXPR] = get_identifier ("__gt"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) GT_EXPR]) = 1; - ansi_opname[(int) GE_EXPR] = get_identifier ("__ge"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) GE_EXPR]) = 1; - ansi_opname[(int) BIT_IOR_EXPR] = get_identifier ("__or"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) BIT_IOR_EXPR]) = 1; - ansi_assopname[(int) BIT_IOR_EXPR] = get_identifier ("__aor"); - IDENTIFIER_OPNAME_P (ansi_assopname[(int) BIT_IOR_EXPR]) = 1; - ansi_opname[(int) TRUTH_ANDIF_EXPR] = get_identifier ("__aa"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) TRUTH_ANDIF_EXPR]) = 1; - ansi_opname[(int) TRUTH_NOT_EXPR] = get_identifier ("__nt"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) TRUTH_NOT_EXPR]) = 1; - ansi_opname[(int) PREINCREMENT_EXPR] = get_identifier ("__pp"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) PREINCREMENT_EXPR]) = 1; - ansi_opname[(int) POSTINCREMENT_EXPR] = ansi_opname[(int) PREINCREMENT_EXPR]; - ansi_opname[(int) MODIFY_EXPR] = get_identifier ("__as"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) MODIFY_EXPR]) = 1; - ansi_assopname[(int) NOP_EXPR] = ansi_opname[(int) MODIFY_EXPR]; - ansi_opname[(int) COMPOUND_EXPR] = get_identifier ("__cm"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) COMPOUND_EXPR]) = 1; - ansi_opname[(int) EXACT_DIV_EXPR] = get_identifier ("__dv"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) EXACT_DIV_EXPR]) = 1; - ansi_assopname[(int) EXACT_DIV_EXPR] = get_identifier ("__adv"); - IDENTIFIER_OPNAME_P (ansi_assopname[(int) EXACT_DIV_EXPR]) = 1; - ansi_opname[(int) TRUNC_DIV_EXPR] = ansi_opname[(int) EXACT_DIV_EXPR]; - ansi_opname[(int) CEIL_DIV_EXPR] = ansi_opname[(int) EXACT_DIV_EXPR]; - ansi_opname[(int) FLOOR_DIV_EXPR] = ansi_opname[(int) EXACT_DIV_EXPR]; - ansi_opname[(int) ROUND_DIV_EXPR] = ansi_opname[(int) EXACT_DIV_EXPR]; - ansi_opname[(int) PLUS_EXPR] = get_identifier ("__pl"); - ansi_assopname[(int) TRUNC_DIV_EXPR] = ansi_assopname[(int) EXACT_DIV_EXPR]; - ansi_assopname[(int) CEIL_DIV_EXPR] = ansi_assopname[(int) EXACT_DIV_EXPR]; - ansi_assopname[(int) FLOOR_DIV_EXPR] = ansi_assopname[(int) EXACT_DIV_EXPR]; - ansi_assopname[(int) ROUND_DIV_EXPR] = ansi_assopname[(int) EXACT_DIV_EXPR]; - IDENTIFIER_OPNAME_P (ansi_opname[(int) PLUS_EXPR]) = 1; - ansi_assopname[(int) PLUS_EXPR] = get_identifier ("__apl"); - IDENTIFIER_OPNAME_P (ansi_assopname[(int) PLUS_EXPR]) = 1; - ansi_opname[(int) CONVERT_EXPR] = ansi_opname[(int) PLUS_EXPR]; - ansi_assopname[(int) CONVERT_EXPR] = ansi_assopname[(int) PLUS_EXPR]; - ansi_opname[(int) LSHIFT_EXPR] = get_identifier ("__ls"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) LSHIFT_EXPR]) = 1; - ansi_assopname[(int) LSHIFT_EXPR] = get_identifier ("__als"); - IDENTIFIER_OPNAME_P (ansi_assopname[(int) LSHIFT_EXPR]) = 1; - ansi_opname[(int) EQ_EXPR] = get_identifier ("__eq"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) EQ_EXPR]) = 1; - ansi_opname[(int) LT_EXPR] = get_identifier ("__lt"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) LT_EXPR]) = 1; - ansi_opname[(int) LE_EXPR] = get_identifier ("__le"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) LE_EXPR]) = 1; - ansi_opname[(int) BIT_AND_EXPR] = get_identifier ("__ad"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) BIT_AND_EXPR]) = 1; - ansi_assopname[(int) BIT_AND_EXPR] = get_identifier ("__aad"); - IDENTIFIER_OPNAME_P (ansi_assopname[(int) BIT_AND_EXPR]) = 1; - ansi_opname[(int) ADDR_EXPR] = ansi_opname[(int) BIT_AND_EXPR]; - ansi_assopname[(int) ADDR_EXPR] = ansi_assopname[(int) BIT_AND_EXPR]; - ansi_opname[(int) BIT_XOR_EXPR] = get_identifier ("__er"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) BIT_XOR_EXPR]) = 1; - ansi_assopname[(int) BIT_XOR_EXPR] = get_identifier ("__aer"); - IDENTIFIER_OPNAME_P (ansi_assopname[(int) BIT_XOR_EXPR]) = 1; - ansi_opname[(int) TRUTH_ORIF_EXPR] = get_identifier ("__oo"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) TRUTH_ORIF_EXPR]) = 1; - ansi_opname[(int) BIT_NOT_EXPR] = get_identifier ("__co"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) BIT_NOT_EXPR]) = 1; - ansi_opname[(int) PREDECREMENT_EXPR] = get_identifier ("__mm"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) PREDECREMENT_EXPR]) = 1; - ansi_opname[(int) POSTDECREMENT_EXPR] = ansi_opname[(int) PREDECREMENT_EXPR]; - ansi_opname[(int) COMPONENT_REF] = get_identifier ("__rf"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) COMPONENT_REF]) = 1; - ansi_opname[(int) MEMBER_REF] = get_identifier ("__rm"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) MEMBER_REF]) = 1; - ansi_opname[(int) CALL_EXPR] = get_identifier ("__cl"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) CALL_EXPR]) = 1; - ansi_opname[(int) ARRAY_REF] = get_identifier ("__vc"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) ARRAY_REF]) = 1; - ansi_opname[(int) NEW_EXPR] = get_identifier ("__nw"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) NEW_EXPR]) = 1; - ansi_opname[(int) DELETE_EXPR] = get_identifier ("__dl"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) DELETE_EXPR]) = 1; - ansi_opname[(int) VEC_NEW_EXPR] = get_identifier ("__vn"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) VEC_NEW_EXPR]) = 1; - ansi_opname[(int) VEC_DELETE_EXPR] = get_identifier ("__vd"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) VEC_DELETE_EXPR]) = 1; - ansi_opname[(int) TYPE_EXPR] = get_identifier (OPERATOR_TYPENAME_FORMAT); - IDENTIFIER_OPNAME_P (ansi_opname[(int) TYPE_EXPR]) = 1; - - /* This is not true: these operators are not defined in ANSI, - but we need them anyway. */ - ansi_opname[(int) MIN_EXPR] = get_identifier ("__mn"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) MIN_EXPR]) = 1; - ansi_opname[(int) MAX_EXPR] = get_identifier ("__mx"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) MAX_EXPR]) = 1; - ansi_opname[(int) COND_EXPR] = get_identifier ("__cn"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) COND_EXPR]) = 1; - ansi_opname[(int) SIZEOF_EXPR] = get_identifier ("__sz"); - IDENTIFIER_OPNAME_P (ansi_opname[(int) SIZEOF_EXPR]) = 1; - - init_method (); - init_error (); - gcc_obstack_init (&inline_text_obstack); - inline_text_firstobj = (char *) obstack_alloc (&inline_text_obstack, 0); - - /* Start it at 0, because check_newline is called at the very beginning - and will increment it to 1. */ - lineno = 0; - input_filename = ""; - current_function_decl = NULL; - - maxtoken = 40; - token_buffer = (char *) xmalloc (maxtoken + 2); - - ridpointers[(int) RID_INT] = get_identifier ("int"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_INT], - build_tree_list (NULL_TREE, ridpointers[(int) RID_INT])); - ridpointers[(int) RID_BOOL] = get_identifier ("bool"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_BOOL], - build_tree_list (NULL_TREE, ridpointers[(int) RID_BOOL])); - ridpointers[(int) RID_CHAR] = get_identifier ("char"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_CHAR], - build_tree_list (NULL_TREE, ridpointers[(int) RID_CHAR])); - ridpointers[(int) RID_VOID] = get_identifier ("void"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_VOID], - build_tree_list (NULL_TREE, ridpointers[(int) RID_VOID])); - ridpointers[(int) RID_FLOAT] = get_identifier ("float"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_FLOAT], - build_tree_list (NULL_TREE, ridpointers[(int) RID_FLOAT])); - ridpointers[(int) RID_DOUBLE] = get_identifier ("double"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_DOUBLE], - build_tree_list (NULL_TREE, ridpointers[(int) RID_DOUBLE])); - ridpointers[(int) RID_SHORT] = get_identifier ("short"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_SHORT], - build_tree_list (NULL_TREE, ridpointers[(int) RID_SHORT])); - ridpointers[(int) RID_LONG] = get_identifier ("long"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_LONG], - build_tree_list (NULL_TREE, ridpointers[(int) RID_LONG])); - ridpointers[(int) RID_UNSIGNED] = get_identifier ("unsigned"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_UNSIGNED], - build_tree_list (NULL_TREE, ridpointers[(int) RID_UNSIGNED])); - ridpointers[(int) RID_SIGNED] = get_identifier ("signed"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_SIGNED], - build_tree_list (NULL_TREE, ridpointers[(int) RID_SIGNED])); - ridpointers[(int) RID_INLINE] = get_identifier ("inline"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_INLINE], - build_tree_list (NULL_TREE, ridpointers[(int) RID_INLINE])); - ridpointers[(int) RID_CONST] = get_identifier ("const"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_CONST], - build_tree_list (NULL_TREE, ridpointers[(int) RID_CONST])); - ridpointers[(int) RID_VOLATILE] = get_identifier ("volatile"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_VOLATILE], - build_tree_list (NULL_TREE, ridpointers[(int) RID_VOLATILE])); - ridpointers[(int) RID_RESTRICT] = get_identifier ("__restrict"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_RESTRICT], - build_tree_list (NULL_TREE, ridpointers[(int) RID_RESTRICT])); - ridpointers[(int) RID_AUTO] = get_identifier ("auto"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_AUTO], - build_tree_list (NULL_TREE, ridpointers[(int) RID_AUTO])); - ridpointers[(int) RID_STATIC] = get_identifier ("static"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_STATIC], - build_tree_list (NULL_TREE, ridpointers[(int) RID_STATIC])); - ridpointers[(int) RID_EXTERN] = get_identifier ("extern"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_EXTERN], - build_tree_list (NULL_TREE, ridpointers[(int) RID_EXTERN])); - ridpointers[(int) RID_TYPEDEF] = get_identifier ("typedef"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_TYPEDEF], - build_tree_list (NULL_TREE, ridpointers[(int) RID_TYPEDEF])); - ridpointers[(int) RID_REGISTER] = get_identifier ("register"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_REGISTER], - build_tree_list (NULL_TREE, ridpointers[(int) RID_REGISTER])); - ridpointers[(int) RID_COMPLEX] = get_identifier ("__complex"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_COMPLEX], - build_tree_list (NULL_TREE, ridpointers[(int) RID_COMPLEX])); - - /* C++ extensions. These are probably not correctly named. */ - ridpointers[(int) RID_WCHAR] = get_identifier ("__wchar_t"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_WCHAR], - build_tree_list (NULL_TREE, ridpointers[(int) RID_WCHAR])); - class_type_node = build_int_2 (class_type, 0); - TREE_TYPE (class_type_node) = class_type_node; - ridpointers[(int) RID_CLASS] = class_type_node; - - record_type_node = build_int_2 (record_type, 0); - TREE_TYPE (record_type_node) = record_type_node; - ridpointers[(int) RID_RECORD] = record_type_node; - - union_type_node = build_int_2 (union_type, 0); - TREE_TYPE (union_type_node) = union_type_node; - ridpointers[(int) RID_UNION] = union_type_node; - - enum_type_node = build_int_2 (enum_type, 0); - TREE_TYPE (enum_type_node) = enum_type_node; - ridpointers[(int) RID_ENUM] = enum_type_node; - - ridpointers[(int) RID_VIRTUAL] = get_identifier ("virtual"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_VIRTUAL], - build_tree_list (NULL_TREE, ridpointers[(int) RID_VIRTUAL])); - ridpointers[(int) RID_EXPLICIT] = get_identifier ("explicit"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_EXPLICIT], - build_tree_list (NULL_TREE, ridpointers[(int) RID_EXPLICIT])); - ridpointers[(int) RID_EXPORT] = get_identifier ("export"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_EXPORT], - build_tree_list (NULL_TREE, ridpointers[(int) RID_EXPORT])); - ridpointers[(int) RID_FRIEND] = get_identifier ("friend"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_FRIEND], - build_tree_list (NULL_TREE, ridpointers[(int) RID_FRIEND])); - - ridpointers[(int) RID_PUBLIC] = get_identifier ("public"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_PUBLIC], - build_tree_list (NULL_TREE, ridpointers[(int) RID_PUBLIC])); - ridpointers[(int) RID_PRIVATE] = get_identifier ("private"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_PRIVATE], - build_tree_list (NULL_TREE, ridpointers[(int) RID_PRIVATE])); - ridpointers[(int) RID_PROTECTED] = get_identifier ("protected"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_PROTECTED], - build_tree_list (NULL_TREE, ridpointers[(int) RID_PROTECTED])); - ridpointers[(int) RID_TEMPLATE] = get_identifier ("template"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_TEMPLATE], - build_tree_list (NULL_TREE, ridpointers[(int) RID_TEMPLATE])); - /* This is for ANSI C++. */ - ridpointers[(int) RID_MUTABLE] = get_identifier ("mutable"); - SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_MUTABLE], - build_tree_list (NULL_TREE, ridpointers[(int) RID_MUTABLE])); - - /* Signature handling extensions. */ - signature_type_node = build_int_2 (signature_type, 0); - TREE_TYPE (signature_type_node) = signature_type_node; - ridpointers[(int) RID_SIGNATURE] = signature_type_node; - - /* Create the built-in __null node. Note that we can't yet call for - type_for_size here because integer_type_node and so forth are not - set up. Therefore, we don't set the type of these nodes until - init_decl_processing. */ - null_node = build_int_2 (0, 0); - ridpointers[RID_NULL] = null_node; - - opname_tab[(int) COMPONENT_REF] = "->"; - opname_tab[(int) MEMBER_REF] = "->*"; - opname_tab[(int) INDIRECT_REF] = "*"; - opname_tab[(int) ARRAY_REF] = "[]"; - opname_tab[(int) MODIFY_EXPR] = "="; - opname_tab[(int) NEW_EXPR] = "new"; - opname_tab[(int) DELETE_EXPR] = "delete"; - opname_tab[(int) VEC_NEW_EXPR] = "new []"; - opname_tab[(int) VEC_DELETE_EXPR] = "delete []"; - opname_tab[(int) COND_EXPR] = "?:"; - opname_tab[(int) CALL_EXPR] = "()"; - opname_tab[(int) PLUS_EXPR] = "+"; - opname_tab[(int) MINUS_EXPR] = "-"; - opname_tab[(int) MULT_EXPR] = "*"; - opname_tab[(int) TRUNC_DIV_EXPR] = "/"; - opname_tab[(int) CEIL_DIV_EXPR] = "(ceiling /)"; - opname_tab[(int) FLOOR_DIV_EXPR] = "(floor /)"; - opname_tab[(int) ROUND_DIV_EXPR] = "(round /)"; - opname_tab[(int) TRUNC_MOD_EXPR] = "%"; - opname_tab[(int) CEIL_MOD_EXPR] = "(ceiling %)"; - opname_tab[(int) FLOOR_MOD_EXPR] = "(floor %)"; - opname_tab[(int) ROUND_MOD_EXPR] = "(round %)"; - opname_tab[(int) NEGATE_EXPR] = "-"; - opname_tab[(int) MIN_EXPR] = "?"; - opname_tab[(int) ABS_EXPR] = "abs"; - opname_tab[(int) FFS_EXPR] = "ffs"; - opname_tab[(int) LSHIFT_EXPR] = "<<"; - opname_tab[(int) RSHIFT_EXPR] = ">>"; - opname_tab[(int) BIT_IOR_EXPR] = "|"; - opname_tab[(int) BIT_XOR_EXPR] = "^"; - opname_tab[(int) BIT_AND_EXPR] = "&"; - opname_tab[(int) BIT_ANDTC_EXPR] = "&~"; - opname_tab[(int) BIT_NOT_EXPR] = "~"; - opname_tab[(int) TRUTH_ANDIF_EXPR] = "&&"; - opname_tab[(int) TRUTH_ORIF_EXPR] = "||"; - opname_tab[(int) TRUTH_AND_EXPR] = "strict &&"; - opname_tab[(int) TRUTH_OR_EXPR] = "strict ||"; - opname_tab[(int) TRUTH_NOT_EXPR] = "!"; - opname_tab[(int) LT_EXPR] = "<"; - opname_tab[(int) LE_EXPR] = "<="; - opname_tab[(int) GT_EXPR] = ">"; - opname_tab[(int) GE_EXPR] = ">="; - opname_tab[(int) EQ_EXPR] = "=="; - opname_tab[(int) NE_EXPR] = "!="; - opname_tab[(int) IN_EXPR] = "in"; - opname_tab[(int) RANGE_EXPR] = "..."; - opname_tab[(int) CONVERT_EXPR] = "+"; - opname_tab[(int) ADDR_EXPR] = "&"; - opname_tab[(int) PREDECREMENT_EXPR] = "--"; - opname_tab[(int) PREINCREMENT_EXPR] = "++"; - opname_tab[(int) POSTDECREMENT_EXPR] = "--"; - opname_tab[(int) POSTINCREMENT_EXPR] = "++"; - opname_tab[(int) COMPOUND_EXPR] = ","; - - assignop_tab[(int) NOP_EXPR] = "="; - assignop_tab[(int) PLUS_EXPR] = "+="; - assignop_tab[(int) CONVERT_EXPR] = "+="; - assignop_tab[(int) MINUS_EXPR] = "-="; - assignop_tab[(int) NEGATE_EXPR] = "-="; - assignop_tab[(int) MULT_EXPR] = "*="; - assignop_tab[(int) INDIRECT_REF] = "*="; - assignop_tab[(int) TRUNC_DIV_EXPR] = "/="; - assignop_tab[(int) EXACT_DIV_EXPR] = "(exact /=)"; - assignop_tab[(int) CEIL_DIV_EXPR] = "(ceiling /=)"; - assignop_tab[(int) FLOOR_DIV_EXPR] = "(floor /=)"; - assignop_tab[(int) ROUND_DIV_EXPR] = "(round /=)"; - assignop_tab[(int) TRUNC_MOD_EXPR] = "%="; - assignop_tab[(int) CEIL_MOD_EXPR] = "(ceiling %=)"; - assignop_tab[(int) FLOOR_MOD_EXPR] = "(floor %=)"; - assignop_tab[(int) ROUND_MOD_EXPR] = "(round %=)"; - assignop_tab[(int) MIN_EXPR] = "?="; - assignop_tab[(int) LSHIFT_EXPR] = "<<="; - assignop_tab[(int) RSHIFT_EXPR] = ">>="; - assignop_tab[(int) BIT_IOR_EXPR] = "|="; - assignop_tab[(int) BIT_XOR_EXPR] = "^="; - assignop_tab[(int) BIT_AND_EXPR] = "&="; - assignop_tab[(int) ADDR_EXPR] = "&="; - - init_filename_times (); - - /* Some options inhibit certain reserved words. - Clear those words out of the hash table so they won't be recognized. */ -#define UNSET_RESERVED_WORD(STRING) \ - do { struct resword *s = is_reserved_word (STRING, sizeof (STRING) - 1); \ - if (s) s->name = ""; } while (0) - -#if 0 - /* let's parse things, and if they use it, then give them an error. */ - if (!flag_exceptions) - { - UNSET_RESERVED_WORD ("throw"); - UNSET_RESERVED_WORD ("try"); - UNSET_RESERVED_WORD ("catch"); - } -#endif - - if (!flag_rtti || flag_no_gnu_keywords) - { - UNSET_RESERVED_WORD ("classof"); - UNSET_RESERVED_WORD ("headof"); - } - - if (! flag_handle_signatures || flag_no_gnu_keywords) - { - /* Easiest way to not recognize signature - handling extensions... */ - UNSET_RESERVED_WORD ("signature"); - UNSET_RESERVED_WORD ("sigof"); - } - if (flag_no_asm || flag_no_gnu_keywords) - UNSET_RESERVED_WORD ("typeof"); - if (! flag_operator_names) - { - /* These are new ANSI keywords that may break code. */ - UNSET_RESERVED_WORD ("and"); - UNSET_RESERVED_WORD ("and_eq"); - UNSET_RESERVED_WORD ("bitand"); - UNSET_RESERVED_WORD ("bitor"); - UNSET_RESERVED_WORD ("compl"); - UNSET_RESERVED_WORD ("not"); - UNSET_RESERVED_WORD ("not_eq"); - UNSET_RESERVED_WORD ("or"); - UNSET_RESERVED_WORD ("or_eq"); - UNSET_RESERVED_WORD ("xor"); - UNSET_RESERVED_WORD ("xor_eq"); - } - - token_count = init_cpp_parse (); - interface_unknown = 1; - - return filename; -} - -void -finish_parse () -{ -#if USE_CPPLIB - cpp_finish (&parse_in); -#else - fclose (finput); -#endif -} - -void -reinit_parse_for_function () -{ - current_base_init_list = NULL_TREE; - current_member_init_list = NULL_TREE; -} - -#ifdef __GNUC__ -__inline -#endif -void -yyprint (file, yychar, yylval) - FILE *file; - int yychar; - YYSTYPE yylval; -{ - tree t; - switch (yychar) - { - case IDENTIFIER: - case TYPENAME: - case TYPESPEC: - case PTYPENAME: - case IDENTIFIER_DEFN: - case TYPENAME_DEFN: - case PTYPENAME_DEFN: - case SCSPEC: - case PRE_PARSED_CLASS_DECL: - t = yylval.ttype; - if (TREE_CODE (t) == TYPE_DECL || TREE_CODE (t) == TEMPLATE_DECL) - { - fprintf (file, " `%s'", IDENTIFIER_POINTER (DECL_NAME (t))); - break; - } - my_friendly_assert (TREE_CODE (t) == IDENTIFIER_NODE, 224); - if (IDENTIFIER_POINTER (t)) - fprintf (file, " `%s'", IDENTIFIER_POINTER (t)); - break; - case AGGR: - if (yylval.ttype == class_type_node) - fprintf (file, " `class'"); - else if (yylval.ttype == record_type_node) - fprintf (file, " `struct'"); - else if (yylval.ttype == union_type_node) - fprintf (file, " `union'"); - else if (yylval.ttype == enum_type_node) - fprintf (file, " `enum'"); - else if (yylval.ttype == signature_type_node) - fprintf (file, " `signature'"); - else - my_friendly_abort (80); - break; - } -} - -#if defined(GATHER_STATISTICS) && defined(REDUCE_LENGTH) -static int *reduce_count; -#endif - -int *token_count; - -#if 0 -#define REDUCE_LENGTH (sizeof (yyr2) / sizeof (yyr2[0])) -#define TOKEN_LENGTH (256 + sizeof (yytname) / sizeof (yytname[0])) -#endif - -#ifdef GATHER_STATISTICS -#ifdef REDUCE_LENGTH -void -yyhook (yyn) - int yyn; -{ - reduce_count[yyn] += 1; -} - -static int -reduce_cmp (p, q) - int *p, *q; -{ - return reduce_count[*q] - reduce_count[*p]; -} - -static int -token_cmp (p, q) - int *p, *q; -{ - return token_count[*q] - token_count[*p]; -} -#endif -#endif - -void -print_parse_statistics () -{ -#ifdef GATHER_STATISTICS -#ifdef REDUCE_LENGTH -#if YYDEBUG != 0 - int i; - int maxlen = REDUCE_LENGTH; - unsigned *sorted; - - if (reduce_count[-1] == 0) - return; - - if (TOKEN_LENGTH > REDUCE_LENGTH) - maxlen = TOKEN_LENGTH; - sorted = (unsigned *) alloca (sizeof (int) * maxlen); - - for (i = 0; i < TOKEN_LENGTH; i++) - sorted[i] = i; - qsort (sorted, TOKEN_LENGTH, sizeof (int), token_cmp); - for (i = 0; i < TOKEN_LENGTH; i++) - { - int idx = sorted[i]; - if (token_count[idx] == 0) - break; - if (token_count[idx] < token_count[-1]) - break; - fprintf (stderr, "token %d, `%s', count = %d\n", - idx, yytname[YYTRANSLATE (idx)], token_count[idx]); - } - fprintf (stderr, "\n"); - for (i = 0; i < REDUCE_LENGTH; i++) - sorted[i] = i; - qsort (sorted, REDUCE_LENGTH, sizeof (int), reduce_cmp); - for (i = 0; i < REDUCE_LENGTH; i++) - { - int idx = sorted[i]; - if (reduce_count[idx] == 0) - break; - if (reduce_count[idx] < reduce_count[-1]) - break; - fprintf (stderr, "rule %d, line %d, count = %d\n", - idx, yyrline[idx], reduce_count[idx]); - } - fprintf (stderr, "\n"); -#endif -#endif -#endif -} - -/* Sets the value of the 'yydebug' variable to VALUE. - This is a function so we don't have to have YYDEBUG defined - in order to build the compiler. */ - -void -set_yydebug (value) - int value; -{ -#if YYDEBUG != 0 - extern int yydebug; - yydebug = value; -#else - warning ("YYDEBUG not defined."); -#endif -} - - -/* Functions and data structures for #pragma interface. - - `#pragma implementation' means that the main file being compiled - is considered to implement (provide) the classes that appear in - its main body. I.e., if this is file "foo.cc", and class `bar' - is defined in "foo.cc", then we say that "foo.cc implements bar". - - All main input files "implement" themselves automagically. - - `#pragma interface' means that unless this file (of the form "foo.h" - is not presently being included by file "foo.cc", the - CLASSTYPE_INTERFACE_ONLY bit gets set. The effect is that none - of the vtables nor any of the inline functions defined in foo.h - will ever be output. - - There are cases when we want to link files such as "defs.h" and - "main.cc". In this case, we give "defs.h" a `#pragma interface', - and "main.cc" has `#pragma implementation "defs.h"'. */ - -struct impl_files -{ - char *filename; - struct impl_files *next; -}; - -static struct impl_files *impl_file_chain; - -/* Helper function to load global variables with interface - information. */ - -void -extract_interface_info () -{ - tree fileinfo = 0; - - if (flag_alt_external_templates) - { - struct tinst_level *til = tinst_for_decl (); - - if (til) - fileinfo = get_time_identifier (til->file); - } - if (!fileinfo) - fileinfo = get_time_identifier (input_filename); - fileinfo = TIME_IDENTIFIER_FILEINFO (fileinfo); - interface_only = TREE_INT_CST_LOW (fileinfo); - interface_unknown = TREE_INT_CST_HIGH (fileinfo); -} - -/* Return nonzero if S is not considered part of an - INTERFACE/IMPLEMENTATION pair. Otherwise, return 0. */ - -static int -interface_strcmp (s) - char *s; -{ - /* Set the interface/implementation bits for this scope. */ - struct impl_files *ifiles; - char *s1; - - for (ifiles = impl_file_chain; ifiles; ifiles = ifiles->next) - { - char *t1 = ifiles->filename; - s1 = s; - - if (*s1 != *t1 || *s1 == 0) - continue; - - while (*s1 == *t1 && *s1 != 0) - s1++, t1++; - - /* A match. */ - if (*s1 == *t1) - return 0; - - /* Don't get faked out by xxx.yyy.cc vs xxx.zzz.cc. */ - if (index (s1, '.') || index (t1, '.')) - continue; - - if (*s1 == '\0' || s1[-1] != '.' || t1[-1] != '.') - continue; - - /* A match. */ - return 0; - } - - /* No matches. */ - return 1; -} - -static void -set_typedecl_interface_info (prev, vars) - tree prev ATTRIBUTE_UNUSED, vars; -{ - tree id = get_time_identifier (DECL_SOURCE_FILE (vars)); - tree fileinfo = TIME_IDENTIFIER_FILEINFO (id); - tree type = TREE_TYPE (vars); - - CLASSTYPE_INTERFACE_ONLY (type) = TREE_INT_CST_LOW (fileinfo) - = interface_strcmp (file_name_nondirectory (DECL_SOURCE_FILE (vars))); -} - -static int -set_vardecl_interface_info (prev, vars) - tree prev, vars; -{ - tree type = DECL_CONTEXT (vars); - - if (CLASSTYPE_INTERFACE_KNOWN (type)) - { - if (CLASSTYPE_INTERFACE_ONLY (type)) - set_typedecl_interface_info (prev, TYPE_MAIN_DECL (type)); - else - CLASSTYPE_VTABLE_NEEDS_WRITING (type) = 1; - DECL_EXTERNAL (vars) = CLASSTYPE_INTERFACE_ONLY (type); - TREE_PUBLIC (vars) = 1; - return 1; - } - return 0; -} - -/* Set up the state required to correctly handle the definition of the - inline function whose preparsed state has been saved in PI. */ - -static void -begin_definition_of_inclass_inline (pi) - struct pending_inline* pi; -{ - tree context; - - if (!pi->fndecl) - return; - - /* If this is an inline function in a local class, we must make sure - that we save all pertinent information about the function - surrounding the local class. */ - context = hack_decl_function_context (pi->fndecl); - if (context) - push_cp_function_context (context); - - feed_input (pi->buf, pi->len); - lineno = pi->lineno; - input_filename = pi->filename; - yychar = PRE_PARSED_FUNCTION_DECL; - yylval.ttype = build_tree_list ((tree) pi, pi->fndecl); - /* Pass back a handle to the rest of the inline functions, so that they - can be processed later. */ - DECL_PENDING_INLINE_INFO (pi->fndecl) = 0; - interface_unknown = pi->interface == 1; - interface_only = pi->interface == 0; -} - -/* Called from the top level: if there are any pending inlines to - do, set up to process them now. This function sets up the first function - to be parsed; after it has been, the rule for fndef in parse.y will - call process_next_inline to start working on the next one. */ - -void -do_pending_inlines () -{ - struct pending_inline *t; - - /* Oops, we're still dealing with the last batch. */ - if (yychar == PRE_PARSED_FUNCTION_DECL) - return; - - /* Reverse the pending inline functions, since - they were cons'd instead of appended. */ - { - struct pending_inline *prev = 0, *tail; - t = pending_inlines; - pending_inlines = 0; - - for (; t; t = tail) - { - tail = t->next; - t->next = prev; - t->deja_vu = 1; - prev = t; - } - t = prev; - } - - if (t == 0) - return; - - /* Now start processing the first inline function. */ - begin_definition_of_inclass_inline (t); -} - -static int nextchar = -1; - -/* Called from the fndecl rule in the parser when the function just parsed - was declared using a PRE_PARSED_FUNCTION_DECL (i.e. came from - do_pending_inlines). */ - -void -process_next_inline (t) - tree t; -{ - tree context; - struct pending_inline *i = (struct pending_inline *) TREE_PURPOSE (t); - context = hack_decl_function_context (i->fndecl); - if (context) - pop_cp_function_context (context); - i = i->next; - if (yychar == YYEMPTY) - yychar = yylex (); - if (yychar != END_OF_SAVED_INPUT) - { - error ("parse error at end of saved function text"); - - /* restore_pending_input will abort unless yychar is either - END_OF_SAVED_INPUT or YYEMPTY; since we already know we're - hosed, feed back YYEMPTY. We also need to discard nextchar, - since that may have gotten set as well. */ - nextchar = -1; - } - yychar = YYEMPTY; - end_input (); - if (i) - begin_definition_of_inclass_inline (i); - else - extract_interface_info (); -} - -/* Since inline methods can refer to text which has not yet been seen, - we store the text of the method in a structure which is placed in the - DECL_PENDING_INLINE_INFO field of the FUNCTION_DECL. - After parsing the body of the class definition, the FUNCTION_DECL's are - scanned to see which ones have this field set. Those are then digested - one at a time. - - This function's FUNCTION_DECL will have a bit set in its common so - that we know to watch out for it. */ - -static void -consume_string (this_obstack, matching_char) - register struct obstack *this_obstack; - int matching_char; -{ - register int c; - int starting_lineno = lineno; - do - { - c = getch (); - if (c == EOF) - { - int save_lineno = lineno; - lineno = starting_lineno; - if (matching_char == '"') - error ("end of file encountered inside string constant"); - else - error ("end of file encountered inside character constant"); - lineno = save_lineno; - return; - } - if (c == '\\') - { - obstack_1grow (this_obstack, c); - c = getch (); - obstack_1grow (this_obstack, c); - - /* Make sure we continue the loop */ - c = 0; - continue; - } - if (c == '\n') - { - if (pedantic) - pedwarn ("ANSI C++ forbids newline in string constant"); - lineno++; - } - obstack_1grow (this_obstack, c); - } - while (c != matching_char); -} - -static int nextyychar = YYEMPTY; -static YYSTYPE nextyylval; - -struct pending_input { - int nextchar, yychar, nextyychar, eof; - YYSTYPE yylval, nextyylval; - struct obstack token_obstack; - int first_token; -}; - -struct pending_input * -save_pending_input () -{ - struct pending_input *p; - p = (struct pending_input *) xmalloc (sizeof (struct pending_input)); - p->nextchar = nextchar; - p->yychar = yychar; - p->nextyychar = nextyychar; - p->yylval = yylval; - p->nextyylval = nextyylval; - p->eof = end_of_file; - yychar = nextyychar = YYEMPTY; - nextchar = -1; - p->first_token = first_token; - p->token_obstack = token_obstack; - - first_token = 0; - gcc_obstack_init (&token_obstack); - end_of_file = 0; - return p; -} - -void -restore_pending_input (p) - struct pending_input *p; -{ - my_friendly_assert (nextchar == -1, 229); - nextchar = p->nextchar; - my_friendly_assert (yychar == YYEMPTY || yychar == END_OF_SAVED_INPUT, 230); - yychar = p->yychar; - my_friendly_assert (nextyychar == YYEMPTY, 231); - nextyychar = p->nextyychar; - yylval = p->yylval; - nextyylval = p->nextyylval; - first_token = p->first_token; - obstack_free (&token_obstack, (char *) 0); - token_obstack = p->token_obstack; - end_of_file = p->eof; - free (p); -} - -/* Unget character CH from the input stream. - If RESCAN is non-zero, then we want to `see' this - character as the next input token. */ - -void -yyungetc (ch, rescan) - int ch; - int rescan; -{ - /* Unget a character from the input stream. */ - if (yychar == YYEMPTY || rescan == 0) - { - if (nextchar >= 0) - put_back (nextchar); - nextchar = ch; - } - else - { - my_friendly_assert (nextyychar == YYEMPTY, 232); - nextyychar = yychar; - nextyylval = yylval; - yychar = ch; - } -} - -void -clear_inline_text_obstack () -{ - obstack_free (&inline_text_obstack, inline_text_firstobj); -} - -/* This function stores away the text for an inline function that should - be processed later. It decides how much later, and may need to move - the info between obstacks; therefore, the caller should not refer to - the T parameter after calling this function. */ - -static void -store_pending_inline (decl, t) - tree decl; - struct pending_inline *t; -{ - t->fndecl = decl; - DECL_PENDING_INLINE_INFO (decl) = t; - - /* Because we use obstacks, we must process these in precise order. */ - t->next = pending_inlines; - pending_inlines = t; -} - -void -reinit_parse_for_method (yychar, decl) - int yychar; - tree decl; -{ - int len; - int starting_lineno = lineno; - char *starting_filename = input_filename; - - reinit_parse_for_block (yychar, &inline_text_obstack); - - len = obstack_object_size (&inline_text_obstack); - current_base_init_list = NULL_TREE; - current_member_init_list = NULL_TREE; - if (decl == void_type_node - || (current_class_type && TYPE_REDEFINED (current_class_type))) - { - /* Happens when we get two declarations of the same - function in the same scope. */ - char *buf = obstack_finish (&inline_text_obstack); - obstack_free (&inline_text_obstack, buf); - return; - } - else - { - struct pending_inline *t; - char *buf = obstack_finish (&inline_text_obstack); - - t = (struct pending_inline *) obstack_alloc (&inline_text_obstack, - sizeof (struct pending_inline)); - t->lineno = starting_lineno; - t->filename = starting_filename; - t->token = YYEMPTY; - t->token_value = 0; - t->buf = buf; - t->len = len; - t->deja_vu = 0; -#if 0 - if (interface_unknown && processing_template_defn && flag_external_templates && ! DECL_IN_SYSTEM_HEADER (decl)) - warn_if_unknown_interface (decl); -#endif - t->interface = (interface_unknown ? 1 : (interface_only ? 0 : 2)); - store_pending_inline (decl, t); - } -} - -/* Consume a block -- actually, a method beginning - with `:' or `{' -- and save it away on the specified obstack. */ - -void -reinit_parse_for_block (pyychar, obstackp) - int pyychar; - struct obstack *obstackp; -{ - register int c = 0; - int blev = 1; - int starting_lineno = lineno; - char *starting_filename = input_filename; - int len; - int look_for_semicolon = 0; - int look_for_lbrac = 0; - - if (pyychar == '{') - obstack_1grow (obstackp, '{'); - else if (pyychar == '=') - look_for_semicolon = 1; - else if (pyychar == ':') - { - obstack_1grow (obstackp, pyychar); - /* Add a space so we don't get confused by ': ::A(20)'. */ - obstack_1grow (obstackp, ' '); - look_for_lbrac = 1; - blev = 0; - } - else if (pyychar == RETURN) - { - obstack_grow (obstackp, "return", 6); - look_for_lbrac = 1; - blev = 0; - } - else if (pyychar == TRY) - { - obstack_grow (obstackp, "try", 3); - look_for_lbrac = 1; - blev = 0; - } - else - { - yyerror ("parse error in method specification"); - obstack_1grow (obstackp, '{'); - } - - if (nextchar != EOF) - { - c = nextchar; - nextchar = EOF; - } - else - c = getch (); - - while (c != EOF) - { - int this_lineno = lineno; - - c = skip_white_space (c); - - /* Don't lose our cool if there are lots of comments. */ - if (lineno == this_lineno + 1) - obstack_1grow (obstackp, '\n'); - else if (lineno == this_lineno) - ; - else if (lineno - this_lineno < 10) - { - int i; - for (i = lineno - this_lineno; i > 0; i--) - obstack_1grow (obstackp, '\n'); - } - else - { - char buf[16]; - sprintf (buf, "\n# %d \"", lineno); - len = strlen (buf); - obstack_grow (obstackp, buf, len); - - len = strlen (input_filename); - obstack_grow (obstackp, input_filename, len); - obstack_1grow (obstackp, '\"'); - obstack_1grow (obstackp, '\n'); - } - - while (c > ' ') /* ASCII dependent... */ - { - obstack_1grow (obstackp, c); - if (c == '{') - { - look_for_lbrac = 0; - blev++; - } - else if (c == '}') - { - blev--; - if (blev == 0 && !look_for_semicolon) - { - if (pyychar == TRY) - { - if (peekyylex () == CATCH) - { - yylex (); - obstack_grow (obstackp, " catch ", 7); - look_for_lbrac = 1; - } - else - { - yychar = '{'; - goto done; - } - } - else - { - goto done; - } - } - } - else if (c == '\\') - { - /* Don't act on the next character...e.g, doing an escaped - double-quote. */ - c = getch (); - if (c == EOF) - { - error_with_file_and_line (starting_filename, - starting_lineno, - "end of file read inside definition"); - goto done; - } - obstack_1grow (obstackp, c); - } - else if (c == '\"') - consume_string (obstackp, c); - else if (c == '\'') - consume_string (obstackp, c); - else if (c == ';') - { - if (look_for_lbrac) - { - error ("function body for constructor missing"); - obstack_1grow (obstackp, '{'); - obstack_1grow (obstackp, '}'); - len += 2; - goto done; - } - else if (look_for_semicolon && blev == 0) - goto done; - } - c = getch (); - } - - if (c == EOF) - { - error_with_file_and_line (starting_filename, - starting_lineno, - "end of file read inside definition"); - goto done; - } - else if (c != '\n') - { - obstack_1grow (obstackp, c); - c = getch (); - } - } - done: - obstack_1grow (obstackp, '\0'); -} - -/* Consume a no-commas expression -- actually, a default argument -- and - save it away on the specified obstack. */ - -static void -reinit_parse_for_expr (obstackp) - struct obstack *obstackp; -{ - register int c = 0; - int starting_lineno = lineno; - char *starting_filename = input_filename; - int len; - int plev = 0; - - if (nextchar != EOF) - { - c = nextchar; - nextchar = EOF; - } - else - c = getch (); - - while (c != EOF) - { - int this_lineno = lineno; - - c = skip_white_space (c); - - /* Don't lose our cool if there are lots of comments. */ - if (lineno == this_lineno + 1) - obstack_1grow (obstackp, '\n'); - else if (lineno == this_lineno) - ; - else if (lineno - this_lineno < 10) - { - int i; - for (i = lineno - this_lineno; i > 0; --i) - obstack_1grow (obstackp, '\n'); - } - else - { - char buf[16]; - sprintf (buf, "\n# %d \"", lineno); - len = strlen (buf); - obstack_grow (obstackp, buf, len); - - len = strlen (input_filename); - obstack_grow (obstackp, input_filename, len); - obstack_1grow (obstackp, '\"'); - obstack_1grow (obstackp, '\n'); - } - - while (c > ' ') /* ASCII dependent... */ - { - if (plev <= 0 && (c == ')' || c == ',')) - { - put_back (c); - goto done; - } - obstack_1grow (obstackp, c); - if (c == '(' || c == '[') - ++plev; - else if (c == ']' || c == ')') - --plev; - else if (c == '\\') - { - /* Don't act on the next character...e.g, doing an escaped - double-quote. */ - c = getch (); - if (c == EOF) - { - error_with_file_and_line (starting_filename, - starting_lineno, - "end of file read inside definition"); - goto done; - } - obstack_1grow (obstackp, c); - } - else if (c == '\"') - consume_string (obstackp, c); - else if (c == '\'') - consume_string (obstackp, c); - c = getch (); - } - - if (c == EOF) - { - error_with_file_and_line (starting_filename, - starting_lineno, - "end of file read inside definition"); - goto done; - } - else if (c != '\n') - { - obstack_1grow (obstackp, c); - c = getch (); - } - } - done: - obstack_1grow (obstackp, '\0'); -} - -int do_snarf_defarg; - -/* Decide whether the default argument we are about to see should be - gobbled up as text for later parsing. */ - -void -maybe_snarf_defarg () -{ - if (current_class_type && TYPE_BEING_DEFINED (current_class_type)) - do_snarf_defarg = 1; -} - -/* When we see a default argument in a method declaration, we snarf it as - text using snarf_defarg. When we get up to namespace scope, we then go - through and parse all of them using do_pending_defargs. Since yacc - parsers are not reentrant, we retain defargs state in these two - variables so that subsequent calls to do_pending_defargs can resume - where the previous call left off. */ - -tree defarg_fns; -tree defarg_parm; - -tree -snarf_defarg () -{ - int len; - char *buf; - tree arg; - - reinit_parse_for_expr (&inline_text_obstack); - len = obstack_object_size (&inline_text_obstack); - buf = obstack_finish (&inline_text_obstack); - - push_obstacks (&inline_text_obstack, &inline_text_obstack); - arg = make_node (DEFAULT_ARG); - DEFARG_LENGTH (arg) = len - 1; - DEFARG_POINTER (arg) = buf; - pop_obstacks (); - - return arg; -} - -/* Called from grokfndecl to note a function decl with unparsed default - arguments for later processing. Also called from grokdeclarator - for function types with unparsed defargs; the call from grokfndecl - will always come second, so we can overwrite the entry from the type. */ - -void -add_defarg_fn (decl) - tree decl; -{ - if (TREE_CODE (decl) == FUNCTION_DECL) - TREE_VALUE (defarg_fns) = decl; - else - { - push_obstacks (&inline_text_obstack, &inline_text_obstack); - defarg_fns = tree_cons (current_class_type, decl, defarg_fns); - pop_obstacks (); - } -} - -/* Helper for do_pending_defargs. Starts the parsing of a default arg. */ - -static void -feed_defarg (f, p) - tree f, p; -{ - tree d = TREE_PURPOSE (p); - feed_input (DEFARG_POINTER (d), DEFARG_LENGTH (d)); - if (TREE_CODE (f) == FUNCTION_DECL) - { - lineno = DECL_SOURCE_LINE (f); - input_filename = DECL_SOURCE_FILE (f); - } - yychar = DEFARG_MARKER; - yylval.ttype = p; -} - -/* Helper for do_pending_defargs. Ends the parsing of a default arg. */ - -static void -finish_defarg () -{ - if (yychar == YYEMPTY) - yychar = yylex (); - if (yychar != END_OF_SAVED_INPUT) - { - error ("parse error at end of saved function text"); - - /* restore_pending_input will abort unless yychar is either - END_OF_SAVED_INPUT or YYEMPTY; since we already know we're - hosed, feed back YYEMPTY. We also need to discard nextchar, - since that may have gotten set as well. */ - nextchar = -1; - } - yychar = YYEMPTY; - end_input (); -} - -/* Main function for deferred parsing of default arguments. Called from - the parser. */ - -void -do_pending_defargs () -{ - if (defarg_parm) - finish_defarg (); - - for (; defarg_fns; defarg_fns = TREE_CHAIN (defarg_fns)) - { - tree defarg_fn = TREE_VALUE (defarg_fns); - if (defarg_parm == NULL_TREE) - { - push_nested_class (TREE_PURPOSE (defarg_fns), 1); - pushlevel (0); - if (TREE_CODE (defarg_fn) == FUNCTION_DECL) - maybe_begin_member_template_processing (defarg_fn); - - if (TREE_CODE (defarg_fn) == FUNCTION_DECL) - { -#if 0 - tree p; - for (p = DECL_ARGUMENTS (defarg_fn); p; p = TREE_CHAIN (p)) - pushdecl (copy_node (p)); -#endif - defarg_parm = TYPE_ARG_TYPES (TREE_TYPE (defarg_fn)); - } - else - defarg_parm = TYPE_ARG_TYPES (defarg_fn); - } - else - defarg_parm = TREE_CHAIN (defarg_parm); - - for (; defarg_parm; defarg_parm = TREE_CHAIN (defarg_parm)) - if (TREE_PURPOSE (defarg_parm) - && TREE_CODE (TREE_PURPOSE (defarg_parm)) == DEFAULT_ARG) - { - feed_defarg (defarg_fn, defarg_parm); - - /* Return to the parser, which will process this defarg - and call us again. */ - return; - } - - if (TREE_CODE (defarg_fn) == FUNCTION_DECL) - { - maybe_end_member_template_processing (); - check_default_args (defarg_fn); - } - - poplevel (0, 0, 0); - pop_nested_class (1); - } -} - -/* Build a default function named NAME for type TYPE. - KIND says what to build. - - When KIND == 0, build default destructor. - When KIND == 1, build virtual destructor. - When KIND == 2, build default constructor. - When KIND == 3, build default X(const X&) constructor. - When KIND == 4, build default X(X&) constructor. - When KIND == 5, build default operator = (const X&). - When KIND == 6, build default operator = (X&). */ - -tree -cons_up_default_function (type, full_name, kind) - tree type, full_name; - int kind; -{ - extern tree void_list_node; - tree declspecs = NULL_TREE; - tree fn, args = NULL_TREE; - tree argtype; - int retref = 0; - tree name = constructor_name (full_name); - - switch (kind) - { - /* Destructors. */ - case 1: - declspecs = build_decl_list (NULL_TREE, ridpointers [(int) RID_VIRTUAL]); - /* Fall through... */ - case 0: - name = build_parse_node (BIT_NOT_EXPR, name); - args = void_list_node; - break; - - case 2: - /* Default constructor. */ - args = void_list_node; - break; - - case 3: - type = build_qualified_type (type, TYPE_QUAL_CONST); - /* Fall through... */ - case 4: - /* According to ARM $12.8, the default copy ctor will be declared, but - not defined, unless it's needed. */ - argtype = build_reference_type (type); - args = tree_cons (NULL_TREE, - build_tree_list (hash_tree_chain (argtype, NULL_TREE), - get_identifier ("_ctor_arg")), - void_list_node); - break; - - case 5: - case 6: - retref = 1; - declspecs = build_decl_list (NULL_TREE, type); - - if (kind == 5) - type = build_qualified_type (type, TYPE_QUAL_CONST); - - name = ansi_opname [(int) MODIFY_EXPR]; - - argtype = build_reference_type (type); - args = tree_cons (NULL_TREE, - build_tree_list (hash_tree_chain (argtype, NULL_TREE), - get_identifier ("_ctor_arg")), - void_list_node); - break; - - default: - my_friendly_abort (59); - } - - declspecs = decl_tree_cons (NULL_TREE, ridpointers [(int) RID_INLINE], - declspecs); - - TREE_PARMLIST (args) = 1; - - { - tree declarator = make_call_declarator (name, args, NULL_TREE, NULL_TREE); - if (retref) - declarator = build_parse_node (ADDR_EXPR, declarator); - - fn = grokfield (declarator, declspecs, NULL_TREE, NULL_TREE, NULL_TREE); - } - - if (fn == void_type_node) - return fn; - - if (kind > 2) - SET_DECL_ARTIFICIAL (TREE_CHAIN (DECL_ARGUMENTS (fn))); - -#if 0 - if (processing_template_defn) - { - SET_DECL_IMPLICIT_INSTANTIATION (fn); - repo_template_used (fn); - } -#endif - -#if 0 - if (CLASSTYPE_INTERFACE_KNOWN (type)) - { - DECL_INTERFACE_KNOWN (fn) = 1; - DECL_NOT_REALLY_EXTERN (fn) = (!CLASSTYPE_INTERFACE_ONLY (type) - && flag_implement_inlines); - } - else -#endif - DECL_NOT_REALLY_EXTERN (fn) = 1; - - mark_inline_for_output (fn); - -#ifdef DEBUG_DEFAULT_FUNCTIONS - { char *fn_type = NULL; - tree t = name; - switch (kind) - { - case 0: fn_type = "default destructor"; break; - case 1: fn_type = "virtual destructor"; break; - case 2: fn_type = "default constructor"; break; - case 3: fn_type = "default X(const X&)"; break; - case 4: fn_type = "default X(X&)"; break; - } - if (fn_type) - { - if (TREE_CODE (name) == BIT_NOT_EXPR) - t = TREE_OPERAND (name, 0); - fprintf (stderr, "[[[[ %s for %s:\n%s]]]]\n", fn_type, - IDENTIFIER_POINTER (t), func_buf); - } - } -#endif /* DEBUG_DEFAULT_FUNCTIONS */ - - /* Show that this function was generated by the compiler. */ - SET_DECL_ARTIFICIAL (fn); - - return fn; -} - -/* Heuristic to tell whether the user is missing a semicolon - after a struct or enum declaration. Emit an error message - if we know the user has blown it. */ - -void -check_for_missing_semicolon (type) - tree type; -{ - if (yychar < 0) - yychar = yylex (); - - if ((yychar > 255 - && yychar != SCSPEC - && yychar != IDENTIFIER - && yychar != TYPENAME - && yychar != CV_QUALIFIER - && yychar != SELFNAME) - || end_of_file) - { - if (ANON_AGGRNAME_P (TYPE_IDENTIFIER (type))) - error ("semicolon missing after %s declaration", - TREE_CODE (type) == ENUMERAL_TYPE ? "enum" : "struct"); - else - cp_error ("semicolon missing after declaration of `%T'", type); - shadow_tag (build_tree_list (0, type)); - } - /* Could probably also hack cases where class { ... } f (); appears. */ - clear_anon_tags (); -} - -void -note_got_semicolon (type) - tree type; -{ - if (TREE_CODE_CLASS (TREE_CODE (type)) != 't') - my_friendly_abort (60); - if (CLASS_TYPE_P (type)) - CLASSTYPE_GOT_SEMICOLON (type) = 1; -} - -void -note_list_got_semicolon (declspecs) - tree declspecs; -{ - tree link; - - for (link = declspecs; link; link = TREE_CHAIN (link)) - { - tree type = TREE_VALUE (link); - if (TREE_CODE_CLASS (TREE_CODE (type)) == 't') - note_got_semicolon (type); - } - clear_anon_tags (); -} - -/* If C is not whitespace, return C. - Otherwise skip whitespace and return first nonwhite char read. */ - -static int -skip_white_space (c) - register int c; -{ - for (;;) - { - switch (c) - { - case '\n': - c = check_newline (); - break; - - case ' ': - case '\t': - case '\f': - case '\r': - case '\v': - case '\b': - do - c = getch (); - while (c == ' ' || c == '\t'); - break; - - case '\\': - c = getch (); - if (c == '\n') - lineno++; - else - error ("stray '\\' in program"); - c = getch (); - break; - - default: - return (c); - } - } -} - - - -/* Make the token buffer longer, preserving the data in it. - P should point to just beyond the last valid character in the old buffer. - The value we return is a pointer to the new buffer - at a place corresponding to P. */ - -static char * -extend_token_buffer (p) - char *p; -{ - int offset = p - token_buffer; - - maxtoken = maxtoken * 2 + 10; - token_buffer = (char *) xrealloc (token_buffer, maxtoken + 2); - - return token_buffer + offset; -} - -static int -get_last_nonwhite_on_line () -{ - register int c; - - /* Is this the last nonwhite stuff on the line? */ - if (nextchar >= 0) - c = nextchar, nextchar = -1; - else - c = getch (); - - while (c == ' ' || c == '\t') - c = getch (); - return c; -} - -#if defined HANDLE_PRAGMA -/* Local versions of these macros, that can be passed as function pointers. */ -static int -pragma_getc () -{ - int c; - - if (nextchar != EOF) - { - c = nextchar; - nextchar = EOF; - } - else - c = getch (); - - return c; -} - -static void -pragma_ungetc (arg) - int arg; -{ - yyungetc (arg, 0); -} -#endif /* HANDLE_PRAGMA */ - -/* At the beginning of a line, increment the line number - and process any #-directive on this line. - If the line is a #-directive, read the entire line and return a newline. - Otherwise, return the line's first non-whitespace character. */ - -int linemode; - -static int handle_cp_pragma PROTO((char *)); - -static int -check_newline () -{ - register int c; - register int token; - int saw_line = 0; - - /* Read first nonwhite char on the line. Do this before incrementing the - line number, in case we're at the end of saved text. */ - - do - c = getch (); - while (c == ' ' || c == '\t'); - - lineno++; - - if (c != '#') - { - /* If not #, return it so caller will use it. */ - return c; - } - - /* Don't read beyond this line. */ - linemode = 1; - - /* Read first nonwhite char after the `#'. */ - - do - c = getch (); - while (c == ' ' || c == '\t'); - - /* If a letter follows, then if the word here is `line', skip - it and ignore it; otherwise, ignore the line, with an error - if the word isn't `pragma'. */ - - if (ISALPHA (c)) - { - if (c == 'p') - { - if (getch () == 'r' - && getch () == 'a' - && getch () == 'g' - && getch () == 'm' - && getch () == 'a') - { - token = real_yylex (); - if (token == IDENTIFIER - && TREE_CODE (yylval.ttype) == IDENTIFIER_NODE) - { - /* If this is 1, we handled it; if it's -1, it was one we - wanted but had something wrong with it. Only if it's - 0 was it not handled. */ - if (handle_cp_pragma (IDENTIFIER_POINTER (yylval.ttype))) - goto skipline; - } - else if (token == END_OF_LINE) - goto skipline; - -#ifdef HANDLE_PRAGMA - /* We invoke HANDLE_PRAGMA before HANDLE_GENERIC_PRAGMAS - (if both are defined), in order to give the back - end a chance to override the interpretation of - SYSV style pragmas. */ - if (HANDLE_PRAGMA (pragma_getc, pragma_ungetc, - IDENTIFIER_POINTER (yylval.ttype))) - goto skipline; -#endif /* HANDLE_PRAGMA */ - -#ifdef HANDLE_GENERIC_PRAGMAS - if (handle_generic_pragma (token)) - goto skipline; -#endif /* HANDLE_GENERIC_PRAGMAS */ - - /* Issue a warning message if we have been asked to do so. - Ignoring unknown pragmas in system header file unless - an explcit -Wunknown-pragmas has been given. */ - if (warn_unknown_pragmas > 1 - || (warn_unknown_pragmas && ! in_system_header)) - warning ("ignoring pragma: %s", token_buffer); - } - - goto skipline; - } - else if (c == 'd') - { - if (getch () == 'e' - && getch () == 'f' - && getch () == 'i' - && getch () == 'n' - && getch () == 'e' - && ((c = getch ()) == ' ' || c == '\t')) - { - debug_define (lineno, GET_DIRECTIVE_LINE ()); - goto skipline; - } - } - else if (c == 'u') - { - if (getch () == 'n' - && getch () == 'd' - && getch () == 'e' - && getch () == 'f' - && ((c = getch ()) == ' ' || c == '\t')) - { - debug_undef (lineno, GET_DIRECTIVE_LINE ()); - goto skipline; - } - } - else if (c == 'l') - { - if (getch () == 'i' - && getch () == 'n' - && getch () == 'e' - && ((c = getch ()) == ' ' || c == '\t')) - { - saw_line = 1; - goto linenum; - } - } - else if (c == 'i') - { - if (getch () == 'd' - && getch () == 'e' - && getch () == 'n' - && getch () == 't' - && ((c = getch ()) == ' ' || c == '\t')) - { - /* #ident. The pedantic warning is now in cccp.c. */ - - /* Here we have just seen `#ident '. - A string constant should follow. */ - - token = real_yylex (); - if (token == END_OF_LINE) - goto skipline; - if (token != STRING - || TREE_CODE (yylval.ttype) != STRING_CST) - { - error ("invalid #ident"); - goto skipline; - } - - if (! flag_no_ident) - { -#ifdef ASM_OUTPUT_IDENT - ASM_OUTPUT_IDENT (asm_out_file, - TREE_STRING_POINTER (yylval.ttype)); -#endif - } - - /* Skip the rest of this line. */ - goto skipline; - } - } - else if (c == 'n') - { - if (getch () == 'e' - && getch () == 'w' - && getch () == 'w' - && getch () == 'o' - && getch () == 'r' - && getch () == 'l' - && getch () == 'd' - && ((c = getch ()) == ' ' || c == '\t')) - { - /* Used to test incremental compilation. */ - sorry ("#pragma newworld"); - goto skipline; - } - } - error ("undefined or invalid # directive"); - goto skipline; - } - -linenum: - /* Here we have either `#line' or `# '. - In either case, it should be a line number; a digit should follow. */ - - while (c == ' ' || c == '\t') - c = getch (); - - /* If the # is the only nonwhite char on the line, - just ignore it. Check the new newline. */ - if (c == EOF) - goto skipline; - - /* Something follows the #; read a token. */ - - put_back (c); - token = real_yylex (); - - if (token == CONSTANT - && TREE_CODE (yylval.ttype) == INTEGER_CST) - { - int old_lineno = lineno; - enum { act_none, act_push, act_pop } action = act_none; - int entering_system_header = 0; - int entering_c_header = 0; - - /* subtract one, because it is the following line that - gets the specified number */ - - int l = TREE_INT_CST_LOW (yylval.ttype) - 1; - c = get_last_nonwhite_on_line (); - if (c == EOF) - { - /* No more: store the line number and check following line. */ - lineno = l; - goto skipline; - } - put_back (c); - - /* More follows: it must be a string constant (filename). */ - - if (saw_line) - { - /* Don't treat \ as special if we are processing #line 1 "...". - If you want it to be treated specially, use # 1 "...". */ - ignore_escape_flag = 1; - } - - /* Read the string constant. */ - token = real_yylex (); - - ignore_escape_flag = 0; - - if (token != STRING || TREE_CODE (yylval.ttype) != STRING_CST) - { - error ("invalid #line"); - goto skipline; - } - - /* Changing files again. This means currently collected time - is charged against header time, and body time starts back - at 0. */ - if (flag_detailed_statistics) - { - int this_time = my_get_run_time (); - tree time_identifier = get_time_identifier (TREE_STRING_POINTER (yylval.ttype)); - header_time += this_time - body_time; - TREE_INT_CST_LOW (TIME_IDENTIFIER_TIME (this_filename_time)) - += this_time - body_time; - this_filename_time = time_identifier; - body_time = this_time; - } - - input_filename - = (char *) permalloc (TREE_STRING_LENGTH (yylval.ttype) + 1); - strcpy (input_filename, TREE_STRING_POINTER (yylval.ttype)); - lineno = l; - GNU_xref_file (input_filename); - - if (main_input_filename == 0) - { - struct impl_files *ifiles = impl_file_chain; - - if (ifiles) - { - while (ifiles->next) - ifiles = ifiles->next; - ifiles->filename = file_name_nondirectory (input_filename); - } - - main_input_filename = input_filename; - if (write_virtuals == 3) - walk_vtables (set_typedecl_interface_info, set_vardecl_interface_info); - } - - extract_interface_info (); - - c = get_last_nonwhite_on_line (); - if (c == EOF) - { - /* Update the name in the top element of input_file_stack. */ - if (input_file_stack) - input_file_stack->name = input_filename; - } - else - { - put_back (c); - - token = real_yylex (); - - /* `1' after file name means entering new file. - `2' after file name means just left a file. */ - - if (token == CONSTANT - && TREE_CODE (yylval.ttype) == INTEGER_CST) - { - if (TREE_INT_CST_LOW (yylval.ttype) == 1) - action = act_push; - else if (TREE_INT_CST_LOW (yylval.ttype) == 2) - action = act_pop; - - if (action) - { - c = get_last_nonwhite_on_line (); - if (c != EOF) - { - put_back (c); - token = real_yylex (); - } - } - } - - /* `3' after file name means this is a system header file. */ - - if (token == CONSTANT - && TREE_CODE (yylval.ttype) == INTEGER_CST - && TREE_INT_CST_LOW (yylval.ttype) == 3) - { - entering_system_header = 1; - - c = get_last_nonwhite_on_line (); - if (c != EOF) - { - put_back (c); - token = real_yylex (); - } - } - - /* `4' after file name means this is a C header file. */ - - if (token == CONSTANT - && TREE_CODE (yylval.ttype) == INTEGER_CST - && TREE_INT_CST_LOW (yylval.ttype) == 4) - { - entering_c_header = 1; - - c = get_last_nonwhite_on_line (); - if (c != EOF) - { - put_back (c); - token = real_yylex (); - } - } - - /* Do the actions implied by the preceding numbers. */ - - if (action == act_push) - { - /* Pushing to a new file. */ - struct file_stack *p; - - p = (struct file_stack *) xmalloc (sizeof (struct file_stack)); - input_file_stack->line = old_lineno; - p->next = input_file_stack; - p->name = input_filename; - input_file_stack = p; - input_file_stack_tick++; - debug_start_source_file (input_filename); - in_system_header = entering_system_header; - if (c_header_level) - ++c_header_level; - else if (entering_c_header) - { - c_header_level = 1; - ++pending_lang_change; - } - } - else if (action == act_pop) - { - /* Popping out of a file. */ - if (input_file_stack->next) - { - struct file_stack *p; - - if (c_header_level && --c_header_level == 0) - { - if (entering_c_header) - warning ("badly nested C headers from preprocessor"); - --pending_lang_change; - } - in_system_header = entering_system_header; - - p = input_file_stack; - input_file_stack = p->next; - free (p); - input_file_stack_tick++; - debug_end_source_file (input_file_stack->line); - } - else - error ("#-lines for entering and leaving files don't match"); - } - else - in_system_header = entering_system_header; - } - - /* If NEXTCHAR is not end of line, we don't care what it is. */ - if (nextchar == EOF) - c = EOF; - } - else - error ("invalid #-line"); - - /* skip the rest of this line. */ - skipline: - linemode = 0; - end_of_file = 0; - nextchar = -1; - while ((c = getch ()) != EOF && c != '\n'); - return c; -} - -void -do_pending_lang_change () -{ - for (; pending_lang_change > 0; --pending_lang_change) - push_lang_context (lang_name_c); - for (; pending_lang_change < 0; ++pending_lang_change) - pop_lang_context (); -} - -#define ENDFILE -1 /* token that represents end-of-file */ - -/* Read an escape sequence, returning its equivalent as a character, - or store 1 in *ignore_ptr if it is backslash-newline. */ - -static int -readescape (ignore_ptr) - int *ignore_ptr; -{ - register int c = getch (); - register int code; - register unsigned count; - unsigned firstdig = 0; - int nonnull; - - switch (c) - { - case 'x': - code = 0; - count = 0; - nonnull = 0; - while (1) - { - c = getch (); - if (! ISXDIGIT (c)) - { - put_back (c); - break; - } - code *= 16; - if (c >= 'a' && c <= 'f') - code += c - 'a' + 10; - if (c >= 'A' && c <= 'F') - code += c - 'A' + 10; - if (c >= '0' && c <= '9') - code += c - '0'; - if (code != 0 || count != 0) - { - if (count == 0) - firstdig = code; - count++; - } - nonnull = 1; - } - if (! nonnull) - error ("\\x used with no following hex digits"); - else if (count == 0) - /* Digits are all 0's. Ok. */ - ; - else if ((count - 1) * 4 >= TYPE_PRECISION (integer_type_node) - || (count > 1 - && (((unsigned)1 << - (TYPE_PRECISION (integer_type_node) - (count - 1) * 4)) - <= firstdig))) - pedwarn ("hex escape out of range"); - return code; - - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': - code = 0; - count = 0; - while ((c <= '7') && (c >= '0') && (count++ < 3)) - { - code = (code * 8) + (c - '0'); - c = getch (); - } - put_back (c); - return code; - - case '\\': case '\'': case '"': - return c; - - case '\n': - lineno++; - *ignore_ptr = 1; - return 0; - - case 'n': - return TARGET_NEWLINE; - - case 't': - return TARGET_TAB; - - case 'r': - return TARGET_CR; - - case 'f': - return TARGET_FF; - - case 'b': - return TARGET_BS; - - case 'a': - return TARGET_BELL; - - case 'v': - return TARGET_VT; - - case 'e': - case 'E': - if (pedantic) - pedwarn ("non-ANSI-standard escape sequence, `\\%c'", c); - return 033; - - case '?': - return c; - - /* `\(', etc, are used at beginning of line to avoid confusing Emacs. */ - case '(': - case '{': - case '[': - /* `\%' is used to prevent SCCS from getting confused. */ - case '%': - if (pedantic) - pedwarn ("unknown escape sequence `\\%c'", c); - return c; - } - if (ISGRAPH (c)) - pedwarn ("unknown escape sequence `\\%c'", c); - else - pedwarn ("unknown escape sequence: `\\' followed by char code 0x%x", c); - return c; -} - -/* Value is 1 (or 2) if we should try to make the next identifier look like - a typename (when it may be a local variable or a class variable). - Value is 0 if we treat this name in a default fashion. */ -int looking_for_typename; - -#ifdef __GNUC__ -__inline -#endif -int -identifier_type (decl) - tree decl; -{ - tree t; - if (TREE_CODE (decl) == TEMPLATE_DECL) - { - if (TREE_CODE (DECL_RESULT (decl)) == TYPE_DECL) - return PTYPENAME; - else if (looking_for_template) - return PFUNCNAME; - } - if (looking_for_template && really_overloaded_fn (decl)) - { - /* See through a baselink. */ - if (TREE_CODE (decl) == TREE_LIST) - decl = TREE_VALUE (decl); - - for (t = decl; t != NULL_TREE; t = OVL_CHAIN (t)) - if (DECL_FUNCTION_TEMPLATE_P (OVL_FUNCTION (t))) - return PFUNCNAME; - } - if (TREE_CODE (decl) == NAMESPACE_DECL) - return NSNAME; - if (TREE_CODE (decl) != TYPE_DECL) - return IDENTIFIER; - if (DECL_ARTIFICIAL (decl) && TREE_TYPE (decl) == current_class_type) - return SELFNAME; - - /* A constructor declarator for a template type will get here as an - implicit typename, a TYPENAME_TYPE with a type. */ - t = got_scope; - if (t && TREE_CODE (t) == TYPENAME_TYPE) - t = TREE_TYPE (t); - decl = TREE_TYPE (decl); - if (TREE_CODE (decl) == TYPENAME_TYPE) - decl = TREE_TYPE (decl); - if (t && t == decl) - return SELFNAME; - - return TYPENAME; -} - -void -see_typename () -{ - /* Only types expected, not even namespaces. */ - looking_for_typename = 2; - if (yychar < 0) - if ((yychar = yylex ()) < 0) yychar = 0; - looking_for_typename = 0; - if (yychar == IDENTIFIER) - { - lastiddecl = lookup_name (yylval.ttype, -2); - if (lastiddecl == 0) - { - if (flag_labels_ok) - lastiddecl = IDENTIFIER_LABEL_VALUE (yylval.ttype); - } - else - yychar = identifier_type (lastiddecl); - } -} - -/* Return true if d is in a global scope. */ - -static int -is_global (d) - tree d; -{ - while (1) - switch (TREE_CODE (d)) - { - case ERROR_MARK: - return 1; - - case OVERLOAD: d = OVL_FUNCTION (d); continue; - case TREE_LIST: d = TREE_VALUE (d); continue; - default: - my_friendly_assert (TREE_CODE_CLASS (TREE_CODE (d)) == 'd', 980629); - d = CP_DECL_CONTEXT (d); - return TREE_CODE (d) == NAMESPACE_DECL; - } -} - -tree -do_identifier (token, parsing, args) - register tree token; - int parsing; - tree args; -{ - register tree id; - int lexing = (parsing == 1); - int in_call = (parsing == 2); - - if (! lexing || IDENTIFIER_OPNAME_P (token)) - id = lookup_name (token, 0); - else - id = lastiddecl; - - /* Scope class declarations before global - declarations. */ - if ((!id || is_global (id)) - && current_class_type != 0 - && TYPE_SIZE (current_class_type) == 0) - { - /* Could be from one of the base classes. */ - tree field = lookup_field (current_class_type, token, 1, 0); - if (field == 0) - ; - else if (field == error_mark_node) - /* We have already generated the error message. - But we still want to return this value. */ - id = lookup_field (current_class_type, token, 0, 0); - else if (TREE_CODE (field) == VAR_DECL - || TREE_CODE (field) == CONST_DECL - || TREE_CODE (field) == TEMPLATE_DECL) - id = field; - else if (TREE_CODE (field) != FIELD_DECL) - my_friendly_abort (61); - else - { - cp_error ("invalid use of member `%D'", field); - id = error_mark_node; - return id; - } - } - - /* Do Koenig lookup if appropriate (inside templates we build lookup - expressions instead). */ - if (args && !current_template_parms && (!id || is_global (id))) - /* If we have arguments and we only found global names, do Koenig - lookup. */ - id = lookup_arg_dependent (token, id, args); - - /* Remember that this name has been used in the class definition, as per - [class.scope0] */ - if (id && current_class_type && parsing - && TYPE_BEING_DEFINED (current_class_type) - && ! IDENTIFIER_CLASS_VALUE (token) - /* Avoid breaking if we get called for a default argument that - refers to an overloaded method. Eventually this will not be - necessary, since default arguments shouldn't be parsed until - after the class is complete. (jason 3/12/97) */ - && TREE_CODE (id) != OVERLOAD) - pushdecl_class_level (id); - - if (!id || id == error_mark_node) - { - if (id == error_mark_node && current_class_type != NULL_TREE) - { - id = lookup_nested_field (token, 1); - /* In lookup_nested_field(), we marked this so we can gracefully - leave this whole mess. */ - if (id && id != error_mark_node && TREE_TYPE (id) == error_mark_node) - return id; - } - - if (current_template_parms) - return build_min_nt (LOOKUP_EXPR, token); - else if (IDENTIFIER_OPNAME_P (token)) - { - if (token != ansi_opname[ERROR_MARK]) - cp_error ("`%D' not defined", token); - id = error_mark_node; - } - else if (in_call && ! flag_strict_prototype) - { - id = implicitly_declare (token); - } - else if (current_function_decl == 0) - { - cp_error ("`%D' was not declared in this scope", token); - id = error_mark_node; - } - else - { - if (IDENTIFIER_NAMESPACE_VALUE (token) != error_mark_node - || IDENTIFIER_ERROR_LOCUS (token) != current_function_decl) - { - static int undeclared_variable_notice; - - cp_error ("`%D' undeclared (first use this function)", token); - - if (! undeclared_variable_notice) - { - error ("(Each undeclared identifier is reported only once"); - error ("for each function it appears in.)"); - undeclared_variable_notice = 1; - } - } - id = error_mark_node; - /* Prevent repeated error messages. */ - SET_IDENTIFIER_NAMESPACE_VALUE (token, error_mark_node); - SET_IDENTIFIER_ERROR_LOCUS (token, current_function_decl); - } - } - - if (TREE_CODE (id) == VAR_DECL && DECL_DEAD_FOR_LOCAL (id)) - { - tree shadowed = DECL_SHADOWED_FOR_VAR (id); - while (shadowed != NULL_TREE && TREE_CODE (shadowed) == VAR_DECL - && DECL_DEAD_FOR_LOCAL (shadowed)) - shadowed = DECL_SHADOWED_FOR_VAR (shadowed); - if (!shadowed) - shadowed = IDENTIFIER_NAMESPACE_VALUE (DECL_NAME (id)); - if (shadowed) - { - if (!DECL_ERROR_REPORTED (id)) - { - warning ("name lookup of `%s' changed", - IDENTIFIER_POINTER (token)); - cp_warning_at (" matches this `%D' under current ANSI rules", - shadowed); - cp_warning_at (" matches this `%D' under old rules", id); - DECL_ERROR_REPORTED (id) = 1; - } - id = shadowed; - } - else if (!DECL_ERROR_REPORTED (id)) - { - static char msg[] - = "name lookup of `%s' changed for new ANSI `for' scoping"; - DECL_ERROR_REPORTED (id) = 1; - if (TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (id))) - { - error (msg, IDENTIFIER_POINTER (token)); - cp_error_at (" cannot use obsolete binding at `%D' because it has a destructor", id); - id = error_mark_node; - } - else - { - pedwarn (msg, IDENTIFIER_POINTER (token)); - cp_pedwarn_at (" using obsolete binding at `%D'", id); - } - } - } - /* TREE_USED is set in `hack_identifier'. */ - if (TREE_CODE (id) == CONST_DECL) - { - if (IDENTIFIER_CLASS_VALUE (token) == id) - { - /* Check access. */ - tree access = compute_access (TYPE_BINFO (current_class_type), id); - if (access == access_private_node) - cp_error ("enum `%D' is private", id); - /* protected is OK, since it's an enum of `this'. */ - } - if (!processing_template_decl || DECL_TEMPLATE_PARM_P (id)) - id = DECL_INITIAL (id); - } - else - id = hack_identifier (id, token); - - /* We must look up dependent names when the template is - instantiated, not while parsing it. For now, we don't - distinguish between dependent and independent names. So, for - example, we look up all overloaded functions at - instantiation-time, even though in some cases we should just use - the DECL we have here. We also use LOOKUP_EXPRs to find things - like local variables, rather than creating TEMPLATE_DECLs for the - local variables and then finding matching instantiations. */ - if (current_template_parms - && (is_overloaded_fn (id) - /* If it's not going to be around at instantiation time, we - look it up then. This is a hack, and should go when we - really get dependent/independent name lookup right. */ - || !TREE_PERMANENT (id) - /* Some local VAR_DECLs (such as those for local variables - in member functions of local classes) are built on the - permanent obstack. */ - || (TREE_CODE (id) == VAR_DECL - && CP_DECL_CONTEXT (id) - && TREE_CODE (CP_DECL_CONTEXT (id)) == FUNCTION_DECL) - || TREE_CODE (id) == PARM_DECL - || TREE_CODE (id) == RESULT_DECL - || TREE_CODE (id) == USING_DECL)) - id = build_min_nt (LOOKUP_EXPR, token); - - return id; -} - -tree -do_scoped_id (token, parsing) - tree token; - int parsing; -{ - tree id; - /* during parsing, this is ::name. Otherwise, it is black magic. */ - if (parsing) - { - struct tree_binding _b; - id = binding_init (&_b); - if (!qualified_lookup_using_namespace (token, global_namespace, id, 0)) - id = NULL_TREE; - else - id = BINDING_VALUE (id); - } - else - id = IDENTIFIER_GLOBAL_VALUE (token); - if (parsing && yychar == YYEMPTY) - yychar = yylex (); - if (! id) - { - if (processing_template_decl) - { - id = build_min_nt (LOOKUP_EXPR, token); - LOOKUP_EXPR_GLOBAL (id) = 1; - return id; - } - if (parsing && (yychar == '(' || yychar == LEFT_RIGHT) - && ! flag_strict_prototype) - id = implicitly_declare (token); - else - { - if (IDENTIFIER_NAMESPACE_VALUE (token) != error_mark_node) - cp_error ("`::%D' undeclared (first use here)", token); - id = error_mark_node; - /* Prevent repeated error messages. */ - SET_IDENTIFIER_NAMESPACE_VALUE (token, error_mark_node); - } - } - else - { - if (TREE_CODE (id) == ADDR_EXPR) - mark_used (TREE_OPERAND (id, 0)); - else if (TREE_CODE (id) != OVERLOAD) - mark_used (id); - } - if (TREE_CODE (id) == CONST_DECL && ! processing_template_decl) - { - /* XXX CHS - should we set TREE_USED of the constant? */ - id = DECL_INITIAL (id); - /* This is to prevent an enum whose value is 0 - from being considered a null pointer constant. */ - id = build1 (NOP_EXPR, TREE_TYPE (id), id); - TREE_CONSTANT (id) = 1; - } - - if (processing_template_decl) - { - if (is_overloaded_fn (id)) - { - id = build_min_nt (LOOKUP_EXPR, token); - LOOKUP_EXPR_GLOBAL (id) = 1; - return id; - } - /* else just use the decl */ - } - return convert_from_reference (id); -} - -tree -identifier_typedecl_value (node) - tree node; -{ - tree t, type; - type = IDENTIFIER_TYPE_VALUE (node); - if (type == NULL_TREE) - return NULL_TREE; - - if (IDENTIFIER_BINDING (node)) - { - t = IDENTIFIER_VALUE (node); - if (t && TREE_CODE (t) == TYPE_DECL && TREE_TYPE (t) == type) - return t; - } - if (IDENTIFIER_NAMESPACE_VALUE (node)) - { - t = IDENTIFIER_NAMESPACE_VALUE (node); - if (t && TREE_CODE (t) == TYPE_DECL && TREE_TYPE (t) == type) - return t; - } - - /* Will this one ever happen? */ - if (TYPE_MAIN_DECL (type)) - return TYPE_MAIN_DECL (type); - - /* We used to do an internal error of 62 here, but instead we will - handle the return of a null appropriately in the callers. */ - return NULL_TREE; -} - -/* CYGNUS LOCAL Embedded C++ */ -#ifdef __GNUC__ -__inline -#endif -void -embedded_pedwarn (s) - char *s; -{ - pedwarn ("Embedded C++ prohibits use of %s", s); -} -/* END CYGNUS LOCAL Embedded C++ */ - -int -real_yylex () -{ - register int c; - register int value; - int wide_flag = 0; - int dollar_seen = 0; - int i; - - if (nextchar >= 0) - c = nextchar, nextchar = -1; - else - c = getch (); - - /* Effectively do c = skip_white_space (c) - but do it faster in the usual cases. */ - while (1) - switch (c) - { - case ' ': - case '\t': - case '\f': - case '\v': - case '\b': - c = getch (); - break; - - case '\r': - /* Call skip_white_space so we can warn if appropriate. */ - - case '\n': - case '/': - case '\\': - c = skip_white_space (c); - default: - goto found_nonwhite; - } - found_nonwhite: - - token_buffer[0] = c; - token_buffer[1] = 0; - -/* yylloc.first_line = lineno; */ - - switch (c) - { - case EOF: - token_buffer[0] = '\0'; - end_of_file = 1; - if (input_redirected ()) - value = END_OF_SAVED_INPUT; - else if (linemode) - value = END_OF_LINE; - else - value = ENDFILE; - break; - - case '$': - if (! dollars_in_ident) - error ("`$' in identifier"); - else if (pedantic) - pedwarn ("`$' in identifier"); - dollar_seen = 1; - goto letter; - - case 'L': - /* Capital L may start a wide-string or wide-character constant. */ - { - register int c = getch (); - if (c == '\'') - { - wide_flag = 1; - goto char_constant; - } - if (c == '"') - { - wide_flag = 1; - goto string_constant; - } - put_back (c); - } - - case 'A': case 'B': case 'C': case 'D': case 'E': - case 'F': case 'G': case 'H': case 'I': case 'J': - case 'K': case 'M': case 'N': case 'O': - case 'P': case 'Q': case 'R': case 'S': case 'T': - case 'U': case 'V': case 'W': case 'X': case 'Y': - case 'Z': - case 'a': case 'b': case 'c': case 'd': case 'e': - case 'f': case 'g': case 'h': case 'i': case 'j': - case 'k': case 'l': case 'm': case 'n': case 'o': - case 'p': case 'q': case 'r': case 's': case 't': - case 'u': case 'v': case 'w': case 'x': case 'y': - case 'z': - case '_': - letter: - { - register char *p; - - p = token_buffer; - if (input == 0) - { - /* We know that `token_buffer' can hold at least on char, - so we install C immediately. - We may have to read the value in `putback_char', so call - `getch' once. */ - *p++ = c; - c = getch (); - - /* Make this run fast. We know that we are reading straight - from FINPUT in this case (since identifiers cannot straddle - input sources. */ - while (ISALNUM (c) || (c == '_') || c == '$') - { - if (c == '$') - { - if (! dollars_in_ident) - error ("`$' in identifier"); - else if (pedantic) - pedwarn ("`$' in identifier"); - } - - if (p >= token_buffer + maxtoken) - p = extend_token_buffer (p); - - *p++ = c; - c = getch (); - } - - if (linemode && c == '\n') - { - put_back (c); - c = EOF; - } - } - else - { - /* We know that `token_buffer' can hold at least on char, - so we install C immediately. */ - *p++ = c; - c = getch (); - - while (ISALNUM (c) || (c == '_') || c == '$') - { - if (c == '$') - { - if (! dollars_in_ident) - error ("`$' in identifier"); - else if (pedantic) - pedwarn ("`$' in identifier"); - } - - if (p >= token_buffer + maxtoken) - p = extend_token_buffer (p); - - *p++ = c; - c = getch (); - } - } - - *p = 0; - nextchar = c; - - value = IDENTIFIER; - yylval.itype = 0; - - /* Try to recognize a keyword. Uses minimum-perfect hash function */ - - { - register struct resword *ptr; - - if ((ptr = is_reserved_word (token_buffer, p - token_buffer))) - { - if (ptr->rid) - { - tree old_ttype = ridpointers[(int) ptr->rid]; - - /* If this provides a type for us, then revert lexical - state to standard state. */ - if (TREE_CODE (old_ttype) == IDENTIFIER_NODE - && IDENTIFIER_GLOBAL_VALUE (old_ttype) != 0 - && TREE_CODE (IDENTIFIER_GLOBAL_VALUE (old_ttype)) == TYPE_DECL) - looking_for_typename = 0; - else if (ptr->token == AGGR || ptr->token == ENUM) - looking_for_typename = 2; - - /* Check if this is a language-type declaration. - Just glimpse the next non-white character. */ - nextchar = skip_white_space (nextchar); - if (nextchar == '"') - { - /* We are looking at a string. Complain - if the token before the string is no `extern'. - - Could cheat some memory by placing this string - on the temporary_, instead of the saveable_ - obstack. */ - - if (ptr->rid != RID_EXTERN) - error ("invalid modifier `%s' for language string", - ptr->name); - real_yylex (); - value = EXTERN_LANG_STRING; - yylval.ttype = get_identifier (TREE_STRING_POINTER (yylval.ttype)); - break; - } - if (ptr->token == VISSPEC) - { - switch (ptr->rid) - { - case RID_PUBLIC: - yylval.ttype = access_public_node; - break; - case RID_PRIVATE: - yylval.ttype = access_private_node; - break; - case RID_PROTECTED: - yylval.ttype = access_protected_node; - break; - default: - my_friendly_abort (63); - } - } - else - yylval.ttype = old_ttype; - } - else if (ptr->token == EQCOMPARE) - { - yylval.code = NE_EXPR; - token_buffer[0] = '!'; - token_buffer[1] = '='; - token_buffer[2] = 0; - } - else if (ptr->token == ASSIGN) - { - if (strcmp ("and_eq", token_buffer) == 0) - { - yylval.code = BIT_AND_EXPR; - token_buffer[0] = '&'; - } - else if (strcmp ("or_eq", token_buffer) == 0) - { - yylval.code = BIT_IOR_EXPR; - token_buffer[0] = '|'; - } - else if (strcmp ("xor_eq", token_buffer) == 0) - { - yylval.code = BIT_XOR_EXPR; - token_buffer[0] = '^'; - } - token_buffer[1] = '='; - token_buffer[2] = 0; - } - else if (ptr->token == '&') - { - yylval.code = BIT_AND_EXPR; - token_buffer[0] = '&'; - token_buffer[1] = 0; - } - else if (ptr->token == '|') - { - yylval.code = BIT_IOR_EXPR; - token_buffer[0] = '|'; - token_buffer[1] = 0; - } - else if (ptr->token == '^') - { - yylval.code = BIT_XOR_EXPR; - token_buffer[0] = '^'; - token_buffer[1] = 0; - } - - value = (int) ptr->token; - } - } - - /* If we did not find a keyword, look for an identifier - (or a typename). */ - - if (value == IDENTIFIER || value == TYPESPEC) - GNU_xref_ref (current_function_decl, token_buffer); - - if (value == IDENTIFIER) - { - register tree tmp = get_identifier (token_buffer); - -#if !defined(VMS) && defined(JOINER) - /* Make sure that user does not collide with our internal - naming scheme. */ - if (JOINER == '$' - && dollar_seen - && (THIS_NAME_P (tmp) - || VPTR_NAME_P (tmp) - || DESTRUCTOR_NAME_P (tmp) - || VTABLE_NAME_P (tmp) - || TEMP_NAME_P (tmp) - || ANON_AGGRNAME_P (tmp) - || ANON_PARMNAME_P (tmp))) - warning ("identifier name `%s' conflicts with GNU C++ internal naming strategy", - token_buffer); -#endif - - yylval.ttype = tmp; - } - if (value == NEW && ! global_bindings_p ()) - { - value = NEW; - goto done; - } - } - -/* CYGNUS LOCAL Embedded C++ */ - if (flag_embedded_cxx) - { - if (value == USING || value == NAMESPACE) - { - if (! embedded_namespace_error) - { - embedded_namespace_error = 1; - embedded_pedwarn ("namespaces"); - } - else - pedwarn ("further uses of namespaces with Embedded C++ enabled"); - } - else if (value == TEMPLATE || value == TYPENAME) - { - if (! embedded_namespace_error) - { - embedded_namespace_error = 1; - embedded_pedwarn ("templates"); - } - else - pedwarn ("further uses of templates with Embedded C++ enabled"); - } - else if (value == CATCH || value == THROW || value == TRY) - { - if (! embedded_eh_error) - { - embedded_eh_error = 1; - embedded_pedwarn ("exception handling"); - } - else - pedwarn ("further uses of exception handling with Embedded C++ enabled"); - } - else if (value == DYNAMIC_CAST) - embedded_pedwarn ("dynamic_cast"); - else if (value == STATIC_CAST) - embedded_pedwarn ("static_cast"); - else if (value == REINTERPRET_CAST) - embedded_pedwarn ("reinterpret_cast"); - else if (value == CONST_CAST) - embedded_pedwarn ("const_cast"); - else if (value == TYPEID) - embedded_pedwarn ("typeid"); - } -/* END CYGNUS LOCAL Embedded C++ */ - - break; - - case '.': - { - register int c1 = getch (); - token_buffer[0] = c; - token_buffer[1] = c1; - if (c1 == '*') - { - value = DOT_STAR; - token_buffer[2] = 0; - goto done; - } - if (c1 == '.') - { - c1 = getch (); - if (c1 == '.') - { - token_buffer[2] = c1; - token_buffer[3] = 0; - value = ELLIPSIS; - goto done; - } - error ("parse error at `..'"); - } - if (ISDIGIT (c1)) - { - put_back (c1); - goto resume_numerical_scan; - } - nextchar = c1; - value = '.'; - token_buffer[1] = 0; - goto done; - } - case '0': case '1': - /* Optimize for most frequent case. */ - { - register int c1 = getch (); - if (! ISALNUM (c1) && c1 != '.') - { - /* Terminate string. */ - token_buffer[0] = c; - token_buffer[1] = 0; - if (c == '0') - yylval.ttype = integer_zero_node; - else - yylval.ttype = integer_one_node; - nextchar = c1; - value = CONSTANT; - goto done; - } - put_back (c1); - } - /* fall through... */ - case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - resume_numerical_scan: - { - register char *p; - int base = 10; - int count = 0; - int largest_digit = 0; - int numdigits = 0; - /* for multi-precision arithmetic, - we actually store only HOST_BITS_PER_CHAR bits in each part. - The number of parts is chosen so as to be sufficient to hold - the enough bits to fit into the two HOST_WIDE_INTs that contain - the integer value (this is always at least as many bits as are - in a target `long long' value, but may be wider). */ -#define TOTAL_PARTS ((HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR) * 2 + 2) - int parts[TOTAL_PARTS]; - int overflow = 0; - - enum anon1 { NOT_FLOAT, AFTER_POINT, TOO_MANY_POINTS} floatflag - = NOT_FLOAT; - - for (count = 0; count < TOTAL_PARTS; count++) - parts[count] = 0; - - p = token_buffer; - *p++ = c; - - if (c == '0') - { - *p++ = (c = getch ()); - if ((c == 'x') || (c == 'X')) - { - base = 16; - *p++ = (c = getch ()); - } - /* Leading 0 forces octal unless the 0 is the only digit. */ - else if (c >= '0' && c <= '9') - { - base = 8; - numdigits++; - } - else - numdigits++; - } - - /* Read all the digits-and-decimal-points. */ - - while (c == '.' - || (ISALNUM (c) && (c != 'l') && (c != 'L') - && (c != 'u') && (c != 'U') - && c != 'i' && c != 'I' && c != 'j' && c != 'J' - && (floatflag == NOT_FLOAT || ((c != 'f') && (c != 'F'))))) - { - if (c == '.') - { - if (base == 16) - error ("floating constant may not be in radix 16"); - if (floatflag == TOO_MANY_POINTS) - /* We have already emitted an error. Don't need another. */ - ; - else if (floatflag == AFTER_POINT) - { - error ("malformed floating constant"); - floatflag = TOO_MANY_POINTS; - /* Avoid another error from atof by forcing all characters - from here on to be ignored. */ - p[-1] = '\0'; - } - else - floatflag = AFTER_POINT; - - base = 10; - *p++ = c = getch (); - /* Accept '.' as the start of a floating-point number - only when it is followed by a digit. - Otherwise, unread the following non-digit - and use the '.' as a structural token. */ - if (p == token_buffer + 2 && !ISDIGIT (c)) - { - if (c == '.') - { - c = getch (); - if (c == '.') - { - *p++ = '.'; - *p = '\0'; - value = ELLIPSIS; - goto done; - } - error ("parse error at `..'"); - } - nextchar = c; - token_buffer[1] = '\0'; - value = '.'; - goto done; - } - } - else - { - /* It is not a decimal point. - It should be a digit (perhaps a hex digit). */ - - if (ISDIGIT (c)) - { - c = c - '0'; - } - else if (base <= 10) - { - if (c == 'e' || c == 'E') - { - base = 10; - floatflag = AFTER_POINT; - break; /* start of exponent */ - } - error ("nondigits in number and not hexadecimal"); - c = 0; - } - else if (c >= 'a') - { - c = c - 'a' + 10; - } - else - { - c = c - 'A' + 10; - } - if (c >= largest_digit) - largest_digit = c; - numdigits++; - - for (count = 0; count < TOTAL_PARTS; count++) - { - parts[count] *= base; - if (count) - { - parts[count] - += (parts[count-1] >> HOST_BITS_PER_CHAR); - parts[count-1] - &= (1 << HOST_BITS_PER_CHAR) - 1; - } - else - parts[0] += c; - } - - /* If the extra highest-order part ever gets anything in it, - the number is certainly too big. */ - if (parts[TOTAL_PARTS - 1] != 0) - overflow = 1; - - if (p >= token_buffer + maxtoken - 3) - p = extend_token_buffer (p); - *p++ = (c = getch ()); - } - } - - if (numdigits == 0) - error ("numeric constant with no digits"); - - if (largest_digit >= base) - error ("numeric constant contains digits beyond the radix"); - - /* Remove terminating char from the token buffer and delimit the string */ - *--p = 0; - - if (floatflag != NOT_FLOAT) - { - tree type = double_type_node; - int exceeds_double = 0; - int imag = 0; - REAL_VALUE_TYPE value; - jmp_buf handler; - - /* Read explicit exponent if any, and put it in tokenbuf. */ - - if ((c == 'e') || (c == 'E')) - { - if (p >= token_buffer + maxtoken - 3) - p = extend_token_buffer (p); - *p++ = c; - c = getch (); - if ((c == '+') || (c == '-')) - { - *p++ = c; - c = getch (); - } - if (! ISDIGIT (c)) - error ("floating constant exponent has no digits"); - while (ISDIGIT (c)) - { - if (p >= token_buffer + maxtoken - 3) - p = extend_token_buffer (p); - *p++ = c; - c = getch (); - } - } - - *p = 0; - errno = 0; - - /* Convert string to a double, checking for overflow. */ - if (setjmp (handler)) - { - error ("floating constant out of range"); - value = dconst0; - } - else - { - int fflag = 0, lflag = 0; - /* Copy token_buffer now, while it has just the number - and not the suffixes; once we add `f' or `i', - REAL_VALUE_ATOF may not work any more. */ - char *copy = (char *) alloca (p - token_buffer + 1); - bcopy (token_buffer, copy, p - token_buffer + 1); - - set_float_handler (handler); - - while (1) - { - int lose = 0; - - /* Read the suffixes to choose a data type. */ - switch (c) - { - case 'f': case 'F': - if (fflag) - error ("more than one `f' in numeric constant"); - fflag = 1; - break; - - case 'l': case 'L': - if (lflag) - error ("more than one `l' in numeric constant"); - lflag = 1; - break; - - case 'i': case 'I': - if (imag) - error ("more than one `i' or `j' in numeric constant"); - else if (pedantic) - pedwarn ("ANSI C++ forbids imaginary numeric constants"); - imag = 1; - break; - - default: - lose = 1; - } - - if (lose) - break; - - if (p >= token_buffer + maxtoken - 3) - p = extend_token_buffer (p); - *p++ = c; - *p = 0; - c = getch (); - } - - /* The second argument, machine_mode, of REAL_VALUE_ATOF - tells the desired precision of the binary result - of decimal-to-binary conversion. */ - - if (fflag) - { - if (lflag) - error ("both `f' and `l' in floating constant"); - - type = float_type_node; - value = REAL_VALUE_ATOF (copy, TYPE_MODE (type)); - /* A diagnostic is required here by some ANSI C testsuites. - This is not pedwarn, become some people don't want - an error for this. */ - if (REAL_VALUE_ISINF (value) && pedantic) - warning ("floating point number exceeds range of `float'"); - } - else if (lflag) - { - type = long_double_type_node; - value = REAL_VALUE_ATOF (copy, TYPE_MODE (type)); - if (REAL_VALUE_ISINF (value) && pedantic) - warning ("floating point number exceeds range of `long double'"); - } - else - { - value = REAL_VALUE_ATOF (copy, TYPE_MODE (type)); - if (REAL_VALUE_ISINF (value) && pedantic) - warning ("floating point number exceeds range of `double'"); - } - - set_float_handler (NULL_PTR); - } -#ifdef ERANGE - if (errno == ERANGE && pedantic) - { - /* ERANGE is also reported for underflow, - so test the value to distinguish overflow from that. */ - if (REAL_VALUES_LESS (dconst1, value) - || REAL_VALUES_LESS (value, dconstm1)) - { - pedwarn ("floating point number exceeds range of `%s'", - IDENTIFIER_POINTER (TYPE_IDENTIFIER (type))); - exceeds_double = 1; - } - } -#endif - - /* If the result is not a number, assume it must have been - due to some error message above, so silently convert - it to a zero. */ - if (REAL_VALUE_ISNAN (value)) - value = dconst0; - - /* Create a node with determined type and value. */ - if (imag) - yylval.ttype = build_complex (NULL_TREE, - cp_convert (type, integer_zero_node), - build_real (type, value)); - else - yylval.ttype = build_real (type, value); - } - else - { - tree type; - HOST_WIDE_INT high, low; - int spec_unsigned = 0; - int spec_long = 0; - int spec_long_long = 0; - int spec_imag = 0; - int bytes, warn; - - while (1) - { - if (c == 'u' || c == 'U') - { - if (spec_unsigned) - error ("two `u's in integer constant"); - spec_unsigned = 1; - } - else if (c == 'l' || c == 'L') - { - if (spec_long) - { - if (spec_long_long) - error ("three `l's in integer constant"); - else if (pedantic && ! in_system_header && warn_long_long) - pedwarn ("ANSI C++ forbids long long integer constants"); - spec_long_long = 1; - } - spec_long = 1; - } - else if (c == 'i' || c == 'j' || c == 'I' || c == 'J') - { - if (spec_imag) - error ("more than one `i' or `j' in numeric constant"); - else if (pedantic) - pedwarn ("ANSI C++ forbids imaginary numeric constants"); - spec_imag = 1; - } - else - break; - if (p >= token_buffer + maxtoken - 3) - p = extend_token_buffer (p); - *p++ = c; - c = getch (); - } - - /* If the constant is not long long and it won't fit in an - unsigned long, or if the constant is long long and won't fit - in an unsigned long long, then warn that the constant is out - of range. */ - - /* ??? This assumes that long long and long integer types are - a multiple of 8 bits. This better than the original code - though which assumed that long was exactly 32 bits and long - long was exactly 64 bits. */ - - if (spec_long_long) - bytes = TYPE_PRECISION (long_long_integer_type_node) / 8; - else - bytes = TYPE_PRECISION (long_integer_type_node) / 8; - - warn = overflow; - for (i = bytes; i < TOTAL_PARTS; i++) - if (parts[i]) - warn = 1; - if (warn) - pedwarn ("integer constant out of range"); - - /* This is simplified by the fact that our constant - is always positive. */ - high = low = 0; - - for (i = 0; i < HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR; i++) - { - high |= ((HOST_WIDE_INT) parts[i + (HOST_BITS_PER_WIDE_INT - / HOST_BITS_PER_CHAR)] - << (i * HOST_BITS_PER_CHAR)); - low |= (HOST_WIDE_INT) parts[i] << (i * HOST_BITS_PER_CHAR); - } - - - yylval.ttype = build_int_2 (low, high); - TREE_TYPE (yylval.ttype) = long_long_unsigned_type_node; - - /* Calculate the ANSI type. */ - if (!spec_long && !spec_unsigned - && int_fits_type_p (yylval.ttype, integer_type_node)) - type = integer_type_node; - else if (!spec_long && (base != 10 || spec_unsigned) - && int_fits_type_p (yylval.ttype, unsigned_type_node)) - /* Nondecimal constants try unsigned even in traditional C. */ - type = unsigned_type_node; - else if (!spec_unsigned && !spec_long_long - && int_fits_type_p (yylval.ttype, long_integer_type_node)) - type = long_integer_type_node; - else if (! spec_long_long) - type = long_unsigned_type_node; - else if (! spec_unsigned - /* Verify value does not overflow into sign bit. */ - && TREE_INT_CST_HIGH (yylval.ttype) >= 0 - && int_fits_type_p (yylval.ttype, - long_long_integer_type_node)) - type = long_long_integer_type_node; - else - type = long_long_unsigned_type_node; - - if (!int_fits_type_p (yylval.ttype, type) && !warn) - pedwarn ("integer constant out of range"); - - if (base == 10 && ! spec_unsigned && TREE_UNSIGNED (type)) - warning ("decimal integer constant is so large that it is unsigned"); - - if (spec_imag) - { - if (TYPE_PRECISION (type) - <= TYPE_PRECISION (integer_type_node)) - yylval.ttype - = build_complex (NULL_TREE, integer_zero_node, - cp_convert (integer_type_node, - yylval.ttype)); - else - error ("complex integer constant is too wide for `__complex int'"); - } - else - TREE_TYPE (yylval.ttype) = type; - } - - put_back (c); - *p = 0; - - value = CONSTANT; break; - } - - case '\'': - char_constant: - { - register int result = 0; - register int num_chars = 0; - int chars_seen = 0; - unsigned width = TYPE_PRECISION (char_type_node); - int max_chars; -#ifdef MULTIBYTE_CHARS - int longest_char = local_mb_cur_max (); - (void) local_mbtowc (NULL_PTR, NULL_PTR, 0); -#endif - - max_chars = TYPE_PRECISION (integer_type_node) / width; - if (wide_flag) - width = WCHAR_TYPE_SIZE; - - while (1) - { - tryagain: - c = getch (); - - if (c == '\'' || c == EOF) - break; - - ++chars_seen; - if (c == '\\') - { - int ignore = 0; - c = readescape (&ignore); - if (ignore) - goto tryagain; - if (width < HOST_BITS_PER_INT - && (unsigned) c >= ((unsigned)1 << width)) - pedwarn ("escape sequence out of range for character"); -#ifdef MAP_CHARACTER - if (ISPRINT (c)) - c = MAP_CHARACTER (c); -#endif - } - else if (c == '\n') - { - if (pedantic) - pedwarn ("ANSI C forbids newline in character constant"); - lineno++; - } - else - { -#ifdef MULTIBYTE_CHARS - wchar_t wc; - int i; - int char_len = -1; - for (i = 1; i <= longest_char; ++i) - { - if (i > maxtoken - 4) - extend_token_buffer (token_buffer); - - token_buffer[i] = c; - char_len = local_mbtowc (& wc, - token_buffer + 1, - i); - if (char_len != -1) - break; - c = getch (); - } - if (char_len > 1) - { - /* mbtowc sometimes needs an extra char before accepting */ - if (char_len < i) - put_back (c); - if (! wide_flag) - { - /* Merge character into result; ignore excess chars. */ - for (i = 1; i <= char_len; ++i) - { - if (i > max_chars) - break; - if (width < HOST_BITS_PER_INT) - result = (result << width) - | (token_buffer[i] - & ((1 << width) - 1)); - else - result = token_buffer[i]; - } - num_chars += char_len; - goto tryagain; - } - c = wc; - } - else - { - if (char_len == -1) - warning ("Ignoring invalid multibyte character"); - if (wide_flag) - c = wc; -#ifdef MAP_CHARACTER - else - c = MAP_CHARACTER (c); -#endif - } -#else /* ! MULTIBYTE_CHARS */ -#ifdef MAP_CHARACTER - c = MAP_CHARACTER (c); -#endif -#endif /* ! MULTIBYTE_CHARS */ - } - - if (wide_flag) - { - if (chars_seen == 1) /* only keep the first one */ - result = c; - goto tryagain; - } - - /* Merge character into result; ignore excess chars. */ - num_chars++; - if (num_chars < max_chars + 1) - { - if (width < HOST_BITS_PER_INT) - result = (result << width) | (c & ((1 << width) - 1)); - else - result = c; - } - } - - if (c != '\'') - error ("malformatted character constant"); - else if (chars_seen == 0) - error ("empty character constant"); - else if (num_chars > max_chars) - { - num_chars = max_chars; - error ("character constant too long"); - } - else if (chars_seen != 1 && warn_multichar) - warning ("multi-character character constant"); - - /* If char type is signed, sign-extend the constant. */ - if (! wide_flag) - { - int num_bits = num_chars * width; - if (num_bits == 0) - /* We already got an error; avoid invalid shift. */ - yylval.ttype = build_int_2 (0, 0); - else if (TREE_UNSIGNED (char_type_node) - || ((result >> (num_bits - 1)) & 1) == 0) - yylval.ttype - = build_int_2 (result & (~(unsigned HOST_WIDE_INT) 0 - >> (HOST_BITS_PER_WIDE_INT - num_bits)), - 0); - else - yylval.ttype - = build_int_2 (result | ~(~(unsigned HOST_WIDE_INT) 0 - >> (HOST_BITS_PER_WIDE_INT - num_bits)), - -1); - if (chars_seen <= 1) - TREE_TYPE (yylval.ttype) = char_type_node; - else - TREE_TYPE (yylval.ttype) = integer_type_node; - } - else - { - yylval.ttype = build_int_2 (result, 0); - TREE_TYPE (yylval.ttype) = wchar_type_node; - } - - value = CONSTANT; - break; - } - - case '"': - string_constant: - { - register char *p; - unsigned width = wide_flag ? WCHAR_TYPE_SIZE - : TYPE_PRECISION (char_type_node); -#ifdef MULTIBYTE_CHARS - int longest_char = local_mb_cur_max (); - (void) local_mbtowc (NULL_PTR, NULL_PTR, 0); -#endif - - c = getch (); - p = token_buffer + 1; - - while (c != '"' && c >= 0) - { - /* ignore_escape_flag is set for reading the filename in #line. */ - if (!ignore_escape_flag && c == '\\') - { - int ignore = 0; - c = readescape (&ignore); - if (ignore) - goto skipnewline; - if (width < HOST_BITS_PER_INT - && (unsigned) c >= ((unsigned)1 << width)) - warning ("escape sequence out of range for character"); - } - else if (c == '\n') - { - if (pedantic) - pedwarn ("ANSI C++ forbids newline in string constant"); - lineno++; - } - else - { -#ifdef MULTIBYTE_CHARS - wchar_t wc; - int i; - int char_len = -1; - for (i = 0; i < longest_char; ++i) - { - if (p + i >= token_buffer + maxtoken) - p = extend_token_buffer (p); - p[i] = c; - - char_len = local_mbtowc (& wc, p, i + 1); - if (char_len != -1) - break; - c = getch (); - } - if (char_len == -1) - warning ("Ignoring invalid multibyte character"); - else - { - /* mbtowc sometimes needs an extra char before accepting */ - if (char_len <= i) - put_back (c); - if (! wide_flag) - { - p += (i + 1); - c = getch (); - continue; - } - c = wc; - } -#endif /* MULTIBYTE_CHARS */ - } - - /* Add this single character into the buffer either as a wchar_t - or as a single byte. */ - if (wide_flag) - { - unsigned width = TYPE_PRECISION (char_type_node); - unsigned bytemask = (1 << width) - 1; - int byte; - - if (p + WCHAR_BYTES > token_buffer + maxtoken) - p = extend_token_buffer (p); - - for (byte = 0; byte < WCHAR_BYTES; ++byte) - { - int value; - if (byte >= (int) sizeof(c)) - value = 0; - else - value = (c >> (byte * width)) & bytemask; - if (BYTES_BIG_ENDIAN) - p[WCHAR_BYTES - byte - 1] = value; - else - p[byte] = value; - } - p += WCHAR_BYTES; - } - else - { - if (p >= token_buffer + maxtoken) - p = extend_token_buffer (p); - *p++ = c; - } - - skipnewline: - c = getch (); - if (c == EOF) { - error ("Unterminated string"); - break; - } - } - - /* Terminate the string value, either with a single byte zero - or with a wide zero. */ - if (wide_flag) - { - if (p + WCHAR_BYTES > token_buffer + maxtoken) - p = extend_token_buffer (p); - bzero (p, WCHAR_BYTES); - p += WCHAR_BYTES; - } - else - { - if (p >= token_buffer + maxtoken) - p = extend_token_buffer (p); - *p++ = 0; - } - - /* We have read the entire constant. - Construct a STRING_CST for the result. */ - - if (processing_template_decl) - push_obstacks (&permanent_obstack, &permanent_obstack); - yylval.ttype = build_string (p - (token_buffer + 1), token_buffer + 1); - if (processing_template_decl) - pop_obstacks (); - - if (wide_flag) - TREE_TYPE (yylval.ttype) = wchar_array_type_node; - else - TREE_TYPE (yylval.ttype) = char_array_type_node; - - value = STRING; break; - } - - case '+': - case '-': - case '&': - case '|': - case '<': - case '>': - case '*': - case '/': - case '%': - case '^': - case '!': - case '=': - { - register int c1; - - combine: - - switch (c) - { - case '+': - yylval.code = PLUS_EXPR; break; - case '-': - yylval.code = MINUS_EXPR; break; - case '&': - yylval.code = BIT_AND_EXPR; break; - case '|': - yylval.code = BIT_IOR_EXPR; break; - case '*': - yylval.code = MULT_EXPR; break; - case '/': - yylval.code = TRUNC_DIV_EXPR; break; - case '%': - yylval.code = TRUNC_MOD_EXPR; break; - case '^': - yylval.code = BIT_XOR_EXPR; break; - case LSHIFT: - yylval.code = LSHIFT_EXPR; break; - case RSHIFT: - yylval.code = RSHIFT_EXPR; break; - case '<': - yylval.code = LT_EXPR; break; - case '>': - yylval.code = GT_EXPR; break; - } - - token_buffer[1] = c1 = getch (); - token_buffer[2] = 0; - - if (c1 == '=') - { - switch (c) - { - case '<': - value = ARITHCOMPARE; yylval.code = LE_EXPR; goto done; - case '>': - value = ARITHCOMPARE; yylval.code = GE_EXPR; goto done; - case '!': - value = EQCOMPARE; yylval.code = NE_EXPR; goto done; - case '=': - value = EQCOMPARE; yylval.code = EQ_EXPR; goto done; - } - value = ASSIGN; goto done; - } - else if (c == c1) - switch (c) - { - case '+': - value = PLUSPLUS; goto done; - case '-': - value = MINUSMINUS; goto done; - case '&': - value = ANDAND; goto done; - case '|': - value = OROR; goto done; - case '<': - c = LSHIFT; - goto combine; - case '>': - c = RSHIFT; - goto combine; - } - else if ((c == '-') && (c1 == '>')) - { - nextchar = getch (); - if (nextchar == '*') - { - nextchar = -1; - value = POINTSAT_STAR; - } - else - value = POINTSAT; - goto done; - } - else if (c1 == '?' && (c == '<' || c == '>')) - { - token_buffer[3] = 0; - - c1 = getch (); - yylval.code = (c == '<' ? MIN_EXPR : MAX_EXPR); - if (c1 == '=') - { - /* ?= expression. */ - token_buffer[2] = c1; - value = ASSIGN; - } - else - { - value = MIN_MAX; - nextchar = c1; - } - if (pedantic) - pedwarn ("use of `operator %s' is not standard C++", - token_buffer); - goto done; - } - /* digraphs */ - else if (c == '<' && c1 == '%') - { value = '{'; goto done; } - else if (c == '<' && c1 == ':') - { value = '['; goto done; } - else if (c == '%' && c1 == '>') - { value = '}'; goto done; } - else if (c == '%' && c1 == ':') - { value = '#'; goto done; } - - nextchar = c1; - token_buffer[1] = 0; - - value = c; - goto done; - } - - case ':': - c = getch (); - if (c == ':') - { - token_buffer[1] = ':'; - token_buffer[2] = '\0'; - value = SCOPE; - yylval.itype = 1; - } - else if (c == '>') - { - value = ']'; - goto done; - } - else - { - nextchar = c; - value = ':'; - } - break; - - case 0: - /* Don't make yyparse think this is eof. */ - value = 1; - break; - - case '(': - /* try, weakly, to handle casts to pointers to functions. */ - nextchar = skip_white_space (getch ()); - if (nextchar == '*') - { - int next_c = skip_white_space (getch ()); - if (next_c == ')') - { - nextchar = -1; - yylval.ttype = build1 (INDIRECT_REF, 0, 0); - value = PAREN_STAR_PAREN; - } - else - { - put_back (next_c); - value = c; - } - } - else if (nextchar == ')') - { - nextchar = -1; - yylval.ttype = NULL_TREE; - value = LEFT_RIGHT; - } - else value = c; - break; - - default: - value = c; - } - -done: -/* yylloc.last_line = lineno; */ -#ifdef GATHER_STATISTICS -#ifdef REDUCE_LENGTH - token_count[value] += 1; -#endif -#endif - - return value; -} - -int -is_rid (t) - tree t; -{ - return !!is_reserved_word (IDENTIFIER_POINTER (t), IDENTIFIER_LENGTH (t)); -} - -#ifdef GATHER_STATISTICS -/* The original for tree_node_kind is in the toplevel tree.c; changes there - need to be brought into here, unless this were actually put into a header - instead. */ -/* Statistics-gathering stuff. */ -typedef enum -{ - d_kind, - t_kind, - b_kind, - s_kind, - r_kind, - e_kind, - c_kind, - id_kind, - op_id_kind, - perm_list_kind, - temp_list_kind, - vec_kind, - x_kind, - lang_decl, - lang_type, - all_kinds -} tree_node_kind; - -extern int tree_node_counts[]; -extern int tree_node_sizes[]; -#endif - -/* Place to save freed lang_decls which were allocated on the - permanent_obstack. @@ Not currently used. */ -tree free_lang_decl_chain; - -tree -build_lang_decl (code, name, type) - enum tree_code code; - tree name; - tree type; -{ - register tree t = build_decl (code, name, type); - retrofit_lang_decl (t); - return t; -} - -/* Add DECL_LANG_SPECIFIC info to T. Called from build_lang_decl - and pushdecl (for functions generated by the backend). */ - -void -retrofit_lang_decl (t) - tree t; -{ - struct obstack *obstack = current_obstack; - register int i = sizeof (struct lang_decl) / sizeof (int); - register int *pi; - - if (! TREE_PERMANENT (t)) - obstack = saveable_obstack; - else - /* Could be that saveable is permanent and current is not. */ - obstack = &permanent_obstack; - - if (free_lang_decl_chain && obstack == &permanent_obstack) - { - pi = (int *)free_lang_decl_chain; - free_lang_decl_chain = TREE_CHAIN (free_lang_decl_chain); - } - else - pi = (int *) obstack_alloc (obstack, sizeof (struct lang_decl)); - - while (i > 0) - pi[--i] = 0; - - DECL_LANG_SPECIFIC (t) = (struct lang_decl *) pi; - LANG_DECL_PERMANENT ((struct lang_decl *) pi) - = obstack == &permanent_obstack; - my_friendly_assert (LANG_DECL_PERMANENT ((struct lang_decl *) pi) - == TREE_PERMANENT (t), 234); - DECL_MAIN_VARIANT (t) = t; - if (current_lang_name == lang_name_cplusplus) - DECL_LANGUAGE (t) = lang_cplusplus; - else if (current_lang_name == lang_name_c) - DECL_LANGUAGE (t) = lang_c; - else if (current_lang_name == lang_name_java) - DECL_LANGUAGE (t) = lang_java; - else my_friendly_abort (64); - -#if 0 /* not yet, should get fixed properly later */ - if (code == TYPE_DECL) - { - tree id; - id = get_identifier (build_overload_name (type, 1, 1)); - DECL_ASSEMBLER_NAME (t) = id; - } - -#endif -#ifdef GATHER_STATISTICS - tree_node_counts[(int)lang_decl] += 1; - tree_node_sizes[(int)lang_decl] += sizeof (struct lang_decl); -#endif -} - -tree -build_lang_field_decl (code, name, type) - enum tree_code code; - tree name; - tree type; -{ - extern struct obstack *current_obstack, *saveable_obstack; - register tree t = build_decl (code, name, type); - struct obstack *obstack = current_obstack; - register int i = sizeof (struct lang_decl_flags) / sizeof (int); - register int *pi; -#if 0 /* not yet, should get fixed properly later */ - - if (code == TYPE_DECL) - { - tree id; - id = get_identifier (build_overload_name (type, 1, 1)); - DECL_ASSEMBLER_NAME (t) = id; - } -#endif - - if (! TREE_PERMANENT (t)) - obstack = saveable_obstack; - else - my_friendly_assert (obstack == &permanent_obstack, 235); - - pi = (int *) obstack_alloc (obstack, sizeof (struct lang_decl_flags)); - while (i > 0) - pi[--i] = 0; - - DECL_LANG_SPECIFIC (t) = (struct lang_decl *) pi; - return t; -} - -void -copy_lang_decl (node) - tree node; -{ - int size; - int *pi; - - if (! DECL_LANG_SPECIFIC (node)) - return; - - if (TREE_CODE (node) == FIELD_DECL) - size = sizeof (struct lang_decl_flags); - else - size = sizeof (struct lang_decl); - pi = (int *)obstack_alloc (&permanent_obstack, size); - bcopy ((char *)DECL_LANG_SPECIFIC (node), (char *)pi, size); - DECL_LANG_SPECIFIC (node) = (struct lang_decl *)pi; -} - -tree -make_lang_type (code) - enum tree_code code; -{ - extern struct obstack *current_obstack, *saveable_obstack; - register tree t = make_node (code); - - /* Set up some flags that give proper default behavior. */ - if (IS_AGGR_TYPE_CODE (code)) - { - struct obstack *obstack = current_obstack; - struct lang_type *pi; - - SET_IS_AGGR_TYPE (t, 1); - - if (! TREE_PERMANENT (t)) - obstack = saveable_obstack; - else - my_friendly_assert (obstack == &permanent_obstack, 236); - - pi = (struct lang_type *) obstack_alloc (obstack, sizeof (struct lang_type)); - bzero ((char *) pi, (int) sizeof (struct lang_type)); - - TYPE_LANG_SPECIFIC (t) = pi; - CLASSTYPE_AS_LIST (t) = build_expr_list (NULL_TREE, t); - SET_CLASSTYPE_INTERFACE_UNKNOWN_X (t, interface_unknown); - CLASSTYPE_INTERFACE_ONLY (t) = interface_only; - TYPE_BINFO (t) = make_binfo (integer_zero_node, t, NULL_TREE, NULL_TREE); - CLASSTYPE_BINFO_AS_LIST (t) - = build_tree_list (NULL_TREE, TYPE_BINFO (t)); - - /* Make sure this is laid out, for ease of use later. In the - presence of parse errors, the normal was of assuring this - might not ever get executed, so we lay it out *immediately*. */ - build_pointer_type (t); - -#ifdef GATHER_STATISTICS - tree_node_counts[(int)lang_type] += 1; - tree_node_sizes[(int)lang_type] += sizeof (struct lang_type); -#endif - } - else - /* We use TYPE_ALIAS_SET for the CLASSTYPE_MARKED bits. But, - TYPE_ALIAS_SET is initialized to -1 by default, so we must - clear it here. */ - TYPE_ALIAS_SET (t) = 0; - - return t; -} - -void -dump_time_statistics () -{ - register tree prev = 0, decl, next; - int this_time = my_get_run_time (); - TREE_INT_CST_LOW (TIME_IDENTIFIER_TIME (this_filename_time)) - += this_time - body_time; - - fprintf (stderr, "\n******\n"); - print_time ("header files (total)", header_time); - print_time ("main file (total)", this_time - body_time); - fprintf (stderr, "ratio = %g : 1\n", - (double)header_time / (double)(this_time - body_time)); - fprintf (stderr, "\n******\n"); - - for (decl = filename_times; decl; decl = next) - { - next = IDENTIFIER_GLOBAL_VALUE (decl); - SET_IDENTIFIER_GLOBAL_VALUE (decl, prev); - prev = decl; - } - - for (decl = prev; decl; decl = IDENTIFIER_GLOBAL_VALUE (decl)) - print_time (IDENTIFIER_POINTER (decl), - TREE_INT_CST_LOW (TIME_IDENTIFIER_TIME (decl))); -} - -void -compiler_error (s, v, v2) - char *s; - HOST_WIDE_INT v, v2; /* @@also used as pointer */ -{ - char buf[1024]; - sprintf (buf, s, v, v2); - error_with_file_and_line (input_filename, lineno, "%s (compiler error)", buf); -} - -void -yyerror (string) - char *string; -{ - extern int end_of_file; - char buf[200]; - - strcpy (buf, string); - - /* We can't print string and character constants well - because the token_buffer contains the result of processing escapes. */ - if (end_of_file) - strcat (buf, input_redirected () - ? " at end of saved text" - : " at end of input"); - else if (token_buffer[0] == 0) - strcat (buf, " at null character"); - else if (token_buffer[0] == '"') - strcat (buf, " before string constant"); - else if (token_buffer[0] == '\'') - strcat (buf, " before character constant"); - else if (!ISGRAPH ((unsigned char)token_buffer[0])) - sprintf (buf + strlen (buf), " before character 0%o", - (unsigned char) token_buffer[0]); - else - strcat (buf, " before `%s'"); - - error (buf, token_buffer); -} - -static int -handle_cp_pragma (pname) - char *pname; -{ - register int token; - - if (! strcmp (pname, "vtable")) - { - extern tree pending_vtables; - - /* More follows: it must be a string constant (class name). */ - token = real_yylex (); - if (token != STRING || TREE_CODE (yylval.ttype) != STRING_CST) - { - error ("invalid #pragma vtable"); - return -1; - } - - if (write_virtuals != 2) - { - warning ("use `+e2' option to enable #pragma vtable"); - return -1; - } - pending_vtables - = perm_tree_cons (NULL_TREE, - get_identifier (TREE_STRING_POINTER (yylval.ttype)), - pending_vtables); - token = real_yylex (); - if (token != END_OF_LINE) - warning ("trailing characters ignored"); - return 1; - } - else if (! strcmp (pname, "unit")) - { - /* More follows: it must be a string constant (unit name). */ - token = real_yylex (); - if (token != STRING || TREE_CODE (yylval.ttype) != STRING_CST) - { - error ("invalid #pragma unit"); - return -1; - } - token = real_yylex (); - if (token != END_OF_LINE) - warning ("trailing characters ignored"); - return 1; - } - else if (! strcmp (pname, "interface")) - { - tree fileinfo - = TIME_IDENTIFIER_FILEINFO (get_time_identifier (input_filename)); - char *main_filename = input_filename; - - main_filename = file_name_nondirectory (main_filename); - - token = real_yylex (); - - if (token != END_OF_LINE) - { - if (token != STRING - || TREE_CODE (yylval.ttype) != STRING_CST) - { - error ("invalid `#pragma interface'"); - return -1; - } - main_filename = TREE_STRING_POINTER (yylval.ttype); - token = real_yylex (); - } - - if (token != END_OF_LINE) - warning ("garbage after `#pragma interface' ignored"); - - write_virtuals = 3; - - if (impl_file_chain == 0) - { - /* If this is zero at this point, then we are - auto-implementing. */ - if (main_input_filename == 0) - main_input_filename = input_filename; - -#ifdef AUTO_IMPLEMENT - filename = file_name_nondirectory (main_input_filename); - fi = get_time_identifier (filename); - fi = TIME_IDENTIFIER_FILEINFO (fi); - TREE_INT_CST_LOW (fi) = 0; - TREE_INT_CST_HIGH (fi) = 1; - /* Get default. */ - impl_file_chain = (struct impl_files *)permalloc (sizeof (struct impl_files)); - impl_file_chain->filename = filename; - impl_file_chain->next = 0; -#endif - } - - interface_only = interface_strcmp (main_filename); -#ifdef MULTIPLE_SYMBOL_SPACES - if (! interface_only) - interface_unknown = 0; -#else /* MULTIPLE_SYMBOL_SPACES */ - interface_unknown = 0; -#endif /* MULTIPLE_SYMBOL_SPACES */ - TREE_INT_CST_LOW (fileinfo) = interface_only; - TREE_INT_CST_HIGH (fileinfo) = interface_unknown; - - return 1; - } - else if (! strcmp (pname, "implementation")) - { - tree fileinfo - = TIME_IDENTIFIER_FILEINFO (get_time_identifier (input_filename)); - char *main_filename = main_input_filename ? main_input_filename : input_filename; - - main_filename = file_name_nondirectory (main_filename); - token = real_yylex (); - if (token != END_OF_LINE) - { - if (token != STRING - || TREE_CODE (yylval.ttype) != STRING_CST) - { - error ("invalid `#pragma implementation'"); - return -1; - } - main_filename = TREE_STRING_POINTER (yylval.ttype); - token = real_yylex (); - } - - if (token != END_OF_LINE) - warning ("garbage after `#pragma implementation' ignored"); - - if (write_virtuals == 3) - { - struct impl_files *ifiles = impl_file_chain; - while (ifiles) - { - if (! strcmp (ifiles->filename, main_filename)) - break; - ifiles = ifiles->next; - } - if (ifiles == 0) - { - ifiles = (struct impl_files*) permalloc (sizeof (struct impl_files)); - ifiles->filename = main_filename; - ifiles->next = impl_file_chain; - impl_file_chain = ifiles; - } - } - else if ((main_input_filename != 0 - && ! strcmp (main_input_filename, input_filename)) - || ! strcmp (input_filename, main_filename)) - { - write_virtuals = 3; - if (impl_file_chain == 0) - { - impl_file_chain = (struct impl_files*) permalloc (sizeof (struct impl_files)); - impl_file_chain->filename = main_filename; - impl_file_chain->next = 0; - } - } - else - error ("`#pragma implementation' can only appear at top-level"); - interface_only = 0; -#if 1 - /* We make this non-zero so that we infer decl linkage - in the impl file only for variables first declared - in the interface file. */ - interface_unknown = 1; -#else - /* We make this zero so that templates in the impl - file will be emitted properly. */ - interface_unknown = 0; -#endif - TREE_INT_CST_LOW (fileinfo) = interface_only; - TREE_INT_CST_HIGH (fileinfo) = interface_unknown; - - return 1; - } - - return 0; -} - -/* Return the type-qualifier corresponding to the identifier given by - RID. */ - -int -cp_type_qual_from_rid (rid) - tree rid; -{ - if (rid == ridpointers[(int) RID_CONST]) - return TYPE_QUAL_CONST; - else if (rid == ridpointers[(int) RID_VOLATILE]) - return TYPE_QUAL_VOLATILE; - else if (rid == ridpointers[(int) RID_RESTRICT]) - return TYPE_QUAL_RESTRICT; - - my_friendly_abort (0); - return TYPE_UNQUALIFIED; -} - - -#ifdef HANDLE_GENERIC_PRAGMAS - -/* Handle a #pragma directive. TOKEN is the type of the word following - the #pragma directive on the line. Process the entire input line and - return non-zero iff the directive successfully parsed. */ - -/* This function has to be in this file, in order to get at - the token types. */ - -static int -handle_generic_pragma (token) - register int token; -{ - for (;;) - { - switch (token) - { - case IDENTIFIER: - case TYPENAME: - case STRING: - case CONSTANT: - handle_pragma_token (token_buffer, yylval.ttype); - break; - - case LEFT_RIGHT: - handle_pragma_token ("(", NULL_TREE); - handle_pragma_token (")", NULL_TREE); - break; - - case END_OF_LINE: - return handle_pragma_token (NULL_PTR, NULL_TREE); - - default: - handle_pragma_token (token_buffer, NULL); - } - - token = real_yylex (); - } -} -#endif /* HANDLE_GENERIC_PRAGMAS */ diff --git a/gcc/cp/method.c b/gcc/cp/method.c deleted file mode 100755 index 1fa8794..0000000 --- a/gcc/cp/method.c +++ /dev/null @@ -1,2466 +0,0 @@ -/* Handle the hair of processing (but not expanding) inline functions. - Also manage function and variable name overloading. - Copyright (C) 1987, 89, 92-97, 1998 Free Software Foundation, Inc. - Contributed by Michael Tiemann (tiemann@cygnus.com) - -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 -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - - -#ifndef __GNUC__ -#define __inline -#endif - -#ifndef PARM_CAN_BE_ARRAY_TYPE -#define PARM_CAN_BE_ARRAY_TYPE 1 -#endif - -/* Handle method declarations. */ -#include "config.h" -#include "system.h" -#include "tree.h" -#include "cp-tree.h" -#include "obstack.h" -#include "rtl.h" -#include "expr.h" -#include "output.h" -#include "hard-reg-set.h" -#include "flags.h" -#include "toplev.h" - -/* TREE_LIST of the current inline functions that need to be - processed. */ -struct pending_inline *pending_inlines; - -int static_labelno; - -#define obstack_chunk_alloc xmalloc -#define obstack_chunk_free free - -/* Obstack where we build text strings for overloading, etc. */ -static struct obstack scratch_obstack; -static char *scratch_firstobj; - -static void icat PROTO((HOST_WIDE_INT)); -static void dicat PROTO((HOST_WIDE_INT, HOST_WIDE_INT)); -static void flush_repeats PROTO((int, tree)); -static void build_overload_identifier PROTO((tree)); -static void build_overload_nested_name PROTO((tree)); -static void build_overload_int PROTO((tree, int)); -static void build_overload_identifier PROTO((tree)); -static void build_qualified_name PROTO((tree)); -static void build_overload_value PROTO((tree, tree, int)); -static void issue_nrepeats PROTO((int, tree)); -static char *build_mangled_name PROTO((tree,int,int)); -static void process_modifiers PROTO((tree)); -static void process_overload_item PROTO((tree,int)); -static void do_build_assign_ref PROTO((tree)); -static void do_build_copy_constructor PROTO((tree)); -static tree largest_union_member PROTO((tree)); -static void build_template_template_parm_names PROTO((tree)); -static void build_template_parm_names PROTO((tree, tree)); -static void build_underscore_int PROTO((int)); -static void start_squangling PROTO((void)); -static void end_squangling PROTO((void)); -static int check_ktype PROTO((tree, int)); -static int issue_ktype PROTO((tree)); -static void build_overload_scope_ref PROTO((tree)); -static void build_mangled_template_parm_index PROTO((char *, tree)); -#if HOST_BITS_PER_WIDE_INT >= 64 -static void build_mangled_C9x_name PROTO((int)); -#endif -static int is_back_referenceable_type PROTO((tree)); -static int check_btype PROTO((tree)); -static void build_mangled_name_for_type PROTO((tree)); -static void build_mangled_name_for_type_with_Gcode PROTO((tree, int)); - -# define OB_INIT() (scratch_firstobj ? (obstack_free (&scratch_obstack, scratch_firstobj), 0) : 0) -# define OB_PUTC(C) (obstack_1grow (&scratch_obstack, (C))) -# define OB_PUTC2(C1,C2) \ - (obstack_1grow (&scratch_obstack, (C1)), obstack_1grow (&scratch_obstack, (C2))) -# define OB_PUTS(S) (obstack_grow (&scratch_obstack, (S), sizeof (S) - 1)) -# define OB_PUTID(ID) \ - (obstack_grow (&scratch_obstack, IDENTIFIER_POINTER (ID), \ - IDENTIFIER_LENGTH (ID))) -# define OB_PUTCP(S) (obstack_grow (&scratch_obstack, (S), strlen (S))) -# define OB_FINISH() (obstack_1grow (&scratch_obstack, '\0')) -# define OB_LAST() (obstack_next_free (&scratch_obstack)[-1]) - -void -init_method () -{ - gcc_obstack_init (&scratch_obstack); - scratch_firstobj = (char *)obstack_alloc (&scratch_obstack, 0); -} - -/* This must be large enough to hold any printed integer or floating-point - value. */ -static char digit_buffer[128]; - -/* Move inline function definitions out of structure so that they - can be processed normally. CNAME is the name of the class - we are working from, METHOD_LIST is the list of method lists - of the structure. We delete friend methods here, after - saving away their inline function definitions (if any). */ - -void -do_inline_function_hair (type, friend_list) - tree type, friend_list; -{ - tree method = TYPE_METHODS (type); - - if (method && TREE_CODE (method) == TREE_VEC) - { - if (TREE_VEC_ELT (method, 1)) - method = TREE_VEC_ELT (method, 1); - else if (TREE_VEC_ELT (method, 0)) - method = TREE_VEC_ELT (method, 0); - else - method = TREE_VEC_ELT (method, 2); - } - - while (method) - { - /* Do inline member functions. */ - struct pending_inline *info = DECL_PENDING_INLINE_INFO (method); - if (info) - { - tree args; - - my_friendly_assert (info->fndecl == method, 238); - args = DECL_ARGUMENTS (method); - while (args) - { - DECL_CONTEXT (args) = method; - args = TREE_CHAIN (args); - } - } - method = TREE_CHAIN (method); - } - while (friend_list) - { - tree fndecl = TREE_VALUE (friend_list); - struct pending_inline *info = DECL_PENDING_INLINE_INFO (fndecl); - if (info) - { - tree args; - - my_friendly_assert (info->fndecl == fndecl, 239); - args = DECL_ARGUMENTS (fndecl); - while (args) - { - DECL_CONTEXT (args) = fndecl; - args = TREE_CHAIN (args); - } - } - - friend_list = TREE_CHAIN (friend_list); - } -} - -/* Here is where overload code starts. */ - -/* type tables for K and B type compression */ -static tree *btypelist = NULL; -static tree *ktypelist = NULL; -static int maxbsize = 0; -static int maxksize = 0; - -/* number of each type seen */ -static int maxbtype = 0; -static int maxktype = 0; - -/* Array of types seen so far in top-level call to `build_mangled_name'. - Allocated and deallocated by caller. */ -static tree *typevec = NULL; -static int typevec_size; - -/* Number of types interned by `build_mangled_name' so far. */ -static int maxtype = 0; - -/* Nonzero if we should not try folding parameter types. */ -static int nofold; - -/* This appears to be set to true if an underscore is required to be - comcatenated before another number can be outputed. */ -static int numeric_output_need_bar; - -static __inline void -start_squangling () -{ - if (flag_do_squangling) - { - nofold = 0; - maxbtype = 0; - maxktype = 0; - maxbsize = 50; - maxksize = 50; - btypelist = (tree *)xmalloc (sizeof (tree) * maxbsize); - ktypelist = (tree *)xmalloc (sizeof (tree) * maxksize); - } -} - -static __inline void -end_squangling () -{ - if (flag_do_squangling) - { - if (ktypelist) - free (ktypelist); - if (btypelist) - free (btypelist); - maxbsize = 0; - maxksize = 0; - maxbtype = 0; - maxktype = 0; - ktypelist = NULL; - btypelist = NULL; - } -} - -/* Code to concatenate an asciified integer to a string. */ - -static __inline void -icat (i) - HOST_WIDE_INT i; -{ - unsigned HOST_WIDE_INT ui; - - /* Handle this case first, to go really quickly. For many common values, - the result of ui/10 below is 1. */ - if (i == 1) - { - OB_PUTC ('1'); - return; - } - - if (i >= 0) - ui = i; - else - { - OB_PUTC ('m'); - ui = -i; - } - - if (ui >= 10) - icat (ui / 10); - - OB_PUTC ('0' + (ui % 10)); -} - -static void -dicat (lo, hi) - HOST_WIDE_INT lo, hi; -{ - unsigned HOST_WIDE_INT ulo, uhi, qlo, qhi; - - if (hi >= 0) - { - uhi = hi; - ulo = lo; - } - else - { - uhi = (lo == 0 ? -hi : -hi-1); - ulo = -lo; - } - if (uhi == 0 - && ulo < ((unsigned HOST_WIDE_INT)1 << (HOST_BITS_PER_WIDE_INT - 1))) - { - icat (ulo); - return; - } - /* Divide 2^HOST_WIDE_INT*uhi+ulo by 10. */ - qhi = uhi / 10; - uhi = uhi % 10; - qlo = uhi * (((unsigned HOST_WIDE_INT)1 << (HOST_BITS_PER_WIDE_INT - 1)) / 5); - qlo += ulo / 10; - ulo = ulo % 10; - ulo += uhi * (((unsigned HOST_WIDE_INT)1 << (HOST_BITS_PER_WIDE_INT - 1)) % 5) - * 2; - qlo += ulo / 10; - ulo = ulo % 10; - /* Quotient is 2^HOST_WIDE_INT*qhi+qlo, remainder is ulo. */ - dicat (qlo, qhi); - OB_PUTC ('0' + ulo); -} - -static __inline void -flush_repeats (nrepeats, type) - int nrepeats; - tree type; -{ - int tindex = 0; - - while (typevec[tindex] != type) - tindex++; - - if (nrepeats > 1) - { - OB_PUTC ('N'); - icat (nrepeats); - if (nrepeats > 9) - OB_PUTC ('_'); - } - else - OB_PUTC ('T'); - icat (tindex); - if (tindex > 9) - OB_PUTC ('_'); -} - -/* Returns nonzero iff this is a type to which we will want to make - back-references (using the `B' code). */ - -static int -is_back_referenceable_type (type) - tree type; -{ - if (btypelist == NULL) - /* We're not generating any back-references. */ - return 0; - - switch (TREE_CODE (type)) - { - case INTEGER_TYPE: - case REAL_TYPE: - case VOID_TYPE: - case BOOLEAN_TYPE: - /* These types have single-character manglings, so there's no - point in generating back-references. */ - return 0; - - case TEMPLATE_TYPE_PARM: - /* It would be a bit complex to demangle signatures correctly if - we generated back-references to these, and the manglings of - type parameters are short. */ - return 0; - - default: - return 1; - } -} - -/* Issue the squangling code indicating NREPEATS repetitions of TYPE, - which was the last parameter type output. */ - -static void -issue_nrepeats (nrepeats, type) - int nrepeats; - tree type; -{ - if (nrepeats == 1 && !is_back_referenceable_type (type)) - /* For types whose manglings are short, don't bother using the - repetition code if there's only one repetition, since the - repetition code will be about as long as the ordinary mangling. */ - build_mangled_name_for_type (type); - else - { - OB_PUTC ('n'); - icat (nrepeats); - if (nrepeats > 9) - OB_PUTC ('_'); - } -} - -/* Check to see if a tree node has been entered into the Kcode typelist */ -/* if not, add it. Return -1 if it isn't found, otherwise return the index */ -static int -check_ktype (node, add) - tree node; - int add; -{ - int x; - tree localnode = node; - - if (ktypelist == NULL) - return -1; - - if (TREE_CODE (node) == TYPE_DECL) - localnode = TREE_TYPE (node); - - for (x=0; x < maxktype; x++) - { - if (localnode == ktypelist[x]) - return x ; - } - /* Didn't find it, so add it here */ - if (add) - { - if (maxksize <= maxktype) - { - maxksize = maxksize* 3 / 2; - ktypelist = (tree *)xrealloc (ktypelist, sizeof (tree) * maxksize); - } - ktypelist[maxktype++] = localnode; - } - return -1; -} - - -static __inline int -issue_ktype (decl) - tree decl; -{ - int kindex; - kindex = check_ktype (decl, FALSE); - if (kindex != -1) - { - OB_PUTC ('K'); - icat (kindex); - if (kindex > 9) - OB_PUTC ('_'); - return TRUE; - } - return FALSE; -} - -/* Build a representation for DECL, which may be an entity not at - global scope. If so, a marker indicating that the name is - qualified has already been output, but the qualifying context has - not. */ - -static void -build_overload_nested_name (decl) - tree decl; -{ - tree context; - - if (ktypelist && issue_ktype (decl)) - return; - - if (decl == global_namespace) - return; - - context = CP_DECL_CONTEXT (decl); - - /* try to issue a K type, and if we can't continue the normal path */ - if (!(ktypelist && issue_ktype (context))) - { - /* For a template type parameter, we want to output an 'Xn' - rather than 'T' or some such. */ - if (TREE_CODE (context) == TEMPLATE_TYPE_PARM - || TREE_CODE (context) == TEMPLATE_TEMPLATE_PARM) - build_mangled_name_for_type (context); - else - { - if (TREE_CODE_CLASS (TREE_CODE (context)) == 't') - context = TYPE_NAME (context); - build_overload_nested_name (context); - } - } - - if (TREE_CODE (decl) == FUNCTION_DECL) - { - tree name = DECL_ASSEMBLER_NAME (decl); - char *label; - - ASM_FORMAT_PRIVATE_NAME (label, IDENTIFIER_POINTER (name), static_labelno); - static_labelno++; - - if (numeric_output_need_bar) - OB_PUTC ('_'); - icat (strlen (label)); - OB_PUTCP (label); - numeric_output_need_bar = 1; - } - else if (TREE_CODE (decl) == NAMESPACE_DECL) - build_overload_identifier (DECL_NAME (decl)); - else /* TYPE_DECL */ - build_overload_identifier (decl); -} - -/* Output the decimal representation of I. If I > 9, the decimal - representation is preceeded and followed by an underscore. */ - -static void -build_underscore_int (i) - int i; -{ - if (i > 9) - OB_PUTC ('_'); - icat (i); - if (i > 9) - OB_PUTC ('_'); -} - -static void -build_overload_scope_ref (value) - tree value; -{ - OB_PUTC2 ('Q', '2'); - numeric_output_need_bar = 0; - build_mangled_name_for_type (TREE_OPERAND (value, 0)); - build_overload_identifier (TREE_OPERAND (value, 1)); -} - -/* Encoding for an INTEGER_CST value. */ - -static void -build_overload_int (value, in_template) - tree value; - int in_template; -{ - if (in_template && TREE_CODE (value) != INTEGER_CST) - { - if (TREE_CODE (value) == SCOPE_REF) - { - build_overload_scope_ref (value); - return; - } - - OB_PUTC ('E'); - numeric_output_need_bar = 0; - - if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (value)))) - { - int i; - int operands = tree_code_length[(int) TREE_CODE (value)]; - tree id; - char* name; - - id = ansi_opname [(int) TREE_CODE (value)]; - my_friendly_assert (id != NULL_TREE, 0); - name = IDENTIFIER_POINTER (id); - if (name[0] != '_' || name[1] != '_') - /* On some erroneous inputs, we can get here with VALUE a - LOOKUP_EXPR. In that case, the NAME will be the - identifier for "". We must survive - this routine in order to issue a sensible error - message, so we fall through to the case below. */ - goto bad_value; - - for (i = 0; i < operands; ++i) - { - tree operand; - enum tree_code tc; - - /* We just outputted either the `E' or the name of the - operator. */ - numeric_output_need_bar = 0; - - if (i != 0) - /* Skip the leading underscores. */ - OB_PUTCP (name + 2); - - operand = TREE_OPERAND (value, i); - tc = TREE_CODE (operand); - - if (TREE_CODE_CLASS (tc) == 't') - /* We can get here with sizeof, e.g.: - - template void f(A); */ - build_mangled_name_for_type (operand); - else if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (tc))) - build_overload_int (operand, in_template); - else - build_overload_value (TREE_TYPE (operand), - operand, - in_template); - } - } - else - { - /* We don't ever want this output, but it's - inconvenient not to be able to build the string. - This should cause assembler errors we'll notice. */ - - static int n; - bad_value: - sprintf (digit_buffer, " *%d", n++); - OB_PUTCP (digit_buffer); - } - - OB_PUTC ('W'); - numeric_output_need_bar = 0; - return; - } - - my_friendly_assert (TREE_CODE (value) == INTEGER_CST, 243); - if (TYPE_PRECISION (TREE_TYPE (value)) == 2 * HOST_BITS_PER_WIDE_INT) - { - if (TREE_INT_CST_HIGH (value) - != (TREE_INT_CST_LOW (value) >> (HOST_BITS_PER_WIDE_INT - 1))) - { - /* need to print a DImode value in decimal */ - dicat (TREE_INT_CST_LOW (value), TREE_INT_CST_HIGH (value)); - numeric_output_need_bar = 1; - return; - } - /* else fall through to print in smaller mode */ - } - /* Wordsize or smaller */ - icat (TREE_INT_CST_LOW (value)); - numeric_output_need_bar = 1; -} - - -/* Output S followed by a representation of the TEMPLATE_PARM_INDEX - supplied in INDEX. */ - -static void -build_mangled_template_parm_index (s, index) - char* s; - tree index; -{ - OB_PUTCP (s); - build_underscore_int (TEMPLATE_PARM_IDX (index)); - /* We use the LEVEL, not the ORIG_LEVEL, because the mangling is a - representation of the function from the point of view of its - type. */ - build_underscore_int (TEMPLATE_PARM_LEVEL (index)); -} - - -/* Mangling for C9X integer types (and Cygnus extensions for 128-bit - and other types) is based on the letter "I" followed by the hex - representations of the bitsize for the type in question. For - encodings that result in larger than two digits, a leading and - trailing underscore is added. - - Thus: - int1_t = 001 = I01 - int8_t = 008 = I08 - int16_t = 010 = I10 - int24_t = 018 = I18 - int32_t = 020 = I20 - int64_t = 040 = I40 - int80_t = 050 = I50 - int128_t = 080 = I80 - int256_t = 100 = I_100_ - int512_t = 200 = I_200_ - - Given an integer in decimal format, mangle according to this scheme. */ - -#if HOST_BITS_PER_WIDE_INT >= 64 -static void -build_mangled_C9x_name (bits) - int bits; -{ - char mangled[10] = ""; - - if (bits > 255) - sprintf (mangled, "I_%x_", bits); - else - sprintf (mangled, "I%.2x", bits); - - OB_PUTCP (mangled); -} -#endif - -static void -build_overload_value (type, value, in_template) - tree type, value; - int in_template; -{ - my_friendly_assert (TREE_CODE_CLASS (TREE_CODE (type)) == 't', 0); - - while (TREE_CODE (value) == NON_LVALUE_EXPR - || TREE_CODE (value) == NOP_EXPR) - value = TREE_OPERAND (value, 0); - - if (numeric_output_need_bar) - { - OB_PUTC ('_'); - numeric_output_need_bar = 0; - } - - if (TREE_CODE (value) == TEMPLATE_PARM_INDEX) - { - build_mangled_template_parm_index ("Y", value); - return; - } - - if (TYPE_PTRMEM_P (type)) - { - if (TREE_CODE (value) != PTRMEM_CST) - /* We should have already rejected this pointer to member, - since it is not a constant. */ - my_friendly_abort (0); - - /* Get the actual FIELD_DECL. */ - value = PTRMEM_CST_MEMBER (value); - my_friendly_assert (TREE_CODE (value) == FIELD_DECL, 0); - - /* Output the name of the field. */ - build_overload_identifier (DECL_NAME (value)); - return; - } - - if (TYPE_PTRMEMFUNC_P (type)) - type = TYPE_PTRMEMFUNC_FN_TYPE (type); - - switch (TREE_CODE (type)) - { - case INTEGER_TYPE: - case ENUMERAL_TYPE: - case BOOLEAN_TYPE: - { - build_overload_int (value, in_template); - return; - } - case REAL_TYPE: - { - REAL_VALUE_TYPE val; - char *bufp = digit_buffer; - - pedwarn ("ANSI C++ forbids floating-point template arguments"); - - my_friendly_assert (TREE_CODE (value) == REAL_CST, 244); - val = TREE_REAL_CST (value); - if (REAL_VALUE_ISNAN (val)) - { - sprintf (bufp, "NaN"); - } - else - { - if (REAL_VALUE_NEGATIVE (val)) - { - val = REAL_VALUE_NEGATE (val); - *bufp++ = 'm'; - } - if (REAL_VALUE_ISINF (val)) - { - sprintf (bufp, "Infinity"); - } - else - { - REAL_VALUE_TO_DECIMAL (val, "%.20e", bufp); - bufp = (char *) index (bufp, 'e'); - if (!bufp) - strcat (digit_buffer, "e0"); - else - { - char *p; - bufp++; - if (*bufp == '-') - { - *bufp++ = 'm'; - } - p = bufp; - if (*p == '+') - p++; - while (*p == '0') - p++; - if (*p == 0) - { - *bufp++ = '0'; - *bufp = 0; - } - else if (p != bufp) - { - while (*p) - *bufp++ = *p++; - *bufp = 0; - } - } -#ifdef NO_DOT_IN_LABEL - bufp = (char *) index (bufp, '.'); - if (bufp) - *bufp = '_'; -#endif - } - } - OB_PUTCP (digit_buffer); - numeric_output_need_bar = 1; - return; - } - case POINTER_TYPE: - if (TREE_CODE (TREE_TYPE (type)) == METHOD_TYPE - && TREE_CODE (value) != ADDR_EXPR) - { - if (TREE_CODE (value) == CONSTRUCTOR) - { - /* This is dangerous code, crack built up pointer to members. */ - tree args = CONSTRUCTOR_ELTS (value); - tree a1 = TREE_VALUE (args); - tree a2 = TREE_VALUE (TREE_CHAIN (args)); - tree a3 = CONSTRUCTOR_ELTS (TREE_VALUE (TREE_CHAIN (TREE_CHAIN (args)))); - a3 = TREE_VALUE (a3); - STRIP_NOPS (a3); - if (TREE_CODE (a1) == INTEGER_CST - && TREE_CODE (a2) == INTEGER_CST) - { - build_overload_int (a1, in_template); - OB_PUTC ('_'); - build_overload_int (a2, in_template); - OB_PUTC ('_'); - if (TREE_CODE (a3) == ADDR_EXPR) - { - a3 = TREE_OPERAND (a3, 0); - if (TREE_CODE (a3) == FUNCTION_DECL) - { - numeric_output_need_bar = 0; - build_overload_identifier (DECL_ASSEMBLER_NAME (a3)); - return; - } - } - else if (TREE_CODE (a3) == INTEGER_CST) - { - OB_PUTC ('i'); - build_overload_int (a3, in_template); - return; - } - } - } - sorry ("template instantiation with pointer to method that is too complex"); - return; - } - if (TREE_CODE (value) == INTEGER_CST) - { - build_overload_int (value, in_template); - return; - } - else if (TREE_CODE (value) == TEMPLATE_PARM_INDEX) - { - build_mangled_template_parm_index ("", value); - numeric_output_need_bar = 1; - return; - } - - value = TREE_OPERAND (value, 0); - - /* Fall through. */ - - case REFERENCE_TYPE: - if (TREE_CODE (value) == VAR_DECL) - { - my_friendly_assert (DECL_NAME (value) != 0, 245); - build_overload_identifier (DECL_ASSEMBLER_NAME (value)); - return; - } - else if (TREE_CODE (value) == FUNCTION_DECL) - { - my_friendly_assert (DECL_NAME (value) != 0, 246); - build_overload_identifier (DECL_ASSEMBLER_NAME (value)); - return; - } - else if (TREE_CODE (value) == SCOPE_REF) - build_overload_scope_ref (value); - else - my_friendly_abort (71); - break; /* not really needed */ - - default: - sorry ("conversion of %s as template parameter", - tree_code_name [(int) TREE_CODE (type)]); - my_friendly_abort (72); - } -} - - -/* Add encodings for the declaration of template template parameters. - PARMLIST must be a TREE_VEC */ - -static void -build_template_template_parm_names (parmlist) - tree parmlist; -{ - int i, nparms; - - my_friendly_assert (TREE_CODE (parmlist) == TREE_VEC, 246.5); - nparms = TREE_VEC_LENGTH (parmlist); - icat (nparms); - for (i = 0; i < nparms; i++) - { - tree parm = TREE_VALUE (TREE_VEC_ELT (parmlist, i)); - if (TREE_CODE (parm) == TYPE_DECL) - { - /* This parameter is a type. */ - OB_PUTC ('Z'); - } - else if (TREE_CODE (parm) == TEMPLATE_DECL) - { - /* This parameter is a template. */ - OB_PUTC ('z'); - build_template_template_parm_names (DECL_INNERMOST_TEMPLATE_PARMS (parm)); - } - else - /* It's a PARM_DECL. */ - build_mangled_name_for_type (TREE_TYPE (parm)); - } -} - - -/* Add encodings for the vector of template parameters in PARMLIST, - given the vector of arguments to be substituted in ARGLIST. */ - -static void -build_template_parm_names (parmlist, arglist) - tree parmlist; - tree arglist; -{ - int i, nparms; - tree inner_args = innermost_args (arglist); - - nparms = TREE_VEC_LENGTH (parmlist); - icat (nparms); - for (i = 0; i < nparms; i++) - { - tree parm = TREE_VALUE (TREE_VEC_ELT (parmlist, i)); - tree arg = TREE_VEC_ELT (inner_args, i); - if (TREE_CODE (parm) == TYPE_DECL) - { - /* This parameter is a type. */ - OB_PUTC ('Z'); - build_mangled_name_for_type (arg); - } - else if (TREE_CODE (parm) == TEMPLATE_DECL) - { - /* This parameter is a template. */ - if (TREE_CODE (arg) == TEMPLATE_TEMPLATE_PARM) - /* Output parameter declaration, argument index and level */ - build_mangled_name_for_type (arg); - else - { - /* A TEMPLATE_DECL node, output the parameter declaration - and template name */ - - OB_PUTC ('z'); - build_template_template_parm_names (DECL_INNERMOST_TEMPLATE_PARMS (parm)); - icat (IDENTIFIER_LENGTH (DECL_NAME (arg))); - OB_PUTID (DECL_NAME (arg)); - } - } - else - { - parm = tsubst (parm, arglist, NULL_TREE); - /* It's a PARM_DECL. */ - build_mangled_name_for_type (TREE_TYPE (parm)); - build_overload_value (TREE_TYPE (parm), arg, - uses_template_parms (arglist)); - } - } - } - -/* Output the representation for NAME, which is either a TYPE_DECL or - an IDENTIFIER. */ - -static void -build_overload_identifier (name) - tree name; -{ - if (TREE_CODE (name) == TYPE_DECL - && CLASS_TYPE_P (TREE_TYPE (name)) - && CLASSTYPE_TEMPLATE_INFO (TREE_TYPE (name)) - && (PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (TREE_TYPE (name))) - || (TREE_CODE (DECL_CONTEXT (CLASSTYPE_TI_TEMPLATE - (TREE_TYPE (name)))) - == FUNCTION_DECL))) - { - /* NAME is the TYPE_DECL for a template specialization. */ - tree template, parmlist, arglist, tname; - template = CLASSTYPE_TI_TEMPLATE (TREE_TYPE (name)); - arglist = CLASSTYPE_TI_ARGS (TREE_TYPE (name)); - tname = DECL_NAME (template); - parmlist = DECL_INNERMOST_TEMPLATE_PARMS (template); - OB_PUTC ('t'); - icat (IDENTIFIER_LENGTH (tname)); - OB_PUTID (tname); - build_template_parm_names (parmlist, arglist); - } - else - { - if (TREE_CODE (name) == TYPE_DECL) - name = DECL_NAME (name); - if (numeric_output_need_bar) - { - OB_PUTC ('_'); - numeric_output_need_bar = 0; - } - icat (IDENTIFIER_LENGTH (name)); - OB_PUTID (name); - } -} - -/* Given DECL, either a class TYPE, TYPE_DECL or FUNCTION_DECL, produce - the mangling for it. Used by build_mangled_name and build_static_name. */ - -static void -build_qualified_name (decl) - tree decl; -{ - tree context; - int i = 1; - - if (TREE_CODE_CLASS (TREE_CODE (decl)) == 't') - decl = TYPE_NAME (decl); - - /* If DECL_ASSEMBLER_NAME has been set properly, use it. */ - if (TREE_CODE (decl) == TYPE_DECL - && DECL_ASSEMBLER_NAME (decl) != DECL_NAME (decl) && !flag_do_squangling) - { - tree id = DECL_ASSEMBLER_NAME (decl); - OB_PUTID (id); - if (ISDIGIT (IDENTIFIER_POINTER (id) [IDENTIFIER_LENGTH (id) - 1])) - numeric_output_need_bar = 1; - return; - } - - context = decl; - /* if we can't find a Ktype, do it the hard way */ - if (check_ktype (context, FALSE) == -1) - { - /* count type and namespace scopes */ - while (DECL_CONTEXT (context) && DECL_CONTEXT (context) != global_namespace) - { - i += 1; - context = DECL_CONTEXT (context); - if (check_ktype (context, FALSE) != -1) /* found it! */ - break; - if (TREE_CODE_CLASS (TREE_CODE (context)) == 't') - context = TYPE_NAME (context); - } - } - - if (i > 1) - { - OB_PUTC ('Q'); - build_underscore_int (i); - numeric_output_need_bar = 0; - } - build_overload_nested_name (decl); -} - -/* Output the mangled representation for TYPE. If EXTRA_GCODE is - non-zero, mangled names for structure/union types are intentionally - mangled differently from the method described in the ARM. */ - -static void -build_mangled_name_for_type_with_Gcode (type, extra_Gcode) - tree type; - int extra_Gcode; -{ - if (TYPE_PTRMEMFUNC_P (type)) - type = TYPE_PTRMEMFUNC_FN_TYPE (type); - type = canonical_type_variant (type); - process_modifiers (type); - process_overload_item (type, extra_Gcode); -} - -/* Like build_mangled_name_for_type_with_Gcode, but never outputs the - `G'. */ - -static void -build_mangled_name_for_type (type) - tree type; -{ - build_mangled_name_for_type_with_Gcode (type, 0); -} - -/* Given a list of parameters in PARMTYPES, create an unambiguous - overload string. Should distinguish any type that C (or C++) can - distinguish. I.e., pointers to functions are treated correctly. - - Caller must deal with whether a final `e' goes on the end or not. - - Any default conversions must take place before this function - is called. - - BEGIN and END control initialization and finalization of the - obstack where we build the string. */ - -char * -build_overload_name (parmtypes, begin, end) - tree parmtypes; - int begin, end; -{ - char *ret; - start_squangling (); - ret = build_mangled_name (parmtypes, begin, end); - end_squangling (); - return ret ; -} - -/* Output the mangled representation for PARMTYPES. If PARMTYPES is a - TREE_LIST, then it is a list of parameter types. Otherwise, - PARMTYPES must be a single type. */ - -static char * -build_mangled_name (parmtypes, begin, end) - tree parmtypes; - int begin, end; -{ - if (begin) - OB_INIT (); - - if (TREE_CODE (parmtypes) != TREE_LIST) - /* There is only one type. */ - build_mangled_name_for_type (parmtypes); - else - { - /* There are several types in a parameter list. */ - int nrepeats = 0; - int old_style_repeats = !flag_do_squangling && !nofold && typevec; - tree last_type = NULL_TREE; - - for (; parmtypes && parmtypes != void_list_node; - parmtypes = TREE_CHAIN (parmtypes)) - { - tree parmtype = canonical_type_variant (TREE_VALUE (parmtypes)); - - if (old_style_repeats) - { - /* Every argument gets counted. */ - my_friendly_assert (maxtype < typevec_size, 387); - typevec[maxtype++] = parmtype; - } - - if (parmtype == last_type) - { - if (flag_do_squangling - || (old_style_repeats && TREE_USED (parmtype) - && !TYPE_FOR_JAVA (parmtype))) - { - /* The next type is the same as this one. Keep - track of the repetition, and output the repeat - count later. */ - nrepeats++; - continue; - } - } - else if (nrepeats != 0) - { - /* Indicate how many times the previous parameter was - repeated. */ - if (old_style_repeats) - flush_repeats (nrepeats, last_type); - else - issue_nrepeats (nrepeats, last_type); - nrepeats = 0; - } - - last_type = parmtype; - - if (old_style_repeats) - { - if (nrepeats) - { - flush_repeats (nrepeats, last_type); - nrepeats = 0; - } - - if (TREE_USED (parmtype)) - { -#if 0 - /* We can turn this on at some point when we want - improved symbol mangling. */ - nrepeats++; -#else - /* This is bug compatible with 2.7.x */ - flush_repeats (nrepeats, parmtype); -#endif - nrepeats = 0; - continue; - } - - /* Only cache types which take more than one character. */ - if ((parmtype != TYPE_MAIN_VARIANT (parmtype) - || (TREE_CODE (parmtype) != INTEGER_TYPE - && TREE_CODE (parmtype) != REAL_TYPE)) - && ! TYPE_FOR_JAVA (parmtype)) - TREE_USED (parmtype) = 1; - } - - /* Output the PARMTYPE. */ - build_mangled_name_for_type_with_Gcode (parmtype, 1); - } - - /* Output the repeat count for the last parameter, if - necessary. */ - if (nrepeats != 0) - { - if (old_style_repeats) - flush_repeats (nrepeats, last_type); - else - issue_nrepeats (nrepeats, last_type); - nrepeats = 0; - } - - if (!parmtypes) - /* The parameter list ends in an ellipsis. */ - OB_PUTC ('e'); - } - - if (end) - OB_FINISH (); - return (char *)obstack_base (&scratch_obstack); -} - -/* handles emitting modifiers such as Constant, read-only, and volatile */ -static void -process_modifiers (parmtype) - tree parmtype; -{ - /* Note that here we do not use CP_TYPE_CONST_P and friends because - we describe types recursively; we will get the `const' in - `const int ()[10]' when processing the `const int' part. */ - if (TYPE_READONLY (parmtype)) - OB_PUTC ('C'); - if (TREE_CODE (parmtype) == INTEGER_TYPE - && (TYPE_MAIN_VARIANT (parmtype) - == unsigned_type (TYPE_MAIN_VARIANT (parmtype))) - && ! TYPE_FOR_JAVA (parmtype)) - OB_PUTC ('U'); - if (TYPE_VOLATILE (parmtype)) - OB_PUTC ('V'); - /* It would be better to use `R' for `restrict', but that's already - used for reference types. And `r' is used for `long double'. */ - if (TYPE_RESTRICT (parmtype)) - OB_PUTC ('u'); -} - -/* Check to see if TYPE has been entered into the Bcode typelist. If - so, return 1 and emit a backreference to TYPE. Otherwise, add TYPE - to the list of back-referenceable types and return 0. */ - -static int -check_btype (type) - tree type; -{ - int x; - - if (btypelist == NULL) - return 0; - - if (!is_back_referenceable_type (type)) - return 0; - - /* We assume that our caller has put out any necessary - qualifiers. */ - type = TYPE_MAIN_VARIANT (type); - - for (x = 0; x < maxbtype; x++) - if (type == btypelist[x]) - { - OB_PUTC ('B'); - icat (x); - if (x > 9) - OB_PUTC ('_'); - return 1 ; - } - - if (maxbsize <= maxbtype) - { - /* Enlarge the table. */ - maxbsize = maxbsize * 3 / 2; - btypelist = (tree *)xrealloc (btypelist, sizeof (tree) * maxbsize); - } - - /* Register the TYPE. */ - btypelist[maxbtype++] = type; - - return 0; -} - -/* handle emitting the correct code for various node types */ -static void -process_overload_item (parmtype, extra_Gcode) - tree parmtype; - int extra_Gcode; -{ - numeric_output_need_bar = 0; - - /* These tree types are considered modifiers for B code squangling , */ - /* and therefore should not get entries in the Btypelist */ - /* they are, however, repeatable types */ - - switch (TREE_CODE (parmtype)) - { - case REFERENCE_TYPE: - OB_PUTC ('R'); - goto more; - - case ARRAY_TYPE: -#if PARM_CAN_BE_ARRAY_TYPE - { - OB_PUTC ('A'); - if (TYPE_DOMAIN (parmtype) == NULL_TREE) - OB_PUTC ('_'); - else - { - tree length = array_type_nelts (parmtype); - if (TREE_CODE (length) != INTEGER_CST || flag_do_squangling) - { - length = fold (build (PLUS_EXPR, TREE_TYPE (length), - length, integer_one_node)); - STRIP_NOPS (length); - } - build_overload_value (sizetype, length, 1); - } - if (numeric_output_need_bar && ! flag_do_squangling) - OB_PUTC ('_'); - goto more; - } -#else - OB_PUTC ('P'); - goto more; -#endif - - case POINTER_TYPE: - OB_PUTC ('P'); - more: - build_mangled_name_for_type (TREE_TYPE (parmtype)); - return; - break; - - default: - break; - } - - if (flag_do_squangling && check_btype (parmtype)) - /* If PARMTYPE is already in the list of back-referenceable types, - then check_btype will output the appropriate reference, and - there's nothing more to do. */ - return; - - switch (TREE_CODE (parmtype)) - { - case OFFSET_TYPE: - OB_PUTC ('O'); - build_mangled_name_for_type (TYPE_OFFSET_BASETYPE (parmtype)); - OB_PUTC ('_'); - build_mangled_name_for_type (TREE_TYPE (parmtype)); - break; - - case FUNCTION_TYPE: - case METHOD_TYPE: - { - tree parms = TYPE_ARG_TYPES (parmtype); - - /* Rather than implementing a reentrant TYPEVEC, we turn off - repeat codes here, unless we're squangling. Squangling - doesn't make use of the TYPEVEC, so there's no reentrancy - problem. */ - int old_nofold = nofold; - if (!flag_do_squangling) - nofold = 1; - - if (TREE_CODE (parmtype) == METHOD_TYPE) - { - /* Mark this as a method. */ - OB_PUTC ('M'); - /* Output the class of which this method is a member. */ - build_mangled_name_for_type (TYPE_METHOD_BASETYPE (parmtype)); - /* Output any qualifiers for the `this' parameter. */ - process_modifiers (TREE_TYPE (TREE_VALUE (parms))); - } - - /* Output the parameter types. */ - OB_PUTC ('F'); - if (parms == NULL_TREE) - OB_PUTC ('e'); - else if (parms == void_list_node) - OB_PUTC ('v'); - else - build_mangled_name (parms, 0, 0); - - /* Output the return type. */ - OB_PUTC ('_'); - build_mangled_name_for_type (TREE_TYPE (parmtype)); - - nofold = old_nofold; - break; - } - - case INTEGER_TYPE: - parmtype = TYPE_MAIN_VARIANT (parmtype); - if (parmtype == integer_type_node - || parmtype == unsigned_type_node - || parmtype == java_int_type_node) - OB_PUTC ('i'); - else if (parmtype == long_integer_type_node - || parmtype == long_unsigned_type_node) - OB_PUTC ('l'); - else if (parmtype == short_integer_type_node - || parmtype == short_unsigned_type_node - || parmtype == java_short_type_node) - OB_PUTC ('s'); - else if (parmtype == signed_char_type_node) - { - OB_PUTC ('S'); - OB_PUTC ('c'); - } - else if (parmtype == char_type_node - || parmtype == unsigned_char_type_node - || parmtype == java_byte_type_node) - OB_PUTC ('c'); - else if (parmtype == wchar_type_node - || parmtype == java_char_type_node) - OB_PUTC ('w'); - else if (parmtype == long_long_integer_type_node - || parmtype == long_long_unsigned_type_node - || parmtype == java_long_type_node) - OB_PUTC ('x'); - else if (parmtype == java_boolean_type_node) - OB_PUTC ('b'); -#if HOST_BITS_PER_WIDE_INT >= 64 - else if (parmtype == intTI_type_node - || parmtype == unsigned_intTI_type_node) - { - /* Should just check a flag here instead of specific - *_type_nodes, because all C9x types could use this. */ - int bits = TREE_INT_CST_LOW (TYPE_SIZE (parmtype)); - build_mangled_C9x_name (bits); - } -#endif - else - my_friendly_abort (73); - break; - - case BOOLEAN_TYPE: - OB_PUTC ('b'); - break; - - case REAL_TYPE: - parmtype = TYPE_MAIN_VARIANT (parmtype); - if (parmtype == long_double_type_node) - OB_PUTC ('r'); - else if (parmtype == double_type_node - || parmtype == java_double_type_node) - OB_PUTC ('d'); - else if (parmtype == float_type_node - || parmtype == java_float_type_node) - OB_PUTC ('f'); - else my_friendly_abort (74); - break; - - case COMPLEX_TYPE: - OB_PUTC ('J'); - build_mangled_name_for_type (TREE_TYPE (parmtype)); - break; - - case VOID_TYPE: - OB_PUTC ('v'); - break; - - case ERROR_MARK: /* not right, but nothing is anyway */ - break; - - /* have to do these */ - case UNION_TYPE: - case RECORD_TYPE: - { - if (extra_Gcode) - OB_PUTC ('G'); /* make it look incompatible with AT&T */ - /* drop through into next case */ - } - case ENUMERAL_TYPE: - { - tree name = TYPE_NAME (parmtype); - - my_friendly_assert (TREE_CODE (name) == TYPE_DECL, 248); - - build_qualified_name (name); - break; - } - - case UNKNOWN_TYPE: - /* This will take some work. */ - OB_PUTC ('?'); - break; - - case TEMPLATE_TEMPLATE_PARM: - /* Find and output the original template parameter - declaration. */ - if (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (parmtype)) - { - build_mangled_template_parm_index ("tzX", - TEMPLATE_TYPE_PARM_INDEX - (parmtype)); - build_template_parm_names - (DECL_INNERMOST_TEMPLATE_PARMS (TYPE_TI_TEMPLATE (parmtype)), - TYPE_TI_ARGS (parmtype)); - } - else - { - build_mangled_template_parm_index ("ZzX", - TEMPLATE_TYPE_PARM_INDEX - (parmtype)); - build_template_template_parm_names - (DECL_INNERMOST_TEMPLATE_PARMS (TYPE_STUB_DECL (parmtype))); - } - break; - - case TEMPLATE_TYPE_PARM: - build_mangled_template_parm_index ("X", - TEMPLATE_TYPE_PARM_INDEX - (parmtype)); - break; - - case TYPENAME_TYPE: - /* When mangling the type of a function template whose - declaration looks like: - - template void foo(typename T::U) - - we have to mangle these. */ - build_qualified_name (parmtype); - break; - - default: - my_friendly_abort (75); - } - -} - -/* Produce the mangling for a variable named NAME in CONTEXT, which can - be either a class TYPE or a FUNCTION_DECL. */ - -tree -build_static_name (context, name) - tree context, name; -{ - OB_INIT (); - numeric_output_need_bar = 0; - start_squangling (); -#ifdef JOINER - OB_PUTC ('_'); - build_qualified_name (context); - OB_PUTC (JOINER); -#else - OB_PUTS ("__static_"); - build_qualified_name (context); - OB_PUTC ('_'); -#endif - OB_PUTID (name); - OB_FINISH (); - end_squangling (); - - return get_identifier ((char *)obstack_base (&scratch_obstack)); -} - -/* FOR_METHOD should be 1 if the declaration in question is for a member - of a class (including a static member) and 2 if the declaration is - for a constructor. */ -tree -build_decl_overload_real (dname, parms, ret_type, tparms, targs, - for_method) - tree dname; - tree parms; - tree ret_type; - tree tparms; - tree targs; - int for_method; -{ - char *name = IDENTIFIER_POINTER (dname); - - /* member operators new and delete look like methods at this point. */ - if (! for_method && parms != NULL_TREE && TREE_CODE (parms) == TREE_LIST - && TREE_CHAIN (parms) == void_list_node) - { - if (dname == ansi_opname[(int) DELETE_EXPR]) - return get_identifier ("__builtin_delete"); - else if (dname == ansi_opname[(int) VEC_DELETE_EXPR]) - return get_identifier ("__builtin_vec_delete"); - if (dname == ansi_opname[(int) NEW_EXPR]) - return get_identifier ("__builtin_new"); - else if (dname == ansi_opname[(int) VEC_NEW_EXPR]) - return get_identifier ("__builtin_vec_new"); - } - - start_squangling (); - OB_INIT (); - if (for_method != 2) - OB_PUTCP (name); - /* Otherwise, we can divine that this is a constructor, - and figure out its name without any extra encoding. */ - - OB_PUTC2 ('_', '_'); - numeric_output_need_bar = 0; - - if (tparms) - { - OB_PUTC ('H'); - build_template_parm_names (tparms, targs); - OB_PUTC ('_'); - } - else if (!for_method && current_namespace == global_namespace) - /* XXX this works only if we call this in the same namespace - as the declaration. Unfortunately, we don't have the _DECL, - only its name */ - OB_PUTC ('F'); - - if (!for_method && current_namespace != global_namespace) - /* qualify with namespace */ - build_qualified_name (current_namespace); - - if (parms == NULL_TREE) - OB_PUTC ('e'); - else if (parms == void_list_node) - OB_PUTC ('v'); - else - { - if (!flag_do_squangling) /* Allocate typevec array. */ - { - maxtype = 0; - typevec_size = list_length (parms); - if (!for_method && current_namespace != global_namespace) - /* the namespace of a global function needs one slot */ - typevec_size++; - typevec = (tree *)alloca (typevec_size * sizeof (tree)); - } - nofold = 0; - - if (for_method) - { - tree this_type = TREE_VALUE (parms); - - if (TREE_CODE (this_type) == RECORD_TYPE) /* a signature pointer */ - this_type = SIGNATURE_TYPE (this_type); - else - this_type = TREE_TYPE (this_type); - - build_mangled_name_for_type (this_type); - - if (!flag_do_squangling) - { - my_friendly_assert (maxtype < typevec_size, 387); - typevec[maxtype++] = this_type; - TREE_USED (this_type) = 1; - - /* By setting up PARMS in this way, the loop below will - automatically clear TREE_USED on THIS_TYPE. */ - parms = temp_tree_cons (NULL_TREE, this_type, - TREE_CHAIN (parms)); - } - - if (TREE_CHAIN (parms)) - build_mangled_name (TREE_CHAIN (parms), 0, 0); - else - OB_PUTC ('e'); - } - else - { - /* the namespace qualifier for a global function - will count as type */ - if (current_namespace != global_namespace - && !flag_do_squangling) - { - my_friendly_assert (maxtype < typevec_size, 387); - typevec[maxtype++] = current_namespace; - } - build_mangled_name (parms, 0, 0); - } - - if (!flag_do_squangling) /* Deallocate typevec array */ - { - tree t = parms; - typevec = NULL; - while (t) - { - tree temp = TREE_VALUE (t); - TREE_USED (temp) = 0; - /* clear out the type variant in case we used it */ - temp = canonical_type_variant (temp); - TREE_USED (temp) = 0; - t = TREE_CHAIN (t); - } - } - } - - if (ret_type != NULL_TREE && for_method != 2) - { - /* Add the return type. */ - OB_PUTC ('_'); - build_mangled_name_for_type (ret_type); - } - - OB_FINISH (); - end_squangling (); - { - tree n = get_identifier (obstack_base (&scratch_obstack)); - if (IDENTIFIER_OPNAME_P (dname)) - IDENTIFIER_OPNAME_P (n) = 1; - return n; - } -} - -/* Change the name of a function definition so that it may be - overloaded. NAME is the name of the function to overload, - PARMS is the parameter list (which determines what name the - final function obtains). - - FOR_METHOD is 1 if this overload is being performed - for a method, rather than a function type. It is 2 if - this overload is being performed for a constructor. */ - -tree -build_decl_overload (dname, parms, for_method) - tree dname; - tree parms; - int for_method; -{ - return build_decl_overload_real (dname, parms, NULL_TREE, NULL_TREE, - NULL_TREE, for_method); -} - -/* Set the mangled name (DECL_ASSEMBLER_NAME) for DECL. */ - -void -set_mangled_name_for_decl (decl) - tree decl; -{ - tree parm_types; - - if (processing_template_decl) - /* There's no need to mangle the name of a template function. */ - return; - - parm_types = TYPE_ARG_TYPES (TREE_TYPE (decl)); - - if (DECL_STATIC_FUNCTION_P (decl)) - parm_types = - hash_tree_chain (build_pointer_type (DECL_CLASS_CONTEXT (decl)), - parm_types); - else - /* The only member functions whose type is a FUNCTION_TYPE, rather - than a METHOD_TYPE, should be static members. */ - my_friendly_assert (!DECL_CONTEXT (decl) - || !IS_AGGR_TYPE_CODE (TREE_CODE (DECL_CONTEXT (decl))) - || TREE_CODE (TREE_TYPE (decl)) != FUNCTION_TYPE, - 0); - - DECL_ASSEMBLER_NAME (decl) - = build_decl_overload (DECL_NAME (decl), parm_types, - DECL_FUNCTION_MEMBER_P (decl) - + DECL_CONSTRUCTOR_P (decl)); -} - -/* Build an overload name for the type expression TYPE. */ - -tree -build_typename_overload (type) - tree type; -{ - tree id; - - OB_INIT (); - OB_PUTID (ansi_opname[(int) TYPE_EXPR]); - nofold = 1; - start_squangling (); - build_mangled_name (type, 0, 1); - id = get_identifier (obstack_base (&scratch_obstack)); - IDENTIFIER_OPNAME_P (id) = 1; -#if 0 - IDENTIFIER_GLOBAL_VALUE (id) = TYPE_MAIN_DECL (type); -#endif - TREE_TYPE (id) = type; - end_squangling (); - return id; -} - -tree -build_overload_with_type (name, type) - tree name, type; -{ - OB_INIT (); - OB_PUTID (name); - nofold = 1; - - start_squangling (); - build_mangled_name (type, 0, 1); - end_squangling (); - return get_identifier (obstack_base (&scratch_obstack)); -} - -tree -get_id_2 (name, name2) - char *name; - tree name2; -{ - OB_INIT (); - OB_PUTCP (name); - OB_PUTID (name2); - OB_FINISH (); - return get_identifier (obstack_base (&scratch_obstack)); -} - -/* Returns a DECL_ASSEMBLER_NAME for the destructor of type TYPE. */ - -tree -build_destructor_name (type) - tree type; -{ - return build_overload_with_type (get_identifier (DESTRUCTOR_DECL_PREFIX), - type); -} - -/* Given a tree_code CODE, and some arguments (at least one), - attempt to use an overloaded operator on the arguments. - - For unary operators, only the first argument need be checked. - For binary operators, both arguments may need to be checked. - - Member functions can convert class references to class pointers, - for one-level deep indirection. More than that is not supported. - Operators [](), ()(), and ->() must be member functions. - - We call function call building calls with LOOKUP_COMPLAIN if they - are our only hope. This is true when we see a vanilla operator - applied to something of aggregate type. If this fails, we are free - to return `error_mark_node', because we will have reported the - error. - - Operators NEW and DELETE overload in funny ways: operator new takes - a single `size' parameter, and operator delete takes a pointer to the - storage being deleted. When overloading these operators, success is - assumed. If there is a failure, report an error message and return - `error_mark_node'. */ - -/* NOSTRICT */ -tree -build_opfncall (code, flags, xarg1, xarg2, arg3) - enum tree_code code; - int flags; - tree xarg1, xarg2, arg3; -{ - return build_new_op (code, flags, xarg1, xarg2, arg3); -} - -/* This function takes an identifier, ID, and attempts to figure out what - it means. There are a number of possible scenarios, presented in increasing - order of hair: - - 1) not in a class's scope - 2) in class's scope, member name of the class's method - 3) in class's scope, but not a member name of the class - 4) in class's scope, member name of a class's variable - - NAME is $1 from the bison rule. It is an IDENTIFIER_NODE. - VALUE is $$ from the bison rule. It is the value returned by lookup_name ($1) - - As a last ditch, try to look up the name as a label and return that - address. - - Values which are declared as being of REFERENCE_TYPE are - automatically dereferenced here (as a hack to make the - compiler faster). */ - -tree -hack_identifier (value, name) - tree value, name; -{ - tree type; - - if (value == error_mark_node) - { - if (current_class_name) - { - tree fields = lookup_fnfields (TYPE_BINFO (current_class_type), name, 1); - if (fields == error_mark_node) - return error_mark_node; - if (fields) - { - tree fndecl; - - fndecl = TREE_VALUE (fields); - my_friendly_assert (TREE_CODE (fndecl) == FUNCTION_DECL, 251); - /* I could not trigger this code. MvL */ - my_friendly_abort (980325); -#ifdef DEAD - if (DECL_CHAIN (fndecl) == NULL_TREE) - { - warning ("methods cannot be converted to function pointers"); - return fndecl; - } - else - { - error ("ambiguous request for method pointer `%s'", - IDENTIFIER_POINTER (name)); - return error_mark_node; - } -#endif - } - } - if (flag_labels_ok && IDENTIFIER_LABEL_VALUE (name)) - { - return IDENTIFIER_LABEL_VALUE (name); - } - return error_mark_node; - } - - type = TREE_TYPE (value); - if (TREE_CODE (value) == FIELD_DECL) - { - if (current_class_ptr == NULL_TREE) - { - if (current_function_decl - && DECL_STATIC_FUNCTION_P (current_function_decl)) - cp_error ("invalid use of member `%D' in static member function", - value); - else - /* We can get here when processing a bad default - argument, like: - struct S { int a; void f(int i = a); } */ - cp_error ("invalid use of member `%D'", value); - - return error_mark_node; - } - TREE_USED (current_class_ptr) = 1; - - /* Mark so that if we are in a constructor, and then find that - this field was initialized by a base initializer, - we can emit an error message. */ - TREE_USED (value) = 1; - value = build_component_ref (current_class_ref, name, NULL_TREE, 1); - } - else if (TREE_CODE (value) == FUNCTION_DECL - && DECL_FUNCTION_MEMBER_P (value)) - { - tree decl; - - if (IS_SIGNATURE (DECL_CLASS_CONTEXT (value))) - return value; - - decl = maybe_dummy_object (DECL_CLASS_CONTEXT (value), 0); - value = build_component_ref (decl, name, NULL_TREE, 1); - } - else if (really_overloaded_fn (value)) - { -#if 0 - tree t = get_first_fn (value); - for (; t; t = DECL_CHAIN (t)) - { - if (TREE_CODE (t) == TEMPLATE_DECL) - continue; - - assemble_external (t); - TREE_USED (t) = 1; - } -#endif - } - else if (TREE_CODE (value) == OVERLOAD) - /* not really overloaded function */ - mark_used (OVL_FUNCTION (value)); - else if (TREE_CODE (value) == TREE_LIST) - { - /* Ambiguous reference to base members, possibly other cases?. */ - tree t = value; - while (t && TREE_CODE (t) == TREE_LIST) - { - mark_used (TREE_VALUE (t)); - t = TREE_CHAIN (t); - } - } - else if (TREE_CODE (value) == NAMESPACE_DECL) - { - cp_error ("use of namespace `%D' as expression", value); - return error_mark_node; - } - else if (DECL_CLASS_TEMPLATE_P (value)) - { - cp_error ("use of class template `%T' as expression", value); - return error_mark_node; - } - else - mark_used (value); - - if (TREE_CODE (value) == VAR_DECL || TREE_CODE (value) == PARM_DECL - || TREE_CODE (value) == RESULT_DECL) - { - tree context = decl_function_context (value); - if (context != NULL_TREE && context != current_function_decl - && ! TREE_STATIC (value)) - { - cp_error ("use of %s from containing function", - (TREE_CODE (value) == VAR_DECL - ? "`auto' variable" : "parameter")); - cp_error_at (" `%#D' declared here", value); - value = error_mark_node; - } - } - - if (TREE_CODE_CLASS (TREE_CODE (value)) == 'd' && DECL_NONLOCAL (value)) - { - if (DECL_LANG_SPECIFIC (value) - && DECL_CLASS_CONTEXT (value) != current_class_type) - { - tree path, access; - register tree context - = (TREE_CODE (value) == FUNCTION_DECL && DECL_VIRTUAL_P (value)) - ? DECL_CLASS_CONTEXT (value) - : DECL_CONTEXT (value); - - get_base_distance (context, current_class_type, 0, &path); - if (path) - { - access = compute_access (path, value); - if (access != access_public_node) - { - if (TREE_CODE (value) == VAR_DECL) - error ("static member `%s' is %s", - IDENTIFIER_POINTER (name), - TREE_PRIVATE (value) ? "private" - : "from a private base class"); - else - error ("enum `%s' is from private base class", - IDENTIFIER_POINTER (name)); - return error_mark_node; - } - } - } - } - else if (TREE_CODE (value) == TREE_LIST && TREE_NONLOCAL_FLAG (value)) - { - error ("request for member `%s' is ambiguous in multiple inheritance lattice", - IDENTIFIER_POINTER (name)); - return error_mark_node; - } - - if (! processing_template_decl) - value = convert_from_reference (value); - return value; -} - - -tree -make_thunk (function, delta) - tree function; - int delta; -{ - tree thunk_id; - tree thunk; - tree func_decl; - - if (TREE_CODE (function) != ADDR_EXPR) - abort (); - func_decl = TREE_OPERAND (function, 0); - if (TREE_CODE (func_decl) != FUNCTION_DECL) - abort (); - - OB_INIT (); - OB_PUTS ("__thunk_"); - if (delta > 0) - { - OB_PUTC ('n'); - icat (delta); - } - else - icat (-delta); - OB_PUTC ('_'); - OB_PUTID (DECL_ASSEMBLER_NAME (func_decl)); - OB_FINISH (); - thunk_id = get_identifier (obstack_base (&scratch_obstack)); - - thunk = IDENTIFIER_GLOBAL_VALUE (thunk_id); - if (thunk && TREE_CODE (thunk) != THUNK_DECL) - { - cp_error ("implementation-reserved name `%D' used", thunk_id); - thunk = NULL_TREE; - SET_IDENTIFIER_GLOBAL_VALUE (thunk_id, thunk); - } - if (thunk == NULL_TREE) - { - thunk = build_decl (FUNCTION_DECL, thunk_id, TREE_TYPE (func_decl)); - TREE_READONLY (thunk) = TREE_READONLY (func_decl); - TREE_THIS_VOLATILE (thunk) = TREE_THIS_VOLATILE (func_decl); - comdat_linkage (thunk); - TREE_SET_CODE (thunk, THUNK_DECL); - DECL_INITIAL (thunk) = function; - THUNK_DELTA (thunk) = delta; - DECL_EXTERNAL (thunk) = 1; - DECL_ARTIFICIAL (thunk) = 1; - /* So that finish_file can write out any thunks that need to be: */ - pushdecl_top_level (thunk); - } - return thunk; -} - -/* Emit the definition of a C++ multiple inheritance vtable thunk. */ - -void -emit_thunk (thunk_fndecl) - tree thunk_fndecl; -{ - tree function = TREE_OPERAND (DECL_INITIAL (thunk_fndecl), 0); - int delta = THUNK_DELTA (thunk_fndecl); - - if (TREE_ASM_WRITTEN (thunk_fndecl)) - return; - - TREE_ASM_WRITTEN (thunk_fndecl) = 1; - - TREE_ADDRESSABLE (function) = 1; - mark_used (function); - - if (current_function_decl) - abort (); - - TREE_SET_CODE (thunk_fndecl, FUNCTION_DECL); - - { -#ifdef ASM_OUTPUT_MI_THUNK - char *fnname; - current_function_decl = thunk_fndecl; - /* Make sure we build up its RTL before we go onto the - temporary obstack. */ - make_function_rtl (thunk_fndecl); - temporary_allocation (); - DECL_RESULT (thunk_fndecl) - = build_decl (RESULT_DECL, 0, integer_type_node); - fnname = XSTR (XEXP (DECL_RTL (thunk_fndecl), 0), 0); - init_function_start (thunk_fndecl, input_filename, lineno); - current_function_is_thunk = 1; - assemble_start_function (thunk_fndecl, fnname); - ASM_OUTPUT_MI_THUNK (asm_out_file, thunk_fndecl, delta, function); - assemble_end_function (thunk_fndecl, fnname); - permanent_allocation (1); - current_function_decl = 0; -#else /* ASM_OUTPUT_MI_THUNK */ - /* If we don't have the necessary macro for efficient thunks, generate a - thunk function that just makes a call to the real function. - Unfortunately, this doesn't work for varargs. */ - - tree a, t; - - if (varargs_function_p (function)) - cp_error ("generic thunk code fails for method `%#D' which uses `...'", - function); - - /* Set up clone argument trees for the thunk. */ - t = NULL_TREE; - for (a = DECL_ARGUMENTS (function); a; a = TREE_CHAIN (a)) - { - tree x = copy_node (a); - TREE_CHAIN (x) = t; - DECL_CONTEXT (x) = thunk_fndecl; - t = x; - } - a = nreverse (t); - DECL_ARGUMENTS (thunk_fndecl) = a; - DECL_RESULT (thunk_fndecl) = NULL_TREE; - DECL_LANG_SPECIFIC (thunk_fndecl) = DECL_LANG_SPECIFIC (function); - copy_lang_decl (thunk_fndecl); - DECL_INTERFACE_KNOWN (thunk_fndecl) = 1; - DECL_NOT_REALLY_EXTERN (thunk_fndecl) = 1; - - start_function (NULL_TREE, thunk_fndecl, NULL_TREE, 1); - store_parm_decls (); - current_function_is_thunk = 1; - - /* Build up the call to the real function. */ - t = build_int_2 (delta, -1 * (delta < 0)); - TREE_TYPE (t) = signed_type (sizetype); - t = fold (build (PLUS_EXPR, TREE_TYPE (a), a, t)); - t = expr_tree_cons (NULL_TREE, t, NULL_TREE); - for (a = TREE_CHAIN (a); a; a = TREE_CHAIN (a)) - t = expr_tree_cons (NULL_TREE, a, t); - t = nreverse (t); - t = build_call (function, TREE_TYPE (TREE_TYPE (function)), t); - c_expand_return (t); - - finish_function (lineno, 0, 0); - - /* Don't let the backend defer this function. */ - if (DECL_DEFER_OUTPUT (thunk_fndecl)) - { - output_inline_function (thunk_fndecl); - permanent_allocation (1); - } -#endif /* ASM_OUTPUT_MI_THUNK */ - } - - TREE_SET_CODE (thunk_fndecl, THUNK_DECL); -} - -/* Code for synthesizing methods which have default semantics defined. */ - -/* For the anonymous union in TYPE, return the member that is at least as - large as the rest of the members, so we can copy it. */ - -static tree -largest_union_member (type) - tree type; -{ - tree f, type_size = TYPE_SIZE (type); - - for (f = TYPE_FIELDS (type); f; f = TREE_CHAIN (f)) - if (simple_cst_equal (DECL_SIZE (f), type_size) == 1) - return f; - - /* We should always find one. */ - my_friendly_abort (323); - return NULL_TREE; -} - -/* Generate code for default X(X&) constructor. */ - -static void -do_build_copy_constructor (fndecl) - tree fndecl; -{ - tree parm = TREE_CHAIN (DECL_ARGUMENTS (fndecl)); - tree t; - - clear_last_expr (); - push_momentary (); - - if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type)) - parm = TREE_CHAIN (parm); - parm = convert_from_reference (parm); - - if (TYPE_HAS_TRIVIAL_INIT_REF (current_class_type) - && is_empty_class (current_class_type)) - /* Don't copy the padding byte; it might not have been allocated - if *this is a base subobject. */; - else if (TYPE_HAS_TRIVIAL_INIT_REF (current_class_type)) - { - t = build (INIT_EXPR, void_type_node, current_class_ref, parm); - TREE_SIDE_EFFECTS (t) = 1; - cplus_expand_expr_stmt (t); - } - else - { - tree fields = TYPE_FIELDS (current_class_type); - int n_bases = CLASSTYPE_N_BASECLASSES (current_class_type); - tree binfos = TYPE_BINFO_BASETYPES (current_class_type); - int i; - - for (t = CLASSTYPE_VBASECLASSES (current_class_type); t; - t = TREE_CHAIN (t)) - { - tree basetype = BINFO_TYPE (t); - tree p = convert_to_reference - (build_reference_type (basetype), parm, - CONV_IMPLICIT|CONV_CONST, LOOKUP_COMPLAIN, NULL_TREE); - p = convert_from_reference (p); - - if (p == error_mark_node) - cp_error ("in default copy constructor"); - else - current_base_init_list = tree_cons (basetype, - p, current_base_init_list); - } - - for (i = 0; i < n_bases; ++i) - { - tree p, basetype = TREE_VEC_ELT (binfos, i); - if (TREE_VIA_VIRTUAL (basetype)) - continue; - - basetype = BINFO_TYPE (basetype); - p = convert_to_reference - (build_reference_type (basetype), parm, - CONV_IMPLICIT|CONV_CONST, LOOKUP_COMPLAIN, NULL_TREE); - - if (p == error_mark_node) - cp_error ("in default copy constructor"); - else - { - p = convert_from_reference (p); - current_base_init_list = tree_cons (basetype, - p, current_base_init_list); - } - } - for (; fields; fields = TREE_CHAIN (fields)) - { - tree init, t; - tree field = fields; - - if (TREE_CODE (field) != FIELD_DECL) - continue; - - init = parm; - if (DECL_NAME (field)) - { - if (VFIELD_NAME_P (DECL_NAME (field))) - continue; - if (VBASE_NAME_P (DECL_NAME (field))) - continue; - - /* True for duplicate members. */ - if (IDENTIFIER_CLASS_VALUE (DECL_NAME (field)) != field) - continue; - } - else if ((t = TREE_TYPE (field)) != NULL_TREE - && ANON_UNION_TYPE_P (t) - && TYPE_FIELDS (t) != NULL_TREE) - { - do - { - init = build (COMPONENT_REF, t, init, field); - field = largest_union_member (t); - } - while ((t = TREE_TYPE (field)) != NULL_TREE - && ANON_UNION_TYPE_P (t) - && TYPE_FIELDS (t) != NULL_TREE); - } - else - continue; - - init = build (COMPONENT_REF, TREE_TYPE (field), init, field); - init = build_tree_list (NULL_TREE, init); - - current_member_init_list - = tree_cons (DECL_NAME (field), init, current_member_init_list); - } - current_member_init_list = nreverse (current_member_init_list); - current_base_init_list = nreverse (current_base_init_list); - setup_vtbl_ptr (); - } - - pop_momentary (); -} - -static void -do_build_assign_ref (fndecl) - tree fndecl; -{ - tree parm = TREE_CHAIN (DECL_ARGUMENTS (fndecl)); - - clear_last_expr (); - push_momentary (); - - parm = convert_from_reference (parm); - - if (TYPE_HAS_TRIVIAL_ASSIGN_REF (current_class_type) - && is_empty_class (current_class_type)) - /* Don't copy the padding byte; it might not have been allocated - if *this is a base subobject. */; - else if (TYPE_HAS_TRIVIAL_ASSIGN_REF (current_class_type)) - { - tree t = build (MODIFY_EXPR, void_type_node, current_class_ref, parm); - TREE_SIDE_EFFECTS (t) = 1; - cplus_expand_expr_stmt (t); - } - else - { - tree fields = TYPE_FIELDS (current_class_type); - int n_bases = CLASSTYPE_N_BASECLASSES (current_class_type); - tree binfos = TYPE_BINFO_BASETYPES (current_class_type); - int i; - - for (i = 0; i < n_bases; ++i) - { - tree basetype = BINFO_TYPE (TREE_VEC_ELT (binfos, i)); - tree p = convert_to_reference - (build_reference_type (basetype), parm, - CONV_IMPLICIT|CONV_CONST, LOOKUP_COMPLAIN, NULL_TREE); - p = convert_from_reference (p); - p = build_member_call (basetype, ansi_opname [MODIFY_EXPR], - build_expr_list (NULL_TREE, p)); - expand_expr_stmt (p); - } - for (; fields; fields = TREE_CHAIN (fields)) - { - tree comp, init, t; - tree field = fields; - - if (TREE_CODE (field) != FIELD_DECL) - continue; - - if (TREE_READONLY (field)) - { - if (DECL_NAME (field)) - cp_error ("non-static const member `%#D', can't use default assignment operator", field); - else - cp_error ("non-static const member in type `%T', can't use default assignment operator", current_class_type); - continue; - } - else if (TREE_CODE (TREE_TYPE (field)) == REFERENCE_TYPE) - { - if (DECL_NAME (field)) - cp_error ("non-static reference member `%#D', can't use default assignment operator", field); - else - cp_error ("non-static reference member in type `%T', can't use default assignment operator", current_class_type); - continue; - } - - comp = current_class_ref; - init = parm; - - if (DECL_NAME (field)) - { - if (VFIELD_NAME_P (DECL_NAME (field))) - continue; - if (VBASE_NAME_P (DECL_NAME (field))) - continue; - - /* True for duplicate members. */ - if (IDENTIFIER_CLASS_VALUE (DECL_NAME (field)) != field) - continue; - } - else if ((t = TREE_TYPE (field)) != NULL_TREE - && ANON_UNION_TYPE_P (t) - && TYPE_FIELDS (t) != NULL_TREE) - { - do - { - comp = build (COMPONENT_REF, t, comp, field); - init = build (COMPONENT_REF, t, init, field); - field = largest_union_member (t); - } - while ((t = TREE_TYPE (field)) != NULL_TREE - && ANON_UNION_TYPE_P (t) - && TYPE_FIELDS (t) != NULL_TREE); - } - else - continue; - - comp = build (COMPONENT_REF, TREE_TYPE (field), comp, field); - init = build (COMPONENT_REF, TREE_TYPE (field), init, field); - - expand_expr_stmt (build_modify_expr (comp, NOP_EXPR, init)); - } - } - c_expand_return (current_class_ref); - pop_momentary (); -} - -void -synthesize_method (fndecl) - tree fndecl; -{ - int nested = (current_function_decl != NULL_TREE); - tree context = hack_decl_function_context (fndecl); - - if (at_eof) - import_export_decl (fndecl); - - if (! context) - push_to_top_level (); - else if (nested) - push_cp_function_context (context); - - interface_unknown = 1; - start_function (NULL_TREE, fndecl, NULL_TREE, 1); - store_parm_decls (); - - if (DECL_NAME (fndecl) == ansi_opname[MODIFY_EXPR]) - do_build_assign_ref (fndecl); - else if (DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (fndecl))) - ; - else - { - tree arg_chain = FUNCTION_ARG_CHAIN (fndecl); - if (DECL_CONSTRUCTOR_FOR_VBASE_P (fndecl)) - arg_chain = TREE_CHAIN (arg_chain); - if (arg_chain != void_list_node) - do_build_copy_constructor (fndecl); - else if (TYPE_NEEDS_CONSTRUCTING (current_class_type)) - setup_vtbl_ptr (); - } - - finish_function (lineno, 0, nested); - - extract_interface_info (); - if (! context) - pop_from_top_level (); - else if (nested) - pop_cp_function_context (context); -} diff --git a/gcc/cp/new.cc b/gcc/cp/new.cc deleted file mode 100755 index df921c3..0000000 --- a/gcc/cp/new.cc +++ /dev/null @@ -1,46 +0,0 @@ -// Implementation file for the -*- C++ -*- dynamic memory management header. -// Copyright (C) 1996, 1997, 1998 Free Software Foundation - -// 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 -// the Free Software Foundation, 59 Temple Place - Suite 330, -// Boston, MA 02111-1307, USA. - -// As a special exception, if you link this library with other files, -// some of which are compiled with GCC, to produce an executable, -// this library does not by itself cause the resulting executable -// to be covered by the GNU General Public License. -// This exception does not however invalidate any other reasons why -// the executable file might be covered by the GNU General Public License. - -#pragma implementation "new" -#include "new" - -/* CYGNUS LOCAL embedded c++ */ -#ifndef __EMBEDDED_CXX__ -const std::nothrow_t std::nothrow = { }; -#endif -/* END CYGNUS LOCAL */ - -using std::new_handler; -new_handler __new_handler; - -new_handler -set_new_handler (new_handler handler) -{ - new_handler prev_handler = __new_handler; - __new_handler = handler; - return prev_handler; -} diff --git a/gcc/cp/new1.cc b/gcc/cp/new1.cc deleted file mode 100755 index c80e69e..0000000 --- a/gcc/cp/new1.cc +++ /dev/null @@ -1,99 +0,0 @@ -// Support routines for the -*- C++ -*- dynamic memory management. -// Copyright (C) 1997, 1998, 1999 Free Software Foundation - -// 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 -// the Free Software Foundation, 59 Temple Place - Suite 330, -// Boston, MA 02111-1307, USA. - -// As a special exception, if you link this library with other files, -// some of which are compiled with GCC, to produce an executable, -// this library does not by itself cause the resulting executable -// to be covered by the GNU General Public License. -// This exception does not however invalidate any other reasons why -// the executable file might be covered by the GNU General Public License. - -#include "new" -using std::new_handler; -using std::bad_alloc; - -extern "C" void *malloc (size_t); -extern new_handler __new_handler; - -#define WEAK(x) \ - x __attribute__ ((weak)); \ - x - -#ifdef L_op_newnt -WEAK (void * operator new (size_t sz, const std::nothrow_t&) __GCC_THROW(__GCC_nothing)) -{ - void *p; - - /* malloc (0) is unpredictable; avoid it. */ - if (sz == 0) - sz = 1; - p = (void *) malloc (sz); - while (p == 0) - { - new_handler handler = __new_handler; - if (! handler) - return 0; -/* CYGNUS LOCAL embedded C++ */ -#ifdef __EMBEDDED_CXX__ - handler (); -#else - try - { - handler (); - } - catch (bad_alloc &) - { - return 0; - } -#endif -/* END CYGNUS LOCAL */ - - p = (void *) malloc (sz); - } - - return p; -} -#endif - -#ifdef L_op_new -WEAK (void * operator new (size_t sz) __GCC_THROW (std::bad_alloc)) -{ - void *p; - - /* malloc (0) is unpredictable; avoid it. */ - if (sz == 0) - sz = 1; - p = (void *) malloc (sz); - while (p == 0) - { - new_handler handler = __new_handler; -/* CYGNUS LOCAL embedded C++ */ -#ifndef __EMBEDDED_CXX__ - if (! handler) - throw bad_alloc (); -#endif -/* END CYGNUS LOCAL */ - handler (); - p = (void *) malloc (sz); - } - - return p; -} -#endif diff --git a/gcc/cp/new2.cc b/gcc/cp/new2.cc deleted file mode 100755 index 82cb169..0000000 --- a/gcc/cp/new2.cc +++ /dev/null @@ -1,80 +0,0 @@ -// Boilerplate support routines for -*- C++ -*- dynamic memory management. -// Copyright (C) 1997, 1998, 1999 Free Software Foundation - -// 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 -// the Free Software Foundation, 59 Temple Place - Suite 330, -// Boston, MA 02111-1307, USA. - -// As a special exception, if you link this library with other files, -// some of which are compiled with GCC, to produce an executable, -// this library does not by itself cause the resulting executable -// to be covered by the GNU General Public License. -// This exception does not however invalidate any other reasons why -// the executable file might be covered by the GNU General Public License. - -#include "new" - -extern "C" void free (void *); - -#define WEAK(x) \ - x __attribute__ ((weak)); \ - x - -#ifdef L_op_vnew -WEAK(void * operator new[] (size_t sz) __GCC_THROW (std::bad_alloc)) -{ - return ::operator new(sz); -} -#endif - -#ifdef L_op_vnewnt -WEAK(void *operator new[] (size_t sz, const std::nothrow_t& nothrow) __GCC_THROW(__GCC_nothing)) -{ - return ::operator new(sz, nothrow); -} -#endif - -#ifdef L_op_delete -WEAK (void operator delete (void *ptr) __GCC_THROW (__GCC_nothing)) -{ - if (ptr) - free (ptr); -} -#endif - -#ifdef L_op_vdel -WEAK (void operator delete[] (void *ptr) __GCC_THROW (__GCC_nothing)) -{ - if (ptr) - free (ptr); -} -#endif - -#ifdef L_op_delnt -WEAK (void operator delete (void *ptr, const std::nothrow_t&) __GCC_THROW (__GCC_nothing)) -{ - if (ptr) - free (ptr); -} -#endif - -#ifdef L_op_vdelnt -WEAK (void operator delete[] (void *ptr, const std::nothrow_t&) __GCC_THROW (__GCC_nothing)) -{ - if (ptr) - free (ptr); -} -#endif diff --git a/gcc/cp/parse.c b/gcc/cp/parse.c deleted file mode 100644 index a7424d7..0000000 --- a/gcc/cp/parse.c +++ /dev/null @@ -1,9814 +0,0 @@ -/* A Bison parser, made by GNU Bison 2.3. */ - -/* Skeleton implementation for Bison's Yacc-like parsers in C - - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. - - This program 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. - - This program 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 this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -/* C LALR(1) parser skeleton written by Richard Stallman, by - simplifying the original so-called "semantic" parser. */ - -/* All symbols defined below should begin with yy or YY, to avoid - infringing on user name space. This should be done even for local - variables, as they might otherwise be expanded by user macros. - There are some unavoidable exceptions within include files to - define necessary library symbols; they are noted "INFRINGES ON - USER NAME SPACE" below. */ - -/* Identify Bison output. */ -#define YYBISON 1 - -/* Bison version. */ -#define YYBISON_VERSION "2.3" - -/* Skeleton name. */ -#define YYSKELETON_NAME "yacc.c" - -/* Pure parsers. */ -#define YYPURE 0 - -/* Using locations. */ -#define YYLSP_NEEDED 0 - - - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - IDENTIFIER = 258, - TYPENAME = 259, - SELFNAME = 260, - PFUNCNAME = 261, - SCSPEC = 262, - TYPESPEC = 263, - CV_QUALIFIER = 264, - CONSTANT = 265, - STRING = 266, - ELLIPSIS = 267, - SIZEOF = 268, - ENUM = 269, - IF = 270, - ELSE = 271, - WHILE = 272, - DO = 273, - FOR = 274, - SWITCH = 275, - CASE = 276, - DEFAULT = 277, - BREAK = 278, - CONTINUE = 279, - RETURN = 280, - GOTO = 281, - ASM_KEYWORD = 282, - TYPEOF = 283, - ALIGNOF = 284, - SIGOF = 285, - ATTRIBUTE = 286, - EXTENSION = 287, - LABEL = 288, - REALPART = 289, - IMAGPART = 290, - AGGR = 291, - VISSPEC = 292, - DELETE = 293, - NEW = 294, - THIS = 295, - OPERATOR = 296, - CXX_TRUE = 297, - CXX_FALSE = 298, - NAMESPACE = 299, - TYPENAME_KEYWORD = 300, - USING = 301, - LEFT_RIGHT = 302, - TEMPLATE = 303, - TYPEID = 304, - DYNAMIC_CAST = 305, - STATIC_CAST = 306, - REINTERPRET_CAST = 307, - CONST_CAST = 308, - SCOPE = 309, - EMPTY = 310, - NSNAME = 311, - PTYPENAME = 312, - THROW = 313, - ASSIGN = 314, - OROR = 315, - ANDAND = 316, - MIN_MAX = 317, - EQCOMPARE = 318, - ARITHCOMPARE = 319, - RSHIFT = 320, - LSHIFT = 321, - DOT_STAR = 322, - POINTSAT_STAR = 323, - MINUSMINUS = 324, - PLUSPLUS = 325, - UNARY = 326, - HYPERUNARY = 327, - PAREN_STAR_PAREN = 328, - POINTSAT = 329, - CATCH = 330, - TRY = 331, - PRE_PARSED_FUNCTION_DECL = 332, - EXTERN_LANG_STRING = 333, - ALL = 334, - PRE_PARSED_CLASS_DECL = 335, - DEFARG = 336, - DEFARG_MARKER = 337, - TYPENAME_DEFN = 338, - IDENTIFIER_DEFN = 339, - PTYPENAME_DEFN = 340, - END_OF_LINE = 341, - END_OF_SAVED_INPUT = 342 - }; -#endif -/* Tokens. */ -#define IDENTIFIER 258 -#define TYPENAME 259 -#define SELFNAME 260 -#define PFUNCNAME 261 -#define SCSPEC 262 -#define TYPESPEC 263 -#define CV_QUALIFIER 264 -#define CONSTANT 265 -#define STRING 266 -#define ELLIPSIS 267 -#define SIZEOF 268 -#define ENUM 269 -#define IF 270 -#define ELSE 271 -#define WHILE 272 -#define DO 273 -#define FOR 274 -#define SWITCH 275 -#define CASE 276 -#define DEFAULT 277 -#define BREAK 278 -#define CONTINUE 279 -#define RETURN 280 -#define GOTO 281 -#define ASM_KEYWORD 282 -#define TYPEOF 283 -#define ALIGNOF 284 -#define SIGOF 285 -#define ATTRIBUTE 286 -#define EXTENSION 287 -#define LABEL 288 -#define REALPART 289 -#define IMAGPART 290 -#define AGGR 291 -#define VISSPEC 292 -#define DELETE 293 -#define NEW 294 -#define THIS 295 -#define OPERATOR 296 -#define CXX_TRUE 297 -#define CXX_FALSE 298 -#define NAMESPACE 299 -#define TYPENAME_KEYWORD 300 -#define USING 301 -#define LEFT_RIGHT 302 -#define TEMPLATE 303 -#define TYPEID 304 -#define DYNAMIC_CAST 305 -#define STATIC_CAST 306 -#define REINTERPRET_CAST 307 -#define CONST_CAST 308 -#define SCOPE 309 -#define EMPTY 310 -#define NSNAME 311 -#define PTYPENAME 312 -#define THROW 313 -#define ASSIGN 314 -#define OROR 315 -#define ANDAND 316 -#define MIN_MAX 317 -#define EQCOMPARE 318 -#define ARITHCOMPARE 319 -#define RSHIFT 320 -#define LSHIFT 321 -#define DOT_STAR 322 -#define POINTSAT_STAR 323 -#define MINUSMINUS 324 -#define PLUSPLUS 325 -#define UNARY 326 -#define HYPERUNARY 327 -#define PAREN_STAR_PAREN 328 -#define POINTSAT 329 -#define CATCH 330 -#define TRY 331 -#define PRE_PARSED_FUNCTION_DECL 332 -#define EXTERN_LANG_STRING 333 -#define ALL 334 -#define PRE_PARSED_CLASS_DECL 335 -#define DEFARG 336 -#define DEFARG_MARKER 337 -#define TYPENAME_DEFN 338 -#define IDENTIFIER_DEFN 339 -#define PTYPENAME_DEFN 340 -#define END_OF_LINE 341 -#define END_OF_SAVED_INPUT 342 - - - - -/* Copy the first part of user declarations. */ -#line 29 "../../../gbagnu/gcc/cp/parse.y" - -/* Cause the `yydebug' variable to be defined. */ -#define YYDEBUG 1 - -#include "config.h" - -#include "system.h" - -#include "tree.h" -#include "input.h" -#include "flags.h" -#include "lex.h" -#include "cp-tree.h" -#include "output.h" -#include "except.h" -#include "toplev.h" - -/* Since parsers are distinct for each language, put the language string - definition here. (fnf) */ -char *language_string = "GNU C++"; - -extern tree void_list_node; -extern struct obstack permanent_obstack; - -extern int end_of_file; - -/* Like YYERROR but do call yyerror. */ -#define YYERROR1 { yyerror ("syntax error"); YYERROR; } - -#define OP0(NODE) (TREE_OPERAND (NODE, 0)) -#define OP1(NODE) (TREE_OPERAND (NODE, 1)) - -/* Contains the statement keyword (if/while/do) to include in an - error message if the user supplies an empty conditional expression. */ -static char *cond_stmt_keyword; - -static tree empty_parms PROTO((void)); - -/* Nonzero if we have an `extern "C"' acting as an extern specifier. */ -int have_extern_spec; -int used_extern_spec; - -/* Cons up an empty parameter list. */ -#ifdef __GNUC__ -__inline -#endif -static tree -empty_parms () -{ - tree parms; - - if (strict_prototype - || current_class_type != NULL) - parms = void_list_node; - else - parms = NULL_TREE; - return parms; -} - - - -/* Enabling traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 0 -#endif - -/* Enabling the token table. */ -#ifndef YYTOKEN_TABLE -# define YYTOKEN_TABLE 0 -#endif - -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE -#line 92 "../../../gbagnu/gcc/cp/parse.y" -{long itype; tree ttype; char *strtype; enum tree_code code; flagged_type_tree ftype; } -/* Line 187 of yacc.c. */ -#line 333 "parse.c" - YYSTYPE; -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -# define YYSTYPE_IS_TRIVIAL 1 -#endif - - - -/* Copy the second part of user declarations. */ -#line 284 "../../../gbagnu/gcc/cp/parse.y" - -/* List of types and structure classes of the current declaration. */ -static tree current_declspecs; - -/* List of prefix attributes in effect. - Prefix attributes are parsed by the reserved_declspecs and declmods - rules. They create a list that contains *both* declspecs and attrs. */ -/* ??? It is not clear yet that all cases where an attribute can now appear in - a declspec list have been updated. */ -static tree prefix_attributes; - -/* When defining an aggregate, this is the kind of the most recent one - being defined. (For example, this might be class_type_node.) */ -static tree current_aggr; - -/* When defining an enumeration, this is the type of the enumeration. */ -static tree current_enum_type; - -/* Tell yyparse how to print a token's value, if yydebug is set. */ - -#define YYPRINT(FILE,YYCHAR,YYLVAL) yyprint(FILE,YYCHAR,YYLVAL) -extern void yyprint PROTO((FILE *, int, YYSTYPE)); -extern tree combine_strings PROTO((tree)); - -static int -parse_decl(declarator, specs_attrs, attributes, initialized, decl) - tree declarator; - tree specs_attrs; - tree attributes; - int initialized; - tree* decl; -{ - int sm; - - split_specs_attrs (specs_attrs, ¤t_declspecs, &prefix_attributes); - if (current_declspecs - && TREE_CODE (current_declspecs) != TREE_LIST) - current_declspecs = get_decl_list (current_declspecs); - if (have_extern_spec && !used_extern_spec) - { - current_declspecs = decl_tree_cons (NULL_TREE, - get_identifier ("extern"), - current_declspecs); - used_extern_spec = 1; - } - sm = suspend_momentary (); - *decl = start_decl (declarator, current_declspecs, initialized, - attributes, prefix_attributes); - return sm; -} - - -/* Line 216 of yacc.c. */ -#line 397 "parse.c" - -#ifdef short -# undef short -#endif - -#ifdef YYTYPE_UINT8 -typedef YYTYPE_UINT8 yytype_uint8; -#else -typedef unsigned char yytype_uint8; -#endif - -#ifdef YYTYPE_INT8 -typedef YYTYPE_INT8 yytype_int8; -#elif (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -typedef signed char yytype_int8; -#else -typedef short int yytype_int8; -#endif - -#ifdef YYTYPE_UINT16 -typedef YYTYPE_UINT16 yytype_uint16; -#else -typedef unsigned short int yytype_uint16; -#endif - -#ifdef YYTYPE_INT16 -typedef YYTYPE_INT16 yytype_int16; -#else -typedef short int yytype_int16; -#endif - -#ifndef YYSIZE_T -# ifdef __SIZE_TYPE__ -# define YYSIZE_T __SIZE_TYPE__ -# elif defined size_t -# define YYSIZE_T size_t -# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# else -# define YYSIZE_T unsigned int -# endif -#endif - -#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) - -#ifndef YY_ -# if YYENABLE_NLS -# if ENABLE_NLS -# include /* INFRINGES ON USER NAME SPACE */ -# define YY_(msgid) dgettext ("bison-runtime", msgid) -# endif -# endif -# ifndef YY_ -# define YY_(msgid) msgid -# endif -#endif - -/* Suppress unused-variable warnings by "using" E. */ -#if ! defined lint || defined __GNUC__ -# define YYUSE(e) ((void) (e)) -#else -# define YYUSE(e) /* empty */ -#endif - -/* Identity function, used to suppress warnings about constant conditions. */ -#ifndef lint -# define YYID(n) (n) -#else -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static int -YYID (int i) -#else -static int -YYID (i) - int i; -#endif -{ - return i; -} -#endif - -#if ! defined yyoverflow || YYERROR_VERBOSE - -/* The parser invokes alloca or malloc; define the necessary symbols. */ - -# ifdef YYSTACK_USE_ALLOCA -# if YYSTACK_USE_ALLOCA -# ifdef __GNUC__ -# define YYSTACK_ALLOC __builtin_alloca -# elif defined __BUILTIN_VA_ARG_INCR -# include /* INFRINGES ON USER NAME SPACE */ -# elif defined _AIX -# define YYSTACK_ALLOC __alloca -# elif defined _MSC_VER -# include /* INFRINGES ON USER NAME SPACE */ -# define alloca _alloca -# else -# define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 -# endif -# endif -# endif -# endif -# endif - -# ifdef YYSTACK_ALLOC - /* Pacify GCC's `empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) -# ifndef YYSTACK_ALLOC_MAXIMUM - /* The OS might guarantee only one guard page at the bottom of the stack, - and a page size can be as small as 4096 bytes. So we cannot safely - invoke alloca (N) if N exceeds 4096. Use a slightly smaller number - to allow for a few compiler-allocated temporary stack slots. */ -# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ -# endif -# else -# define YYSTACK_ALLOC YYMALLOC -# define YYSTACK_FREE YYFREE -# ifndef YYSTACK_ALLOC_MAXIMUM -# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM -# endif -# if (defined __cplusplus && ! defined _STDLIB_H \ - && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 -# endif -# endif -# ifndef YYMALLOC -# define YYMALLOC malloc -# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# ifndef YYFREE -# define YYFREE free -# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -void free (void *); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# endif -#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ - - -#if (! defined yyoverflow \ - && (! defined __cplusplus \ - || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) - -/* A type that is properly aligned for any stack member. */ -union yyalloc -{ - yytype_int16 yyss; - YYSTYPE yyvs; - }; - -/* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) - -/* The size of an array large to enough to hold all stacks, each with - N elements. */ -# define YYSTACK_BYTES(N) \ - ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ - + YYSTACK_GAP_MAXIMUM) - -/* Copy COUNT objects from FROM to TO. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(To, From, Count) \ - __builtin_memcpy (To, From, (Count) * sizeof (*(From))) -# else -# define YYCOPY(To, From, Count) \ - do \ - { \ - YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (To)[yyi] = (From)[yyi]; \ - } \ - while (YYID (0)) -# endif -# endif - -/* Relocate STACK from its old location to the new one. The - local variables YYSIZE and YYSTACKSIZE give the old and new number of - elements in the stack, and YYPTR gives the new location of the - stack. Advance YYPTR to a properly aligned location for the next - stack. */ -# define YYSTACK_RELOCATE(Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack, Stack, yysize); \ - Stack = &yyptr->Stack; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (YYID (0)) - -#endif - -/* YYFINAL -- State number of the termination state. */ -#define YYFINAL 4 -/* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 11289 - -/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 112 -/* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 289 -/* YYNRULES -- Number of rules. */ -#define YYNRULES 879 -/* YYNRULES -- Number of states. */ -#define YYNSTATES 1630 - -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ -#define YYUNDEFTOK 2 -#define YYMAXUTOK 342 - -#define YYTRANSLATE(YYX) \ - ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) - -/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ -static const yytype_uint8 yytranslate[] = -{ - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 110, 2, 2, 2, 82, 70, 2, - 92, 108, 80, 78, 59, 79, 91, 81, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 62, 60, - 73, 63, 74, 65, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 93, 2, 111, 69, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 58, 68, 109, 85, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 61, 64, 66, 67, 71, 72, 75, - 76, 77, 83, 84, 86, 87, 88, 89, 90, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107 -}; - -#if YYDEBUG -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ -static const yytype_uint16 yyprhs[] = -{ - 0, 0, 3, 4, 6, 7, 10, 13, 15, 16, - 17, 18, 20, 22, 23, 26, 29, 31, 33, 39, - 44, 50, 55, 56, 63, 64, 70, 72, 75, 77, - 80, 81, 88, 91, 95, 99, 103, 107, 112, 113, - 119, 122, 126, 128, 130, 133, 136, 138, 141, 142, - 148, 152, 154, 158, 160, 161, 164, 167, 171, 173, - 177, 179, 183, 185, 189, 192, 195, 198, 200, 202, - 208, 213, 216, 219, 223, 227, 230, 233, 237, 241, - 244, 247, 250, 253, 256, 258, 260, 262, 263, 265, - 268, 269, 271, 276, 280, 284, 285, 294, 300, 301, - 311, 318, 319, 328, 334, 335, 345, 352, 355, 358, - 360, 363, 365, 372, 377, 384, 389, 392, 394, 397, - 400, 402, 405, 407, 410, 413, 418, 421, 425, 426, - 427, 429, 433, 436, 440, 442, 447, 450, 455, 458, - 463, 466, 468, 470, 472, 474, 476, 478, 480, 482, - 484, 486, 488, 489, 496, 497, 504, 505, 511, 512, - 518, 519, 527, 528, 536, 537, 544, 545, 552, 553, - 554, 560, 566, 568, 570, 576, 582, 583, 585, 587, - 588, 590, 592, 596, 598, 600, 602, 604, 606, 608, - 610, 612, 614, 616, 618, 622, 624, 628, 629, 631, - 633, 634, 642, 644, 646, 650, 655, 659, 660, 664, - 666, 670, 674, 678, 682, 684, 686, 688, 691, 694, - 697, 700, 703, 706, 709, 714, 717, 722, 725, 729, - 733, 738, 744, 751, 758, 766, 769, 774, 780, 783, - 786, 788, 789, 794, 799, 803, 805, 809, 812, 816, - 821, 823, 826, 832, 834, 838, 842, 846, 850, 854, - 858, 862, 866, 870, 874, 878, 882, 886, 890, 894, - 898, 902, 906, 910, 916, 920, 924, 926, 929, 933, - 937, 939, 941, 943, 945, 947, 948, 954, 960, 966, - 972, 978, 980, 982, 984, 986, 989, 991, 994, 997, - 1001, 1006, 1011, 1013, 1015, 1017, 1021, 1023, 1025, 1027, - 1029, 1033, 1037, 1041, 1042, 1047, 1052, 1055, 1060, 1063, - 1068, 1071, 1074, 1076, 1081, 1083, 1091, 1099, 1107, 1115, - 1120, 1125, 1128, 1131, 1134, 1136, 1141, 1144, 1147, 1153, - 1157, 1160, 1163, 1169, 1173, 1179, 1183, 1188, 1195, 1198, - 1200, 1203, 1205, 1208, 1210, 1212, 1214, 1217, 1218, 1221, - 1224, 1228, 1232, 1236, 1239, 1242, 1245, 1247, 1249, 1251, - 1254, 1257, 1260, 1263, 1265, 1267, 1269, 1271, 1274, 1277, - 1281, 1285, 1289, 1294, 1296, 1299, 1302, 1305, 1307, 1309, - 1311, 1314, 1317, 1320, 1322, 1324, 1327, 1330, 1334, 1336, - 1339, 1341, 1343, 1345, 1350, 1355, 1360, 1365, 1367, 1369, - 1371, 1373, 1377, 1379, 1383, 1385, 1389, 1390, 1395, 1396, - 1403, 1407, 1408, 1413, 1415, 1419, 1423, 1424, 1429, 1433, - 1434, 1436, 1438, 1441, 1448, 1450, 1454, 1455, 1457, 1462, - 1469, 1474, 1476, 1478, 1480, 1482, 1484, 1488, 1489, 1492, - 1494, 1497, 1501, 1506, 1508, 1510, 1514, 1519, 1523, 1529, - 1531, 1536, 1540, 1544, 1545, 1549, 1553, 1557, 1558, 1561, - 1564, 1565, 1573, 1578, 1579, 1586, 1590, 1593, 1596, 1599, - 1600, 1601, 1611, 1613, 1614, 1616, 1617, 1619, 1621, 1624, - 1627, 1630, 1633, 1636, 1639, 1642, 1645, 1648, 1652, 1657, - 1661, 1664, 1668, 1670, 1671, 1675, 1676, 1680, 1683, 1685, - 1687, 1688, 1691, 1695, 1697, 1702, 1704, 1708, 1710, 1712, - 1717, 1722, 1725, 1728, 1732, 1736, 1738, 1739, 1741, 1744, - 1748, 1751, 1754, 1756, 1759, 1762, 1765, 1768, 1771, 1774, - 1777, 1779, 1782, 1785, 1789, 1792, 1795, 1800, 1805, 1808, - 1810, 1816, 1821, 1823, 1824, 1826, 1830, 1831, 1833, 1837, - 1839, 1841, 1843, 1845, 1850, 1855, 1860, 1865, 1870, 1874, - 1879, 1884, 1889, 1894, 1898, 1900, 1904, 1906, 1910, 1913, - 1915, 1923, 1924, 1927, 1929, 1932, 1933, 1936, 1941, 1946, - 1949, 1954, 1958, 1962, 1965, 1968, 1972, 1974, 1976, 1979, - 1981, 1983, 1986, 1989, 1994, 1999, 2003, 2007, 2010, 2012, - 2014, 2017, 2021, 2025, 2028, 2031, 2035, 2037, 2041, 2045, - 2048, 2051, 2055, 2057, 2062, 2066, 2071, 2075, 2077, 2080, - 2083, 2086, 2089, 2092, 2094, 2097, 2102, 2107, 2110, 2112, - 2114, 2116, 2118, 2121, 2126, 2129, 2132, 2135, 2138, 2140, - 2143, 2146, 2149, 2152, 2156, 2158, 2161, 2165, 2170, 2173, - 2176, 2179, 2182, 2185, 2188, 2193, 2196, 2198, 2201, 2204, - 2208, 2210, 2214, 2217, 2221, 2224, 2227, 2231, 2233, 2237, - 2242, 2246, 2249, 2252, 2254, 2258, 2261, 2264, 2266, 2269, - 2273, 2275, 2279, 2281, 2288, 2293, 2298, 2302, 2308, 2312, - 2316, 2320, 2323, 2325, 2327, 2330, 2333, 2336, 2337, 2339, - 2341, 2344, 2348, 2350, 2353, 2354, 2358, 2359, 2360, 2366, - 2368, 2369, 2372, 2374, 2376, 2378, 2381, 2382, 2387, 2389, - 2390, 2391, 2397, 2398, 2399, 2407, 2408, 2409, 2410, 2411, - 2424, 2425, 2426, 2434, 2435, 2441, 2442, 2450, 2451, 2456, - 2459, 2462, 2465, 2469, 2476, 2485, 2496, 2509, 2514, 2518, - 2521, 2524, 2526, 2528, 2530, 2532, 2534, 2535, 2536, 2543, - 2544, 2545, 2551, 2553, 2556, 2557, 2558, 2564, 2566, 2568, - 2572, 2576, 2579, 2582, 2585, 2588, 2591, 2593, 2596, 2597, - 2599, 2600, 2602, 2604, 2605, 2607, 2609, 2613, 2618, 2620, - 2624, 2625, 2627, 2629, 2631, 2634, 2637, 2640, 2642, 2645, - 2648, 2649, 2653, 2655, 2657, 2659, 2662, 2665, 2668, 2673, - 2676, 2679, 2682, 2685, 2688, 2691, 2693, 2696, 2698, 2701, - 2703, 2705, 2706, 2707, 2709, 2710, 2715, 2718, 2720, 2722, - 2726, 2727, 2731, 2735, 2739, 2741, 2744, 2747, 2750, 2753, - 2756, 2759, 2762, 2765, 2768, 2771, 2774, 2777, 2780, 2783, - 2786, 2789, 2792, 2795, 2798, 2801, 2804, 2807, 2810, 2814, - 2817, 2820, 2823, 2826, 2830, 2833, 2836, 2841, 2846, 2850 -}; - -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const yytype_int16 yyrhs[] = -{ - 113, 0, -1, -1, 114, -1, -1, 115, 121, -1, - 114, 121, -1, 114, -1, -1, -1, -1, 32, -1, - 27, -1, -1, 122, 123, -1, 149, 148, -1, 145, - -1, 142, -1, 120, 92, 220, 108, 60, -1, 134, - 58, 116, 109, -1, 134, 117, 149, 118, 148, -1, - 134, 117, 145, 118, -1, -1, 44, 164, 58, 124, - 116, 109, -1, -1, 44, 58, 125, 116, 109, -1, - 126, -1, 128, 60, -1, 130, -1, 119, 123, -1, - -1, 44, 164, 63, 127, 133, 60, -1, 46, 315, - -1, 46, 329, 315, -1, 46, 329, 210, -1, 46, - 132, 164, -1, 46, 329, 164, -1, 46, 329, 132, - 164, -1, -1, 46, 44, 131, 133, 60, -1, 56, - 54, -1, 132, 56, 54, -1, 210, -1, 315, -1, - 329, 315, -1, 329, 210, -1, 98, -1, 134, 98, - -1, -1, 48, 73, 136, 137, 74, -1, 48, 73, - 74, -1, 141, -1, 137, 59, 141, -1, 164, -1, - -1, 269, 138, -1, 45, 138, -1, 135, 269, 138, - -1, 139, -1, 139, 63, 226, -1, 392, -1, 392, - 63, 205, -1, 140, -1, 140, 63, 185, -1, 135, - 143, -1, 135, 1, -1, 149, 148, -1, 144, -1, - 142, -1, 134, 117, 149, 118, 148, -1, 134, 117, - 144, 118, -1, 119, 143, -1, 237, 60, -1, 230, - 236, 60, -1, 227, 235, 60, -1, 262, 60, -1, - 237, 60, -1, 230, 236, 60, -1, 227, 235, 60, - -1, 230, 60, -1, 167, 60, -1, 227, 60, -1, - 1, 60, -1, 1, 109, -1, 60, -1, 221, -1, - 160, -1, -1, 159, -1, 159, 60, -1, -1, 107, - -1, 155, 147, 146, 339, -1, 155, 147, 363, -1, - 155, 147, 1, -1, -1, 320, 5, 92, 151, 383, - 108, 301, 395, -1, 320, 5, 47, 301, 395, -1, - -1, 329, 320, 5, 92, 152, 383, 108, 301, 395, - -1, 329, 320, 5, 47, 301, 395, -1, -1, 320, - 180, 92, 153, 383, 108, 301, 395, -1, 320, 180, - 47, 301, 395, -1, -1, 329, 320, 180, 92, 154, - 383, 108, 301, 395, -1, 329, 320, 180, 47, 301, - 395, -1, 227, 224, -1, 230, 312, -1, 312, -1, - 230, 150, -1, 150, -1, 5, 92, 383, 108, 301, - 395, -1, 5, 47, 301, 395, -1, 180, 92, 383, - 108, 301, 395, -1, 180, 47, 301, 395, -1, 230, - 156, -1, 156, -1, 227, 224, -1, 230, 312, -1, - 312, -1, 230, 150, -1, 150, -1, 25, 3, -1, - 158, 254, -1, 158, 92, 197, 108, -1, 158, 47, - -1, 62, 161, 162, -1, -1, -1, 163, -1, 162, - 59, 163, -1, 162, 1, -1, 92, 197, 108, -1, - 47, -1, 165, 92, 197, 108, -1, 165, 47, -1, - 307, 92, 197, 108, -1, 307, 47, -1, 322, 92, - 197, 108, -1, 322, 47, -1, 3, -1, 4, -1, - 5, -1, 57, -1, 56, -1, 3, -1, 57, -1, - 56, -1, 104, -1, 103, -1, 105, -1, -1, 48, - 176, 233, 60, 168, 177, -1, -1, 48, 176, 227, - 224, 169, 177, -1, -1, 48, 176, 312, 170, 177, - -1, -1, 48, 176, 150, 171, 177, -1, -1, 7, - 48, 176, 233, 60, 172, 177, -1, -1, 7, 48, - 176, 227, 224, 173, 177, -1, -1, 7, 48, 176, - 312, 174, 177, -1, -1, 7, 48, 176, 150, 175, - 177, -1, -1, -1, 57, 73, 183, 182, 181, -1, - 4, 73, 183, 182, 181, -1, 180, -1, 178, -1, - 164, 73, 183, 74, 181, -1, 5, 73, 183, 182, - 181, -1, -1, 74, -1, 76, -1, -1, 184, -1, - 185, -1, 184, 59, 185, -1, 226, -1, 57, -1, - 205, -1, 79, -1, 78, -1, 87, -1, 86, -1, - 110, -1, 196, -1, 205, -1, 47, -1, 92, 187, - 108, -1, 47, -1, 92, 191, 108, -1, -1, 191, - -1, 1, -1, -1, 373, 224, 238, 247, 63, 192, - 255, -1, 187, -1, 109, -1, 336, 334, 109, -1, - 336, 334, 1, 109, -1, 336, 1, 109, -1, -1, - 58, 195, 193, -1, 348, -1, 205, 59, 205, -1, - 205, 59, 1, -1, 196, 59, 205, -1, 196, 59, - 1, -1, 205, -1, 196, -1, 215, -1, 119, 204, - -1, 80, 204, -1, 70, 204, -1, 85, 204, -1, - 186, 204, -1, 67, 164, -1, 13, 198, -1, 13, - 92, 226, 108, -1, 29, 198, -1, 29, 92, 226, - 108, -1, 217, 300, -1, 217, 300, 202, -1, 217, - 201, 300, -1, 217, 201, 300, 202, -1, 217, 92, - 200, 226, 199, -1, 217, 92, 200, 226, 199, 202, - -1, 217, 201, 92, 200, 226, 199, -1, 217, 201, - 92, 200, 226, 199, 202, -1, 218, 204, -1, 218, - 93, 111, 204, -1, 218, 93, 187, 111, 204, -1, - 34, 204, -1, 35, 204, -1, 108, -1, -1, 92, - 200, 197, 108, -1, 58, 200, 197, 109, -1, 92, - 197, 108, -1, 47, -1, 92, 233, 108, -1, 63, - 255, -1, 92, 226, 108, -1, 203, 92, 226, 108, - -1, 198, -1, 203, 198, -1, 203, 58, 256, 267, - 109, -1, 204, -1, 205, 84, 205, -1, 205, 83, - 205, -1, 205, 78, 205, -1, 205, 79, 205, -1, - 205, 80, 205, -1, 205, 81, 205, -1, 205, 82, - 205, -1, 205, 77, 205, -1, 205, 76, 205, -1, - 205, 75, 205, -1, 205, 73, 205, -1, 205, 74, - 205, -1, 205, 72, 205, -1, 205, 71, 205, -1, - 205, 70, 205, -1, 205, 68, 205, -1, 205, 69, - 205, -1, 205, 67, 205, -1, 205, 66, 205, -1, - 205, 65, 378, 62, 205, -1, 205, 63, 205, -1, - 205, 64, 205, -1, 61, -1, 61, 205, -1, 85, - 393, 164, -1, 85, 393, 178, -1, 208, -1, 400, - -1, 3, -1, 57, -1, 56, -1, -1, 6, 73, - 207, 183, 182, -1, 400, 73, 207, 183, 182, -1, - 48, 164, 73, 183, 182, -1, 48, 6, 73, 183, - 182, -1, 48, 400, 73, 183, 182, -1, 206, -1, - 4, -1, 5, -1, 212, -1, 248, 212, -1, 206, - -1, 80, 211, -1, 70, 211, -1, 92, 211, 108, - -1, 3, 73, 183, 182, -1, 56, 73, 184, 182, - -1, 314, -1, 206, -1, 213, -1, 92, 211, 108, - -1, 206, -1, 10, -1, 219, -1, 220, -1, 92, - 187, 108, -1, 92, 211, 108, -1, 92, 1, 108, - -1, -1, 92, 216, 340, 108, -1, 206, 92, 197, - 108, -1, 206, 47, -1, 215, 92, 197, 108, -1, - 215, 47, -1, 215, 93, 187, 111, -1, 215, 87, - -1, 215, 86, -1, 40, -1, 9, 92, 197, 108, - -1, 318, -1, 50, 73, 226, 74, 92, 187, 108, - -1, 51, 73, 226, 74, 92, 187, 108, -1, 52, - 73, 226, 74, 92, 187, 108, -1, 53, 73, 226, - 74, 92, 187, 108, -1, 49, 92, 187, 108, -1, - 49, 92, 226, 108, -1, 329, 3, -1, 329, 208, - -1, 329, 400, -1, 317, -1, 317, 92, 197, 108, - -1, 317, 47, -1, 222, 209, -1, 222, 209, 92, - 197, 108, -1, 222, 209, 47, -1, 222, 210, -1, - 222, 317, -1, 222, 210, 92, 197, 108, -1, 222, - 210, 47, -1, 222, 317, 92, 197, 108, -1, 222, - 317, 47, -1, 222, 85, 8, 47, -1, 222, 8, - 54, 85, 8, 47, -1, 222, 1, -1, 39, -1, - 329, 39, -1, 38, -1, 329, 218, -1, 42, -1, - 43, -1, 11, -1, 220, 11, -1, -1, 215, 91, - -1, 215, 94, -1, 233, 235, 60, -1, 227, 235, - 60, -1, 230, 236, 60, -1, 227, 60, -1, 230, - 60, -1, 119, 223, -1, 306, -1, 312, -1, 47, - -1, 225, 47, -1, 231, 332, -1, 302, 332, -1, - 233, 332, -1, 231, -1, 302, -1, 231, -1, 228, - -1, 230, 233, -1, 233, 229, -1, 233, 232, 229, - -1, 230, 233, 229, -1, 230, 233, 232, -1, 230, - 233, 232, 229, -1, 7, -1, 229, 234, -1, 229, - 7, -1, 229, 248, -1, 248, -1, 302, -1, 7, - -1, 230, 9, -1, 230, 7, -1, 230, 248, -1, - 248, -1, 233, -1, 302, 233, -1, 233, 232, -1, - 302, 233, 232, -1, 234, -1, 232, 234, -1, 262, - -1, 8, -1, 308, -1, 28, 92, 187, 108, -1, - 28, 92, 226, 108, -1, 30, 92, 187, 108, -1, - 30, 92, 226, 108, -1, 8, -1, 9, -1, 262, - -1, 243, -1, 235, 59, 239, -1, 244, -1, 236, - 59, 239, -1, 245, -1, 237, 59, 239, -1, -1, - 120, 92, 220, 108, -1, -1, 224, 238, 247, 63, - 240, 255, -1, 224, 238, 247, -1, -1, 247, 63, - 242, 255, -1, 247, -1, 224, 238, 241, -1, 312, - 238, 241, -1, -1, 312, 238, 246, 241, -1, 150, - 238, 247, -1, -1, 248, -1, 249, -1, 248, 249, - -1, 31, 92, 92, 250, 108, 108, -1, 251, -1, - 250, 59, 251, -1, -1, 252, -1, 252, 92, 3, - 108, -1, 252, 92, 3, 59, 197, 108, -1, 252, - 92, 197, 108, -1, 164, -1, 7, -1, 8, -1, - 9, -1, 164, -1, 253, 59, 164, -1, -1, 63, - 255, -1, 205, -1, 58, 109, -1, 58, 256, 109, - -1, 58, 256, 59, 109, -1, 1, -1, 255, -1, - 256, 59, 255, -1, 93, 205, 111, 255, -1, 164, - 62, 255, -1, 256, 59, 164, 62, 255, -1, 97, - -1, 257, 147, 146, 339, -1, 257, 147, 363, -1, - 257, 147, 1, -1, -1, 259, 258, 148, -1, 102, - 205, 107, -1, 102, 1, 107, -1, -1, 261, 260, - -1, 261, 1, -1, -1, 14, 164, 58, 263, 298, - 268, 109, -1, 14, 164, 58, 109, -1, -1, 14, - 58, 264, 298, 268, 109, -1, 14, 58, 109, -1, - 14, 164, -1, 14, 327, -1, 45, 322, -1, -1, - -1, 277, 283, 285, 109, 247, 265, 261, 266, 259, - -1, 277, -1, -1, 59, -1, -1, 59, -1, 36, - -1, 269, 7, -1, 269, 8, -1, 269, 9, -1, - 269, 36, -1, 269, 248, -1, 269, 164, -1, 269, - 166, -1, 270, 58, -1, 270, 62, -1, 269, 320, - 164, -1, 269, 329, 320, 164, -1, 269, 329, 164, - -1, 269, 179, -1, 269, 320, 179, -1, 270, -1, - -1, 271, 274, 278, -1, -1, 272, 275, 278, -1, - 269, 58, -1, 276, -1, 273, -1, -1, 62, 393, - -1, 62, 393, 279, -1, 280, -1, 279, 59, 393, - 280, -1, 281, -1, 282, 393, 281, -1, 322, -1, - 307, -1, 30, 92, 187, 108, -1, 30, 92, 226, - 108, -1, 37, 393, -1, 7, 393, -1, 282, 37, - 393, -1, 282, 7, 393, -1, 58, -1, -1, 284, - -1, 284, 287, -1, 285, 286, 287, -1, 285, 286, - -1, 37, 62, -1, 288, -1, 287, 288, -1, 289, - 60, -1, 289, 109, -1, 157, 62, -1, 157, 96, - -1, 157, 25, -1, 157, 58, -1, 60, -1, 119, - 288, -1, 135, 288, -1, 135, 227, 60, -1, 227, - 290, -1, 230, 291, -1, 312, 238, 247, 254, -1, - 150, 238, 247, 254, -1, 62, 205, -1, 1, -1, - 230, 156, 238, 247, 254, -1, 156, 238, 247, 254, - -1, 128, -1, -1, 292, -1, 290, 59, 293, -1, - -1, 295, -1, 291, 59, 297, -1, 294, -1, 295, - -1, 296, -1, 297, -1, 306, 238, 247, 254, -1, - 4, 62, 205, 247, -1, 312, 238, 247, 254, -1, - 150, 238, 247, 254, -1, 3, 62, 205, 247, -1, - 62, 205, 247, -1, 306, 238, 247, 254, -1, 4, - 62, 205, 247, -1, 312, 238, 247, 254, -1, 3, - 62, 205, 247, -1, 62, 205, 247, -1, 299, -1, - 298, 59, 299, -1, 164, -1, 164, 63, 205, -1, - 373, 330, -1, 373, -1, 92, 200, 226, 199, 93, - 187, 111, -1, -1, 301, 9, -1, 9, -1, 302, - 9, -1, -1, 303, 187, -1, 303, 92, 197, 108, - -1, 303, 92, 383, 108, -1, 303, 47, -1, 303, - 92, 1, 108, -1, 80, 302, 306, -1, 70, 302, - 306, -1, 80, 306, -1, 70, 306, -1, 328, 301, - 306, -1, 310, -1, 319, -1, 329, 319, -1, 307, - -1, 309, -1, 329, 309, -1, 320, 319, -1, 310, - 305, 301, 395, -1, 310, 93, 304, 111, -1, 310, - 93, 111, -1, 92, 306, 108, -1, 320, 319, -1, - 319, -1, 312, -1, 248, 312, -1, 80, 302, 311, - -1, 70, 302, 311, -1, 80, 311, -1, 70, 311, - -1, 328, 301, 311, -1, 214, -1, 80, 302, 311, - -1, 70, 302, 311, -1, 80, 313, -1, 70, 313, - -1, 328, 301, 311, -1, 314, -1, 214, 305, 301, - 395, -1, 92, 313, 108, -1, 214, 93, 304, 111, - -1, 214, 93, 111, -1, 316, -1, 320, 213, -1, - 320, 210, -1, 320, 209, -1, 320, 206, -1, 320, - 209, -1, 316, -1, 329, 316, -1, 233, 92, 197, - 108, -1, 233, 92, 211, 108, -1, 233, 225, -1, - 4, -1, 5, -1, 178, -1, 321, -1, 320, 321, - -1, 320, 48, 326, 54, -1, 4, 54, -1, 5, - 54, -1, 56, 54, -1, 178, 54, -1, 323, -1, - 329, 323, -1, 324, 164, -1, 324, 178, -1, 324, - 326, -1, 324, 48, 326, -1, 325, -1, 324, 325, - -1, 324, 326, 54, -1, 324, 48, 326, 54, -1, - 4, 54, -1, 5, 54, -1, 178, 54, -1, 57, - 54, -1, 3, 54, -1, 56, 54, -1, 164, 73, - 183, 182, -1, 329, 319, -1, 309, -1, 329, 309, - -1, 320, 80, -1, 329, 320, 80, -1, 54, -1, - 80, 301, 330, -1, 80, 301, -1, 70, 301, 330, - -1, 70, 301, -1, 328, 301, -1, 328, 301, 330, - -1, 331, -1, 93, 187, 111, -1, 331, 93, 304, - 111, -1, 80, 302, 332, -1, 80, 332, -1, 80, - 302, -1, 80, -1, 70, 302, 332, -1, 70, 332, - -1, 70, 302, -1, 70, -1, 328, 301, -1, 328, - 301, 332, -1, 333, -1, 92, 332, 108, -1, 90, - -1, 333, 92, 383, 108, 301, 395, -1, 333, 47, - 301, 395, -1, 333, 93, 304, 111, -1, 333, 93, - 111, -1, 92, 384, 108, 301, 395, -1, 203, 301, - 395, -1, 225, 301, 395, -1, 93, 304, 111, -1, - 93, 111, -1, 347, -1, 335, -1, 334, 347, -1, - 334, 335, -1, 1, 60, -1, -1, 337, -1, 338, - -1, 337, 338, -1, 33, 253, 60, -1, 340, -1, - 1, 340, -1, -1, 58, 341, 193, -1, -1, -1, - 15, 343, 189, 344, 345, -1, 340, -1, -1, 346, - 348, -1, 340, -1, 348, -1, 223, -1, 187, 60, - -1, -1, 342, 16, 349, 345, -1, 342, -1, -1, - -1, 17, 350, 189, 351, 194, -1, -1, -1, 18, - 352, 345, 17, 353, 188, 60, -1, -1, -1, -1, - -1, 19, 354, 92, 376, 355, 190, 60, 356, 378, - 108, 357, 194, -1, -1, -1, 20, 358, 92, 191, - 108, 359, 345, -1, -1, 21, 205, 62, 360, 347, - -1, -1, 21, 205, 12, 205, 62, 361, 347, -1, - -1, 22, 62, 362, 347, -1, 23, 60, -1, 24, - 60, -1, 25, 60, -1, 25, 187, 60, -1, 120, - 377, 92, 220, 108, 60, -1, 120, 377, 92, 220, - 62, 379, 108, 60, -1, 120, 377, 92, 220, 62, - 379, 62, 379, 108, 60, -1, 120, 377, 92, 220, - 62, 379, 62, 379, 62, 382, 108, 60, -1, 26, - 80, 187, 60, -1, 26, 164, 60, -1, 375, 347, - -1, 375, 109, -1, 60, -1, 366, -1, 130, -1, - 129, -1, 126, -1, -1, -1, 96, 364, 146, 340, - 365, 369, -1, -1, -1, 96, 367, 340, 368, 369, - -1, 370, -1, 369, 370, -1, -1, -1, 95, 371, - 374, 372, 340, -1, 231, -1, 302, -1, 92, 12, - 108, -1, 92, 392, 108, -1, 3, 62, -1, 57, - 62, -1, 4, 62, -1, 5, 62, -1, 378, 60, - -1, 223, -1, 58, 193, -1, -1, 9, -1, -1, - 187, -1, 1, -1, -1, 380, -1, 381, -1, 380, - 59, 381, -1, 11, 92, 187, 108, -1, 11, -1, - 382, 59, 11, -1, -1, 384, -1, 226, -1, 388, - -1, 389, 12, -1, 388, 12, -1, 226, 12, -1, - 12, -1, 388, 62, -1, 226, 62, -1, -1, 63, - 386, 387, -1, 101, -1, 255, -1, 390, -1, 392, - 385, -1, 389, 391, -1, 389, 394, -1, 389, 394, - 63, 255, -1, 388, 59, -1, 226, 59, -1, 228, - 224, -1, 231, 224, -1, 233, 224, -1, 228, 332, - -1, 228, -1, 230, 312, -1, 392, -1, 392, 385, - -1, 390, -1, 226, -1, -1, -1, 312, -1, -1, - 61, 92, 397, 108, -1, 61, 47, -1, 226, -1, - 396, -1, 397, 59, 396, -1, -1, 80, 301, 398, - -1, 70, 301, 398, -1, 328, 301, 398, -1, 41, - -1, 399, 80, -1, 399, 81, -1, 399, 82, -1, - 399, 78, -1, 399, 79, -1, 399, 70, -1, 399, - 68, -1, 399, 69, -1, 399, 85, -1, 399, 59, - -1, 399, 75, -1, 399, 73, -1, 399, 74, -1, - 399, 72, -1, 399, 64, -1, 399, 63, -1, 399, - 77, -1, 399, 76, -1, 399, 87, -1, 399, 86, - -1, 399, 67, -1, 399, 66, -1, 399, 110, -1, - 399, 65, 62, -1, 399, 71, -1, 399, 94, -1, - 399, 84, -1, 399, 47, -1, 399, 93, 111, -1, - 399, 39, -1, 399, 38, -1, 399, 39, 93, 111, - -1, 399, 38, 93, 111, -1, 399, 373, 398, -1, - 399, 1, -1 -}; - -/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ -static const yytype_uint16 yyrline[] = -{ - 0, 337, 337, 339, 348, 348, 351, 356, 357, 361, - 366, 370, 376, 380, 380, 387, 389, 391, 393, 396, - 398, 401, 405, 404, 409, 408, 412, 413, 415, 416, - 422, 421, 433, 435, 437, 442, 444, 446, 452, 451, - 466, 472, 481, 482, 483, 485, 490, 492, 500, 499, - 503, 509, 511, 516, 519, 522, 524, 529, 541, 543, - 545, 547, 549, 551, 565, 567, 572, 574, 576, 578, - 581, 584, 589, 590, 592, 594, 600, 601, 603, 605, - 607, 608, 615, 616, 617, 621, 623, 627, 629, 630, - 633, 635, 639, 641, 647, 653, 652, 656, 661, 660, - 664, 669, 668, 672, 677, 676, 680, 687, 690, 693, - 696, 699, 705, 707, 709, 711, 718, 729, 732, 737, - 742, 745, 750, 756, 765, 767, 769, 774, 788, 808, - 809, 811, 812, 816, 822, 828, 830, 832, 834, 836, - 839, 845, 846, 847, 848, 849, 853, 854, 855, 859, - 860, 861, 866, 865, 870, 869, 874, 873, 877, 876, - 880, 879, 885, 883, 889, 888, 892, 891, 897, 900, - 907, 910, 913, 917, 918, 923, 929, 938, 939, 949, - 950, 954, 956, 961, 963, 965, 969, 971, 973, 975, - 977, 982, 984, 988, 992, 997, 1001, 1007, 1008, 1009, - 1015, 1014, 1039, 1043, 1044, 1045, 1046, 1051, 1050, 1054, - 1059, 1062, 1065, 1067, 1072, 1074, 1078, 1081, 1084, 1086, - 1088, 1090, 1093, 1097, 1099, 1102, 1104, 1110, 1113, 1116, - 1119, 1131, 1136, 1140, 1144, 1149, 1151, 1155, 1159, 1161, - 1171, 1175, 1178, 1180, 1186, 1188, 1190, 1198, 1212, 1216, - 1223, 1224, 1226, 1240, 1242, 1244, 1246, 1248, 1250, 1252, - 1254, 1256, 1258, 1260, 1262, 1264, 1266, 1268, 1270, 1272, - 1274, 1276, 1278, 1280, 1282, 1286, 1288, 1290, 1308, 1310, - 1312, 1313, 1314, 1315, 1316, 1320, 1332, 1334, 1339, 1341, - 1343, 1349, 1350, 1351, 1355, 1356, 1365, 1366, 1368, 1370, - 1375, 1377, 1382, 1385, 1386, 1387, 1392, 1399, 1400, 1401, - 1415, 1417, 1420, 1423, 1422, 1438, 1440, 1442, 1444, 1446, - 1448, 1450, 1453, 1455, 1472, 1473, 1477, 1481, 1485, 1489, - 1491, 1495, 1497, 1499, 1507, 1509, 1511, 1513, 1517, 1519, - 1521, 1523, 1528, 1530, 1532, 1534, 1537, 1539, 1541, 1586, - 1588, 1593, 1595, 1600, 1602, 1608, 1609, 1615, 1627, 1629, - 1637, 1643, 1648, 1650, 1655, 1657, 1665, 1666, 1671, 1674, - 1681, 1684, 1687, 1690, 1693, 1704, 1705, 1709, 1712, 1715, - 1718, 1721, 1724, 1731, 1736, 1738, 1743, 1745, 1755, 1757, - 1759, 1762, 1768, 1770, 1781, 1784, 1787, 1790, 1796, 1798, - 1807, 1808, 1810, 1812, 1815, 1818, 1833, 1853, 1855, 1857, - 1861, 1862, 1867, 1868, 1873, 1874, 1880, 1881, 1887, 1886, - 1892, 1906, 1905, 1914, 1921, 1925, 1931, 1930, 1936, 1946, - 1947, 1952, 1954, 1959, 1964, 1966, 1972, 1973, 1975, 1977, - 1979, 1987, 1988, 1989, 1990, 1995, 1997, 2002, 2004, 2011, - 2012, 2015, 2018, 2021, 2028, 2030, 2033, 2035, 2037, 2042, - 2048, 2055, 2062, 2066, 2068, 2074, 2076, 2080, 2081, 2083, - 2089, 2088, 2099, 2104, 2103, 2114, 2118, 2121, 2124, 2132, - 2142, 2130, 2147, 2167, 2169, 2172, 2174, 2180, 2181, 2183, - 2185, 2187, 2189, 2194, 2202, 2204, 2206, 2211, 2216, 2221, - 2226, 2228, 2233, 2236, 2235, 2246, 2245, 2271, 2277, 2278, - 2282, 2284, 2286, 2291, 2292, 2301, 2305, 2312, 2314, 2315, - 2336, 2360, 2361, 2365, 2376, 2391, 2397, 2403, 2404, 2405, - 2406, 2410, 2425, 2429, 2436, 2437, 2442, 2444, 2446, 2448, - 2450, 2452, 2455, 2465, 2476, 2497, 2503, 2506, 2509, 2511, - 2522, 2527, 2530, 2537, 2538, 2545, 2557, 2558, 2565, 2576, - 2577, 2581, 2582, 2586, 2592, 2601, 2607, 2613, 2619, 2628, - 2631, 2637, 2640, 2643, 2653, 2654, 2659, 2661, 2667, 2670, - 2676, 2688, 2690, 2695, 2698, 2708, 2712, 2718, 2720, 2722, - 2724, 2731, 2733, 2735, 2737, 2739, 2743, 2747, 2764, 2775, - 2776, 2777, 2782, 2787, 2789, 2791, 2793, 2795, 2799, 2806, - 2807, 2816, 2818, 2820, 2822, 2824, 2828, 2832, 2834, 2836, - 2838, 2840, 2844, 2848, 2850, 2852, 2854, 2856, 2858, 2866, - 2869, 2875, 2878, 2884, 2885, 2890, 2892, 2894, 2898, 2899, - 2900, 2904, 2905, 2907, 2914, 2928, 2934, 2940, 2955, 2956, - 2961, 2974, 2976, 2978, 2983, 2988, 3001, 3003, 3008, 3020, - 3026, 3028, 3029, 3030, 3039, 3044, 3052, 3053, 3058, 3060, - 3067, 3073, 3075, 3077, 3079, 3081, 3085, 3089, 3094, 3096, - 3102, 3104, 3106, 3108, 3110, 3112, 3114, 3116, 3118, 3122, - 3126, 3131, 3134, 3135, 3137, 3139, 3141, 3143, 3145, 3147, - 3149, 3151, 3160, 3161, 3162, 3163, 3167, 3172, 3174, 3180, - 3181, 3185, 3199, 3201, 3206, 3205, 3213, 3218, 3212, 3224, - 3225, 3225, 3231, 3233, 3237, 3239, 3242, 3241, 3248, 3251, - 3256, 3250, 3260, 3262, 3259, 3269, 3271, 3273, 3275, 3268, - 3279, 3281, 3278, 3285, 3284, 3288, 3287, 3291, 3290, 3293, - 3295, 3297, 3299, 3301, 3307, 3313, 3316, 3319, 3325, 3327, - 3329, 3333, 3335, 3336, 3337, 3339, 3344, 3350, 3343, 3362, - 3364, 3361, 3370, 3371, 3376, 3378, 3375, 3384, 3385, 3389, - 3405, 3412, 3419, 3421, 3423, 3428, 3430, 3431, 3441, 3443, - 3449, 3450, 3451, 3459, 3460, 3464, 3465, 3470, 3475, 3477, - 3489, 3492, 3493, 3501, 3503, 3506, 3508, 3511, 3513, 3523, - 3539, 3538, 3545, 3546, 3551, 3554, 3557, 3560, 3562, 3567, - 3568, 3578, 3582, 3585, 3588, 3592, 3596, 3603, 3606, 3612, - 3613, 3617, 3622, 3627, 3639, 3641, 3643, 3648, 3653, 3654, - 3662, 3664, 3666, 3668, 3675, 3680, 3682, 3684, 3686, 3688, - 3690, 3692, 3694, 3696, 3698, 3700, 3702, 3704, 3706, 3708, - 3710, 3712, 3714, 3716, 3718, 3720, 3722, 3724, 3726, 3728, - 3730, 3732, 3734, 3736, 3738, 3740, 3742, 3744, 3747, 3749 -}; -#endif - -#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE -/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. - First, the terminals, then, starting at YYNTOKENS, nonterminals. */ -static const char *const yytname[] = -{ - "$end", "error", "$undefined", "IDENTIFIER", "TYPENAME", "SELFNAME", - "PFUNCNAME", "SCSPEC", "TYPESPEC", "CV_QUALIFIER", "CONSTANT", "STRING", - "ELLIPSIS", "SIZEOF", "ENUM", "IF", "ELSE", "WHILE", "DO", "FOR", - "SWITCH", "CASE", "DEFAULT", "BREAK", "CONTINUE", "RETURN", "GOTO", - "ASM_KEYWORD", "TYPEOF", "ALIGNOF", "SIGOF", "ATTRIBUTE", "EXTENSION", - "LABEL", "REALPART", "IMAGPART", "AGGR", "VISSPEC", "DELETE", "NEW", - "THIS", "OPERATOR", "CXX_TRUE", "CXX_FALSE", "NAMESPACE", - "TYPENAME_KEYWORD", "USING", "LEFT_RIGHT", "TEMPLATE", "TYPEID", - "DYNAMIC_CAST", "STATIC_CAST", "REINTERPRET_CAST", "CONST_CAST", "SCOPE", - "EMPTY", "NSNAME", "PTYPENAME", "'{'", "','", "';'", "THROW", "':'", - "'='", "ASSIGN", "'?'", "OROR", "ANDAND", "'|'", "'^'", "'&'", "MIN_MAX", - "EQCOMPARE", "'<'", "'>'", "ARITHCOMPARE", "RSHIFT", "LSHIFT", "'+'", - "'-'", "'*'", "'/'", "'%'", "DOT_STAR", "POINTSAT_STAR", "'~'", - "MINUSMINUS", "PLUSPLUS", "UNARY", "HYPERUNARY", "PAREN_STAR_PAREN", - "'.'", "'('", "'['", "POINTSAT", "CATCH", "TRY", - "PRE_PARSED_FUNCTION_DECL", "EXTERN_LANG_STRING", "ALL", - "PRE_PARSED_CLASS_DECL", "DEFARG", "DEFARG_MARKER", "TYPENAME_DEFN", - "IDENTIFIER_DEFN", "PTYPENAME_DEFN", "END_OF_LINE", "END_OF_SAVED_INPUT", - "')'", "'}'", "'!'", "']'", "$accept", "program", "extdefs", "@1", - "extdefs_opt", ".hush_warning", ".warning_ok", "extension", - "asm_keyword", "lang_extdef", "@2", "extdef", "@3", "@4", - "namespace_alias", "@5", "using_decl", "namespace_using_decl", - "using_directive", "@6", "namespace_qualifier", "any_id", - "extern_lang_string", "template_header", "@7", "template_parm_list", - "maybe_identifier", "template_type_parm", "template_template_parm", - "template_parm", "template_def", "template_extdef", "template_datadef", - "datadef", "ctor_initializer_opt", "maybe_return_init", - "eat_saved_input", "fndef", "constructor_declarator", "@8", "@9", "@10", - "@11", "fn.def1", "component_constructor_declarator", "fn.def2", - "return_id", "return_init", "base_init", ".set_base_init", - "member_init_list", "member_init", "identifier", "notype_identifier", - "identifier_defn", "explicit_instantiation", "@12", "@13", "@14", "@15", - "@16", "@17", "@18", "@19", "begin_explicit_instantiation", - "end_explicit_instantiation", "template_type", "apparent_template_type", - "self_template_type", ".finish_template_type", "template_close_bracket", - "template_arg_list_opt", "template_arg_list", "template_arg", "unop", - "expr", "paren_expr_or_null", "paren_cond_or_null", "xcond", "condition", - "@20", "compstmtend", "already_scoped_stmt", "@21", - "nontrivial_exprlist", "nonnull_exprlist", "unary_expr", - ".finish_new_placement", ".begin_new_placement", "new_placement", - "new_initializer", "regcast_or_absdcl", "cast_expr", "expr_no_commas", - "notype_unqualified_id", "do_id", "template_id", "object_template_id", - "unqualified_id", "expr_or_declarator_intern", "expr_or_declarator", - "notype_template_declarator", "direct_notype_declarator", "primary", - "@22", "new", "delete", "boolean.literal", "string", "nodecls", "object", - "decl", "declarator", "fcast_or_absdcl", "type_id", "typed_declspecs", - "typed_declspecs1", "reserved_declspecs", "declmods", "typed_typespecs", - "reserved_typespecquals", "typespec", "typespecqual_reserved", - "initdecls", "notype_initdecls", "nomods_initdecls", "maybeasm", - "initdcl", "@23", "initdcl0_innards", "@24", "initdcl0", - "notype_initdcl0", "nomods_initdcl0", "@25", "maybe_attribute", - "attributes", "attribute", "attribute_list", "attrib", "any_word", - "identifiers_or_typenames", "maybe_init", "init", "initlist", - "fn.defpen", "pending_inline", "pending_inlines", "defarg_again", - "pending_defargs", "structsp", "@26", "@27", "@28", "@29", "maybecomma", - "maybecomma_warn", "aggr", "named_class_head_sans_basetype", - "named_class_head_sans_basetype_defn", - "named_complex_class_head_sans_basetype", "named_class_head", "@30", - "@31", "unnamed_class_head", "class_head", "maybe_base_class_list", - "base_class_list", "base_class", "base_class.1", - "base_class_access_list", "left_curly", "self_reference", - "opt.component_decl_list", "access_specifier", "component_decl_list", - "component_decl", "component_decl_1", "components", "notype_components", - "component_declarator0", "component_declarator", - "after_type_component_declarator0", "notype_component_declarator0", - "after_type_component_declarator", "notype_component_declarator", - "enumlist", "enumerator", "new_type_id", "cv_qualifiers", - "nonempty_cv_qualifiers", "suspend_mom", "nonmomentary_expr", - "maybe_parmlist", "after_type_declarator", "nonnested_type", - "complete_type_name", "nested_type", "direct_after_type_declarator", - "notype_declarator_intern", "notype_declarator", - "complex_notype_declarator", "complex_direct_notype_declarator", - "qualified_id", "notype_qualified_id", "overqualified_id", - "functional_cast", "type_name", "nested_name_specifier", - "nested_name_specifier_1", "typename_sub", "typename_sub0", - "typename_sub1", "typename_sub2", "explicit_template_type", - "complex_type_name", "ptr_to_mem", "global_scope", "new_declarator", - "direct_new_declarator", "absdcl", "direct_abstract_declarator", "stmts", - "errstmt", "maybe_label_decls", "label_decls", "label_decl", - "compstmt_or_error", "compstmt", "@32", "simple_if", "@33", "@34", - "implicitly_scoped_stmt", "@35", "stmt", "simple_stmt", "@36", "@37", - "@38", "@39", "@40", "@41", "@42", "@43", "@44", "@45", "@46", "@47", - "@48", "@49", "function_try_block", "@50", "@51", "try_block", "@52", - "@53", "handler_seq", "handler", "@54", "@55", "type_specifier_seq", - "handler_args", "label_colon", "for.init.statement", - "maybe_cv_qualifier", "xexpr", "asm_operands", "nonnull_asm_operands", - "asm_operand", "asm_clobbers", "parmlist", "complex_parmlist", "defarg", - "@56", "defarg1", "parms", "parms_comma", "named_parm", "full_parm", - "parm", "see_typename", "bad_parm", "exception_specification_opt", - "ansi_raise_identifier", "ansi_raise_identifiers", - "conversion_declarator", "operator", "operator_name", 0 -}; -#endif - -# ifdef YYPRINT -/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to - token YYLEX-NUM. */ -static const yytype_uint16 yytoknum[] = -{ - 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 123, 44, - 59, 313, 58, 61, 314, 63, 315, 316, 124, 94, - 38, 317, 318, 60, 62, 319, 320, 321, 43, 45, - 42, 47, 37, 322, 323, 126, 324, 325, 326, 327, - 328, 46, 40, 91, 329, 330, 331, 332, 333, 334, - 335, 336, 337, 338, 339, 340, 341, 342, 41, 125, - 33, 93 -}; -# endif - -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const yytype_uint16 yyr1[] = -{ - 0, 112, 113, 113, 115, 114, 114, 116, 116, 117, - 118, 119, 120, 122, 121, 123, 123, 123, 123, 123, - 123, 123, 124, 123, 125, 123, 123, 123, 123, 123, - 127, 126, 128, 128, 128, 129, 129, 129, 131, 130, - 132, 132, 133, 133, 133, 133, 134, 134, 136, 135, - 135, 137, 137, 138, 138, 139, 139, 140, 141, 141, - 141, 141, 141, 141, 142, 142, 143, 143, 143, 143, - 143, 143, 144, 144, 144, 144, 145, 145, 145, 145, - 145, 145, 145, 145, 145, 146, 146, 147, 147, 147, - 148, 148, 149, 149, 149, 151, 150, 150, 152, 150, - 150, 153, 150, 150, 154, 150, 150, 155, 155, 155, - 155, 155, 156, 156, 156, 156, 157, 157, 157, 157, - 157, 157, 157, 158, 159, 159, 159, 160, 161, 162, - 162, 162, 162, 163, 163, 163, 163, 163, 163, 163, - 163, 164, 164, 164, 164, 164, 165, 165, 165, 166, - 166, 166, 168, 167, 169, 167, 170, 167, 171, 167, - 172, 167, 173, 167, 174, 167, 175, 167, 176, 177, - 178, 178, 178, 179, 179, 180, 181, 182, 182, 183, - 183, 184, 184, 185, 185, 185, 186, 186, 186, 186, - 186, 187, 187, 188, 188, 189, 189, 190, 190, 190, - 192, 191, 191, 193, 193, 193, 193, 195, 194, 194, - 196, 196, 196, 196, 197, 197, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 199, 200, 201, 201, 202, 202, 202, 202, 203, 203, - 204, 204, 204, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 206, 206, - 206, 206, 206, 206, 206, 207, 208, 208, 209, 209, - 209, 210, 210, 210, 211, 211, 212, 212, 212, 212, - 213, 213, 214, 214, 214, 214, 215, 215, 215, 215, - 215, 215, 215, 216, 215, 215, 215, 215, 215, 215, - 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, - 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, - 215, 215, 215, 215, 215, 215, 215, 215, 215, 217, - 217, 218, 218, 219, 219, 220, 220, 221, 222, 222, - 223, 223, 223, 223, 223, 223, 224, 224, 225, 225, - 226, 226, 226, 226, 226, 227, 227, 228, 228, 228, - 228, 228, 228, 229, 229, 229, 229, 229, 230, 230, - 230, 230, 230, 230, 231, 231, 231, 231, 232, 232, - 233, 233, 233, 233, 233, 233, 233, 234, 234, 234, - 235, 235, 236, 236, 237, 237, 238, 238, 240, 239, - 239, 242, 241, 241, 243, 244, 246, 245, 245, 247, - 247, 248, 248, 249, 250, 250, 251, 251, 251, 251, - 251, 252, 252, 252, 252, 253, 253, 254, 254, 255, - 255, 255, 255, 255, 256, 256, 256, 256, 256, 257, - 258, 258, 258, 259, 259, 260, 260, 261, 261, 261, - 263, 262, 262, 264, 262, 262, 262, 262, 262, 265, - 266, 262, 262, 267, 267, 268, 268, 269, 269, 269, - 269, 269, 269, 270, 271, 271, 271, 272, 272, 272, - 272, 272, 273, 274, 273, 275, 273, 276, 277, 277, - 278, 278, 278, 279, 279, 280, 280, 281, 281, 281, - 281, 282, 282, 282, 282, 283, 284, 285, 285, 285, - 285, 286, 287, 287, 288, 288, 288, 288, 288, 288, - 288, 288, 288, 288, 289, 289, 289, 289, 289, 289, - 289, 289, 289, 290, 290, 290, 291, 291, 291, 292, - 292, 293, 293, 294, 294, 295, 295, 295, 295, 296, - 296, 297, 297, 297, 298, 298, 299, 299, 300, 300, - 300, 301, 301, 302, 302, 303, 304, 305, 305, 305, - 305, 306, 306, 306, 306, 306, 306, 307, 307, 308, - 308, 308, 309, 310, 310, 310, 310, 310, 310, 311, - 311, 312, 312, 312, 312, 312, 312, 313, 313, 313, - 313, 313, 313, 314, 314, 314, 314, 314, 314, 315, - 315, 316, 316, 317, 317, 318, 318, 318, 319, 319, - 319, 320, 320, 320, 321, 321, 321, 321, 322, 322, - 323, 323, 323, 323, 324, 324, 324, 324, 325, 325, - 325, 325, 325, 325, 326, 327, 327, 327, 328, 328, - 329, 330, 330, 330, 330, 330, 330, 330, 331, 331, - 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, - 332, 333, 333, 333, 333, 333, 333, 333, 333, 333, - 333, 333, 334, 334, 334, 334, 335, 336, 336, 337, - 337, 338, 339, 339, 341, 340, 343, 344, 342, 345, - 346, 345, 347, 347, 348, 348, 349, 348, 348, 350, - 351, 348, 352, 353, 348, 354, 355, 356, 357, 348, - 358, 359, 348, 360, 348, 361, 348, 362, 348, 348, - 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, - 348, 348, 348, 348, 348, 348, 364, 365, 363, 367, - 368, 366, 369, 369, 371, 372, 370, 373, 373, 374, - 374, 375, 375, 375, 375, 376, 376, 376, 377, 377, - 378, 378, 378, 379, 379, 380, 380, 381, 382, 382, - 383, 383, 383, 384, 384, 384, 384, 384, 384, 384, - 386, 385, 387, 387, 388, 388, 388, 388, 388, 389, - 389, 390, 390, 390, 390, 390, 390, 391, 391, 392, - 392, 393, 394, 394, 395, 395, 395, 396, 397, 397, - 398, 398, 398, 398, 399, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400 -}; - -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ -static const yytype_uint8 yyr2[] = -{ - 0, 2, 0, 1, 0, 2, 2, 1, 0, 0, - 0, 1, 1, 0, 2, 2, 1, 1, 5, 4, - 5, 4, 0, 6, 0, 5, 1, 2, 1, 2, - 0, 6, 2, 3, 3, 3, 3, 4, 0, 5, - 2, 3, 1, 1, 2, 2, 1, 2, 0, 5, - 3, 1, 3, 1, 0, 2, 2, 3, 1, 3, - 1, 3, 1, 3, 2, 2, 2, 1, 1, 5, - 4, 2, 2, 3, 3, 2, 2, 3, 3, 2, - 2, 2, 2, 2, 1, 1, 1, 0, 1, 2, - 0, 1, 4, 3, 3, 0, 8, 5, 0, 9, - 6, 0, 8, 5, 0, 9, 6, 2, 2, 1, - 2, 1, 6, 4, 6, 4, 2, 1, 2, 2, - 1, 2, 1, 2, 2, 4, 2, 3, 0, 0, - 1, 3, 2, 3, 1, 4, 2, 4, 2, 4, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 6, 0, 6, 0, 5, 0, 5, - 0, 7, 0, 7, 0, 6, 0, 6, 0, 0, - 5, 5, 1, 1, 5, 5, 0, 1, 1, 0, - 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 1, 3, 0, 1, 1, - 0, 7, 1, 1, 3, 4, 3, 0, 3, 1, - 3, 3, 3, 3, 1, 1, 1, 2, 2, 2, - 2, 2, 2, 2, 4, 2, 4, 2, 3, 3, - 4, 5, 6, 6, 7, 2, 4, 5, 2, 2, - 1, 0, 4, 4, 3, 1, 3, 2, 3, 4, - 1, 2, 5, 1, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 5, 3, 3, 1, 2, 3, 3, - 1, 1, 1, 1, 1, 0, 5, 5, 5, 5, - 5, 1, 1, 1, 1, 2, 1, 2, 2, 3, - 4, 4, 1, 1, 1, 3, 1, 1, 1, 1, - 3, 3, 3, 0, 4, 4, 2, 4, 2, 4, - 2, 2, 1, 4, 1, 7, 7, 7, 7, 4, - 4, 2, 2, 2, 1, 4, 2, 2, 5, 3, - 2, 2, 5, 3, 5, 3, 4, 6, 2, 1, - 2, 1, 2, 1, 1, 1, 2, 0, 2, 2, - 3, 3, 3, 2, 2, 2, 1, 1, 1, 2, - 2, 2, 2, 1, 1, 1, 1, 2, 2, 3, - 3, 3, 4, 1, 2, 2, 2, 1, 1, 1, - 2, 2, 2, 1, 1, 2, 2, 3, 1, 2, - 1, 1, 1, 4, 4, 4, 4, 1, 1, 1, - 1, 3, 1, 3, 1, 3, 0, 4, 0, 6, - 3, 0, 4, 1, 3, 3, 0, 4, 3, 0, - 1, 1, 2, 6, 1, 3, 0, 1, 4, 6, - 4, 1, 1, 1, 1, 1, 3, 0, 2, 1, - 2, 3, 4, 1, 1, 3, 4, 3, 5, 1, - 4, 3, 3, 0, 3, 3, 3, 0, 2, 2, - 0, 7, 4, 0, 6, 3, 2, 2, 2, 0, - 0, 9, 1, 0, 1, 0, 1, 1, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 3, 4, 3, - 2, 3, 1, 0, 3, 0, 3, 2, 1, 1, - 0, 2, 3, 1, 4, 1, 3, 1, 1, 4, - 4, 2, 2, 3, 3, 1, 0, 1, 2, 3, - 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, - 1, 2, 2, 3, 2, 2, 4, 4, 2, 1, - 5, 4, 1, 0, 1, 3, 0, 1, 3, 1, - 1, 1, 1, 4, 4, 4, 4, 4, 3, 4, - 4, 4, 4, 3, 1, 3, 1, 3, 2, 1, - 7, 0, 2, 1, 2, 0, 2, 4, 4, 2, - 4, 3, 3, 2, 2, 3, 1, 1, 2, 1, - 1, 2, 2, 4, 4, 3, 3, 2, 1, 1, - 2, 3, 3, 2, 2, 3, 1, 3, 3, 2, - 2, 3, 1, 4, 3, 4, 3, 1, 2, 2, - 2, 2, 2, 1, 2, 4, 4, 2, 1, 1, - 1, 1, 2, 4, 2, 2, 2, 2, 1, 2, - 2, 2, 2, 3, 1, 2, 3, 4, 2, 2, - 2, 2, 2, 2, 4, 2, 1, 2, 2, 3, - 1, 3, 2, 3, 2, 2, 3, 1, 3, 4, - 3, 2, 2, 1, 3, 2, 2, 1, 2, 3, - 1, 3, 1, 6, 4, 4, 3, 5, 3, 3, - 3, 2, 1, 1, 2, 2, 2, 0, 1, 1, - 2, 3, 1, 2, 0, 3, 0, 0, 5, 1, - 0, 2, 1, 1, 1, 2, 0, 4, 1, 0, - 0, 5, 0, 0, 7, 0, 0, 0, 0, 12, - 0, 0, 7, 0, 5, 0, 7, 0, 4, 2, - 2, 2, 3, 6, 8, 10, 12, 4, 3, 2, - 2, 1, 1, 1, 1, 1, 0, 0, 6, 0, - 0, 5, 1, 2, 0, 0, 5, 1, 1, 3, - 3, 2, 2, 2, 2, 2, 1, 2, 0, 1, - 0, 1, 1, 0, 1, 1, 3, 4, 1, 3, - 0, 1, 1, 1, 2, 2, 2, 1, 2, 2, - 0, 3, 1, 1, 1, 2, 2, 2, 4, 2, - 2, 2, 2, 2, 2, 1, 2, 1, 2, 1, - 1, 0, 0, 1, 0, 4, 2, 1, 1, 3, - 0, 3, 3, 3, 1, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, - 2, 2, 2, 3, 2, 2, 4, 4, 3, 2 -}; - -/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state - STATE-NUM when YYTABLE doesn't specify something else to do. Zero - means the default is an error. */ -static const yytype_uint16 yydefact[] = -{ - 4, 0, 13, 13, 1, 6, 0, 5, 0, 282, - 638, 639, 0, 389, 401, 583, 0, 12, 0, 0, - 0, 11, 487, 844, 0, 0, 0, 168, 670, 284, - 283, 84, 0, 0, 831, 0, 46, 0, 0, 14, - 26, 0, 28, 9, 0, 17, 16, 90, 111, 87, - 0, 640, 172, 303, 280, 304, 616, 0, 376, 0, - 375, 394, 0, 414, 393, 431, 400, 0, 502, 503, - 505, 509, 508, 482, 388, 599, 402, 600, 109, 302, - 627, 597, 0, 641, 581, 0, 0, 281, 82, 83, - 179, 644, 179, 645, 179, 285, 168, 141, 142, 143, - 145, 144, 473, 476, 0, 666, 0, 477, 0, 0, - 0, 0, 142, 143, 145, 144, 24, 0, 0, 0, - 0, 0, 0, 0, 478, 648, 0, 654, 0, 0, - 0, 38, 0, 0, 32, 0, 0, 48, 0, 646, - 0, 179, 0, 0, 614, 609, 0, 0, 0, 613, - 0, 0, 0, 0, 303, 0, 294, 585, 0, 0, - 302, 581, 29, 0, 27, 4, 47, 0, 65, 389, - 0, 0, 9, 68, 64, 67, 90, 0, 0, 0, - 400, 91, 15, 0, 429, 0, 0, 447, 88, 80, - 647, 585, 0, 581, 81, 0, 0, 0, 107, 0, - 410, 366, 596, 367, 608, 0, 581, 391, 390, 79, - 110, 377, 0, 412, 392, 108, 383, 407, 408, 378, - 396, 398, 387, 409, 0, 76, 432, 488, 489, 490, - 491, 507, 150, 149, 151, 493, 494, 173, 500, 492, - 0, 0, 495, 496, 510, 510, 525, 526, 584, 395, - 0, 426, 639, 0, 668, 172, 631, 632, 628, 602, - 642, 0, 601, 598, 0, 879, 875, 874, 872, 854, - 860, 859, 0, 866, 865, 851, 852, 850, 869, 858, - 856, 857, 855, 862, 861, 848, 849, 845, 846, 847, - 871, 853, 864, 863, 0, 870, 867, 777, 394, 778, - 840, 285, 282, 583, 307, 355, 0, 0, 0, 0, - 351, 349, 322, 353, 354, 0, 0, 0, 0, 0, - 284, 283, 276, 0, 0, 187, 186, 0, 0, 189, - 188, 0, 190, 0, 0, 180, 181, 0, 250, 0, - 253, 185, 306, 216, 0, 0, 308, 309, 0, 183, - 373, 394, 374, 633, 334, 324, 0, 0, 0, 0, - 179, 0, 475, 0, 470, 0, 667, 665, 0, 191, - 192, 0, 0, 0, 436, 4, 22, 30, 662, 658, - 659, 663, 661, 660, 141, 142, 143, 0, 145, 144, - 650, 651, 655, 652, 649, 0, 292, 293, 291, 630, - 629, 34, 33, 50, 0, 158, 0, 0, 394, 156, - 0, 0, 610, 612, 0, 611, 142, 143, 278, 279, - 298, 0, 620, 297, 0, 619, 0, 305, 284, 283, - 0, 0, 0, 296, 295, 624, 0, 0, 13, 0, - 168, 10, 10, 71, 0, 66, 0, 0, 72, 75, - 0, 428, 430, 123, 94, 128, 766, 0, 86, 85, - 93, 126, 0, 0, 124, 89, 626, 0, 0, 589, - 0, 834, 0, 594, 0, 593, 0, 0, 0, 0, - 581, 429, 0, 78, 585, 581, 607, 0, 380, 381, - 0, 77, 429, 385, 384, 386, 379, 399, 416, 415, - 179, 497, 501, 499, 0, 831, 504, 506, 0, 0, - 397, 429, 581, 95, 0, 0, 0, 0, 581, 101, - 582, 615, 639, 669, 172, 0, 0, 868, 873, 396, - 581, 581, 0, 581, 878, 179, 0, 0, 0, 223, - 0, 0, 225, 238, 239, 0, 0, 0, 0, 0, - 277, 222, 219, 218, 220, 0, 0, 0, 0, 0, - 306, 0, 0, 0, 217, 177, 178, 300, 0, 221, - 0, 0, 251, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 316, 0, 318, 321, 320, - 358, 0, 0, 359, 241, 241, 0, 227, 579, 0, - 235, 356, 348, 0, 0, 831, 337, 340, 341, 0, - 0, 368, 687, 683, 692, 0, 585, 581, 581, 581, - 370, 690, 0, 637, 372, 0, 0, 371, 336, 0, - 331, 350, 332, 352, 634, 0, 333, 176, 176, 0, - 166, 0, 394, 164, 576, 485, 574, 472, 0, 0, - 403, 0, 0, 404, 405, 406, 442, 443, 444, 441, - 0, 434, 437, 0, 4, 0, 653, 179, 656, 0, - 42, 43, 0, 54, 0, 0, 58, 62, 51, 830, - 825, 0, 373, 394, 54, 374, 829, 60, 169, 154, - 152, 169, 301, 176, 618, 617, 305, 0, 621, 0, - 19, 21, 90, 10, 10, 74, 73, 0, 129, 357, - 0, 714, 92, 712, 453, 0, 449, 448, 215, 0, - 214, 586, 625, 0, 807, 0, 802, 394, 0, 801, - 803, 832, 814, 0, 0, 623, 592, 591, 0, 0, - 606, 0, 424, 423, 411, 605, 0, 834, 595, 382, - 413, 425, 429, 0, 498, 511, 549, 639, 0, 540, - 0, 0, 552, 0, 122, 117, 0, 172, 553, 556, - 0, 532, 0, 120, 0, 429, 0, 427, 834, 800, - 179, 179, 643, 179, 834, 800, 581, 98, 581, 104, - 877, 876, 840, 840, 840, 0, 0, 0, 0, 637, - 0, 0, 0, 0, 394, 0, 0, 0, 312, 0, - 310, 311, 0, 248, 182, 282, 638, 639, 284, 283, - 0, 0, 454, 483, 0, 274, 275, 792, 791, 0, - 272, 271, 269, 270, 268, 267, 266, 264, 265, 263, - 262, 261, 256, 257, 258, 259, 260, 255, 254, 0, - 0, 0, 0, 0, 241, 229, 245, 0, 0, 228, - 581, 581, 0, 581, 578, 677, 0, 0, 0, 0, - 0, 339, 0, 343, 0, 345, 0, 686, 685, 682, - 681, 830, 0, 0, 701, 0, 0, 834, 369, 834, - 688, 581, 800, 585, 687, 683, 0, 0, 581, 0, - 393, 0, 0, 0, 0, 171, 175, 286, 169, 162, - 160, 169, 0, 486, 0, 485, 213, 212, 211, 210, - 436, 0, 0, 25, 0, 0, 657, 0, 39, 45, - 44, 56, 53, 54, 0, 49, 0, 0, 687, 683, - 0, 821, 581, 824, 826, 0, 822, 823, 55, 493, - 0, 159, 169, 169, 157, 170, 299, 18, 20, 70, - 90, 417, 146, 638, 639, 134, 148, 147, 0, 127, - 130, 0, 640, 0, 0, 0, 0, 713, 707, 450, - 0, 125, 590, 587, 806, 820, 809, 0, 588, 805, - 819, 808, 804, 833, 816, 827, 817, 810, 815, 836, - 0, 421, 604, 603, 420, 176, 831, 0, 831, 512, - 513, 515, 831, 518, 517, 581, 800, 548, 541, 553, - 542, 429, 429, 538, 539, 536, 537, 581, 800, 282, - 638, 0, 416, 118, 544, 554, 559, 560, 416, 416, - 0, 0, 416, 116, 545, 557, 416, 533, 534, 535, - 429, 531, 479, 0, 97, 0, 0, 0, 0, 103, - 0, 834, 800, 834, 800, 842, 841, 843, 287, 323, - 224, 226, 329, 330, 0, 0, 0, 0, 311, 314, - 0, 0, 0, 0, 249, 0, 315, 317, 319, 0, - 0, 0, 0, 230, 247, 0, 0, 674, 672, 0, - 675, 585, 236, 0, 0, 179, 346, 0, 0, 0, - 684, 680, 691, 581, 700, 698, 699, 689, 834, 0, - 696, 0, 635, 636, 0, 335, 167, 169, 169, 165, - 577, 575, 474, 0, 435, 433, 282, 0, 23, 31, - 664, 57, 52, 59, 63, 686, 682, 687, 683, 0, - 597, 0, 581, 688, 61, 155, 153, 69, 0, 132, - 0, 136, 0, 138, 0, 140, 0, 767, 0, 203, - 715, 0, 708, 709, 0, 451, 687, 683, 0, 306, - 0, 633, 828, 0, 0, 837, 838, 0, 0, 418, - 174, 522, 0, 521, 831, 831, 831, 0, 834, 0, - 543, 447, 447, 834, 0, 0, 0, 429, 429, 0, - 429, 429, 0, 429, 0, 447, 467, 581, 289, 288, - 290, 581, 100, 0, 106, 0, 0, 0, 0, 0, - 0, 457, 0, 455, 252, 273, 243, 242, 240, 231, - 0, 244, 246, 673, 671, 678, 676, 0, 237, 0, - 0, 338, 342, 344, 834, 694, 581, 695, 163, 161, - 471, 0, 438, 440, 686, 682, 602, 688, 133, 131, - 0, 0, 0, 0, 445, 0, 0, 282, 638, 639, - 716, 729, 732, 735, 740, 0, 0, 0, 0, 0, - 0, 0, 0, 283, 761, 769, 0, 788, 765, 764, - 763, 0, 724, 0, 0, 394, 0, 703, 722, 728, - 702, 723, 762, 0, 710, 452, 0, 636, 818, 812, - 813, 811, 0, 835, 422, 0, 0, 0, 0, 524, - 523, 516, 113, 581, 547, 551, 115, 581, 429, 429, - 568, 447, 282, 638, 0, 555, 561, 562, 416, 416, - 447, 447, 0, 447, 558, 546, 0, 834, 834, 581, - 581, 0, 0, 0, 0, 456, 0, 0, 232, 233, - 679, 347, 288, 697, 834, 0, 135, 137, 139, 774, - 768, 772, 0, 711, 706, 206, 781, 783, 784, 0, - 0, 720, 0, 0, 0, 747, 749, 750, 751, 0, - 0, 0, 0, 0, 0, 0, 782, 0, 365, 789, - 0, 725, 363, 416, 0, 364, 0, 416, 0, 0, - 0, 204, 705, 704, 726, 760, 759, 311, 839, 419, - 519, 520, 514, 834, 834, 567, 564, 566, 0, 0, - 429, 429, 429, 563, 565, 550, 469, 0, 468, 463, - 96, 102, 834, 834, 325, 326, 327, 328, 458, 0, - 234, 693, 439, 0, 773, 446, 195, 0, 717, 730, - 719, 0, 0, 0, 0, 0, 743, 0, 752, 0, - 758, 40, 145, 35, 145, 0, 36, 770, 0, 361, - 362, 0, 0, 0, 360, 205, 720, 112, 114, 429, - 429, 573, 447, 447, 0, 0, 481, 99, 105, 580, - 0, 775, 202, 0, 394, 0, 720, 0, 733, 721, - 707, 786, 736, 0, 0, 0, 0, 748, 757, 41, - 37, 0, 0, 727, 572, 570, 569, 571, 466, 465, - 459, 87, 90, 0, 0, 0, 196, 416, 718, 207, - 731, 209, 0, 787, 0, 785, 741, 745, 744, 771, - 793, 0, 0, 464, 779, 780, 776, 429, 707, 193, - 0, 0, 199, 0, 198, 720, 0, 0, 0, 794, - 795, 753, 462, 0, 461, 0, 208, 0, 734, 737, - 742, 746, 0, 793, 0, 0, 460, 200, 194, 0, - 0, 0, 754, 796, 0, 0, 797, 0, 0, 201, - 738, 798, 0, 755, 0, 0, 0, 739, 799, 756 -}; - -/* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int16 yydefgoto[] = -{ - -1, 1, 438, 3, 439, 167, 711, 333, 183, 5, - 6, 39, 674, 375, 1308, 675, 772, 1309, 1310, 395, - 1414, 679, 43, 773, 404, 685, 941, 686, 687, 688, - 45, 174, 175, 46, 457, 186, 182, 47, 48, 789, - 1072, 795, 1074, 49, 775, 776, 187, 188, 458, 718, - 979, 980, 654, 981, 236, 50, 963, 962, 701, 698, - 1138, 1137, 921, 918, 138, 961, 51, 238, 52, 915, - 567, 334, 335, 336, 337, 1311, 1581, 1478, 1583, 1523, - 1614, 1180, 1560, 1578, 369, 907, 338, 1249, 862, 606, - 869, 339, 340, 370, 342, 360, 54, 257, 680, 420, - 156, 55, 56, 343, 562, 344, 345, 346, 347, 459, - 348, 1312, 498, 628, 349, 1313, 58, 219, 691, 350, - 220, 540, 221, 199, 212, 62, 481, 499, 1335, 752, - 1198, 200, 213, 63, 511, 753, 64, 65, 670, 671, - 672, 1285, 464, 832, 833, 1551, 1552, 1516, 1458, 1366, - 66, 658, 363, 1226, 1459, 1093, 924, 67, 68, 69, - 70, 71, 244, 245, 72, 73, 506, 1019, 1020, 1021, - 1022, 247, 508, 509, 786, 780, 781, 782, 1044, 1054, - 1045, 1355, 1046, 1047, 1356, 1357, 655, 656, 607, 897, - 352, 467, 468, 193, 201, 75, 76, 77, 202, 144, - 145, 159, 79, 134, 353, 354, 355, 81, 356, 83, - 1024, 125, 126, 127, 516, 107, 84, 357, 874, 875, - 892, 631, 1316, 1317, 1181, 1182, 1183, 722, 1318, 988, - 1319, 1399, 1526, 1481, 1482, 1320, 1321, 1506, 1400, 1527, - 1401, 1562, 1402, 1564, 1609, 1624, 1403, 1585, 1536, 1586, - 1487, 460, 719, 1283, 1322, 1417, 1541, 1390, 1391, 1473, - 1555, 1525, 1521, 1323, 1532, 1420, 839, 1588, 1589, 1590, - 1622, 738, 739, 1008, 1194, 1331, 740, 741, 742, 1004, - 743, 150, 1006, 745, 1196, 1197, 534, 86, 87 -}; - -/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -#define YYPACT_NINF -1415 -static const yytype_int16 yypact[] = -{ - 149, 229, 265, -1415, -1415, -1415, 10477, -1415, 58, 39, - 219, 332, 138, 239, -1415, -1415, 744, -1415, 253, 285, - 295, -1415, -1415, -1415, 1130, 1379, 889, 352, -1415, 620, - 393, -1415, 1802, 1802, -1415, 4055, -1415, 10477, 406, -1415, - -1415, 470, -1415, 210, 10535, -1415, -1415, 497, 383, 526, - 516, 571, -1415, -1415, -1415, -1415, 384, 2547, -1415, 5045, - -1415, 2065, 311, -1415, 619, -1415, -1415, 1389, 462, -1415, - -1415, -1415, -1415, 595, 3778, -1415, -1415, -1415, 564, -1415, - -1415, -1415, 697, -1415, -1415, 841, 7934, 585, -1415, -1415, - 9553, -1415, 9553, -1415, 9553, -1415, -1415, -1415, 219, 332, - 624, 393, 574, 658, 571, -1415, 589, -1415, 841, 9638, - 9638, 650, -1415, -1415, -1415, -1415, -1415, 82, 657, 636, - 653, 696, 673, 704, -1415, -1415, 1705, -1415, 1050, 219, - 332, -1415, 624, 393, -1415, 1619, 966, 754, 10828, -1415, - 9553, 9553, 4289, 3931, -1415, -1415, 807, 925, 3931, -1415, - 1205, 4309, 4309, 4055, 662, 722, -1415, 745, 737, 734, - 743, -1415, -1415, 849, -1415, 759, -1415, 10593, -1415, -1415, - 352, 5201, 774, -1415, -1415, -1415, 497, 625, 10886, 467, - 814, -1415, -1415, 784, 619, 878, 94, 519, 825, -1415, - -1415, 793, 192, -1415, -1415, 4422, 4422, 4542, 564, 893, - -1415, -1415, 567, -1415, -1415, 1098, -1415, -1415, -1415, -1415, - -1415, 2065, 1000, -1415, 619, 564, -1415, -1415, -1415, 2404, - 2065, -1415, 619, -1415, 625, -1415, -1415, -1415, -1415, -1415, - -1415, -1415, -1415, -1415, -1415, 833, -1415, 571, -1415, 619, - 1770, 1242, -1415, -1415, 846, 846, -1415, -1415, -1415, 1183, - 841, -1415, 828, 1592, -1415, 326, -1415, -1415, -1415, -1415, - -1415, 4611, -1415, -1415, 501, -1415, 824, 832, -1415, -1415, - -1415, -1415, 853, -1415, -1415, -1415, -1415, -1415, -1415, -1415, - -1415, -1415, -1415, -1415, -1415, -1415, -1415, -1415, -1415, -1415, - -1415, -1415, -1415, -1415, 826, -1415, -1415, -1415, 1183, 3778, - 1030, -1415, -1415, 856, -1415, -1415, 10239, 10324, 10409, 10409, - -1415, -1415, -1415, -1415, -1415, 863, 886, 891, 901, 905, - 624, 999, 9723, 1265, 10409, -1415, -1415, 10409, 10409, -1415, - -1415, 3227, -1415, 10409, 419, 903, -1415, 10409, -1415, 9808, - -1415, 11139, 353, 1941, 2775, 9893, -1415, 979, 3627, -1415, - 1035, 2243, 2707, -1415, 422, -1415, 1921, 2346, 419, 419, - 9553, 10828, -1415, 1265, 883, 1265, -1415, -1415, 890, 941, - 11072, 895, 897, 902, 1650, 759, -1415, -1415, -1415, -1415, - -1415, -1415, -1415, -1415, 657, 636, 653, 1265, 696, 673, - 939, 704, -1415, 961, -1415, 2113, 219, 332, -1415, -1415, - -1415, -1415, -1415, -1415, 6202, -1415, 625, 6328, 2214, -1415, - 705, 419, -1415, -1415, 616, -1415, 948, 951, -1415, -1415, - -1415, 3931, -1415, -1415, 3931, -1415, 919, -1415, -1415, -1415, - 737, 737, 737, -1415, -1415, -1415, 4611, 54, 922, 927, - -1415, -1415, -1415, -1415, 10828, -1415, 1072, 1101, -1415, -1415, - 849, -1415, 619, -1415, -1415, -1415, -1415, 96, -1415, -1415, - -1415, -1415, 7597, 9723, -1415, -1415, -1415, 9723, 932, -1415, - 6839, 121, 4874, -1415, 4874, -1415, 5823, 5823, 4542, 956, - -1415, 619, 625, -1415, 938, -1415, -1415, 5878, 2404, 2065, - 625, -1415, 619, -1415, -1415, 619, 2404, -1415, 1029, -1415, - 9553, 833, -1415, -1415, 1770, -1415, -1415, -1415, 3869, 68, - 1183, 619, -1415, -1415, 994, 1001, 1024, 1022, -1415, -1415, - -1415, -1415, 885, -1415, 444, 1002, 1005, -1415, -1415, 1183, - -1415, -1415, 822, -1415, -1415, 9553, 9723, 856, 3227, -1415, - 469, 3227, -1415, -1415, -1415, 9638, 3937, 3937, 3937, 3937, - 11117, -1415, -1415, -1415, -1415, 1010, 9984, 9984, 3227, 1016, - 222, 1021, 1079, 1033, -1415, -1415, -1415, -1415, 9553, -1415, - 7140, 3227, -1415, 9723, 9723, 7687, 9723, 9723, 9723, 9723, - 9723, 9723, 9723, 9723, 9723, 9723, 9723, 9723, 9723, 9723, - 9723, 9723, 9723, 9723, 9723, -1415, 9723, -1415, -1415, -1415, - -1415, 9723, 9723, -1415, -1415, -1415, 3641, 592, 542, 8293, - -1415, -1415, -1415, 1089, 1592, 1140, 594, 605, 644, 2005, - 925, -1415, 1370, 1370, -1415, 3036, 1040, 1064, 1122, -1415, - -1415, 641, 8844, 360, -1415, 1013, 841, -1415, -1415, 9723, - -1415, -1415, -1415, -1415, -1415, 109, 585, -1415, -1415, 419, - -1415, 625, 2642, -1415, 1108, 1117, -1415, -1415, 1265, 939, - -1415, 8028, 8118, -1415, -1415, -1415, -1415, -1415, -1415, -1415, - 169, -1415, 1097, 1086, 759, 2113, 1127, 9553, -1415, 1145, - -1415, -1415, 966, 1385, 1154, 329, 1143, 1149, -1415, -1415, - 2183, 10886, 2183, 4191, 1389, 5667, -1415, 1159, -1415, -1415, - -1415, -1415, -1415, -1415, -1415, -1415, 1116, 1121, -1415, 1165, - -1415, -1415, 497, -1415, -1415, -1415, -1415, 70, 752, 1168, - 1079, -1415, -1415, -1415, -1415, 7047, 11117, -1415, 941, 1128, - 11072, -1415, -1415, 1131, -1415, 1144, 299, 5377, 1147, -1415, - 237, 10652, 1191, 1201, 647, -1415, -1415, -1415, 4874, 4874, - -1415, 5878, -1415, 1211, -1415, -1415, 1162, 121, -1415, 2404, - -1415, -1415, 619, 1202, -1415, 2961, -1415, 907, 931, -1415, - 9723, 3137, -1415, 3137, 348, 348, 438, 652, 4748, 10710, - 5499, -1415, 174, 348, 1213, 619, 6087, -1415, 121, 10997, - 9553, 9553, -1415, 9553, 121, 10997, -1415, -1415, -1415, -1415, - -1415, -1415, 767, 767, 767, 419, 1172, 1174, 9208, 1122, - 1175, 1177, 1178, 1215, 3331, 1219, 1232, 1235, -1415, 1179, - -1415, -1415, 1203, -1415, -1415, 1253, 312, 603, 151, 437, - 9723, 1254, -1415, 1259, 1216, 11117, 11117, -1415, -1415, 1263, - 11157, 11174, 11190, 11205, 4770, 3406, 3812, 2123, 2123, 2123, - 1331, 1331, 1221, 1221, 1081, 1081, 1081, -1415, -1415, 1223, - 1224, 1226, 9723, 9638, -1415, 592, -1415, 7597, 9723, -1415, - -1415, -1415, 9723, -1415, -1415, 1241, 10409, 1231, 1260, 1271, - 1299, -1415, 9723, -1415, 9723, -1415, 9723, 1678, -1415, 1678, - -1415, 112, 1252, 1255, -1415, 1239, 3937, 121, -1415, 121, - 2316, -1415, 10997, 1251, 9026, 9026, 6261, 1256, 9808, 1258, - 737, 1894, 2346, 1042, 1261, -1415, -1415, -1415, -1415, -1415, - -1415, -1415, 9723, 1265, 1262, 1117, -1415, 11117, -1415, 11117, - 1650, 1264, 10069, -1415, 1267, 1310, -1415, 419, -1415, -1415, - -1415, -1415, -1415, 2881, 6202, -1415, 3937, 9553, 1900, 1900, - 3463, -1415, -1415, -1415, -1415, 1098, -1415, -1415, -1415, 989, - 9723, -1415, -1415, -1415, -1415, -1415, -1415, -1415, -1415, -1415, - 497, -1415, 657, 636, 653, -1415, 696, 673, 9723, 1319, - -1415, 667, 704, 728, 757, 1344, 1079, -1415, 66, -1415, - 49, -1415, -1415, -1415, -1415, -1415, -1415, 8935, -1415, -1415, - -1415, -1415, -1415, -1415, -1415, 1201, 1328, -1415, -1415, -1415, - 3937, -1415, -1415, -1415, 1340, -1415, -1415, 1326, -1415, 1360, - -1415, -1415, 578, -1415, -1415, -1415, 10997, 11117, -1415, 2477, - -1415, 619, 619, -1415, -1415, -1415, -1415, -1415, 10997, 524, - 781, 9723, 1029, -1415, 1362, -1415, -1415, -1415, 198, 366, - 697, 925, 377, 348, 1363, -1415, 423, -1415, -1415, -1415, - 619, -1415, -1415, 8361, -1415, 1322, 419, 419, 419, -1415, - 1329, 121, 10997, 121, 10997, -1415, -1415, -1415, -1415, -1415, - -1415, -1415, -1415, -1415, 1346, 1352, 1356, 1359, 1116, -1415, - 11005, 7597, 7233, 1343, -1415, 9723, -1415, -1415, -1415, 1347, - 1345, 1353, 3937, -1415, -1415, 1364, 255, 205, 205, 1357, - 205, -1415, -1415, 10409, 1447, 9553, -1415, 1365, 1366, 1371, - -1415, -1415, -1415, -1415, -1415, -1415, -1415, -1415, 121, 1372, - -1415, 1374, -1415, -1415, 1911, -1415, -1415, -1415, -1415, -1415, - 11117, -1415, -1415, 1358, -1415, -1415, 245, 1375, -1415, -1415, - -1415, -1415, -1415, -1415, -1415, 2851, 2851, 2966, 2966, 3463, - -1415, 1098, -1415, 3526, 11139, -1415, -1415, -1415, 1381, -1415, - 752, -1415, 9723, -1415, 9723, -1415, 9723, -1415, 1265, -1415, - -1415, 6637, 1437, -1415, 7323, -1415, 9117, 9117, 6745, 140, - 1387, 425, -1415, 7597, 7413, -1415, -1415, 259, 7597, -1415, - -1415, -1415, 9638, -1415, -1415, -1415, -1415, 1351, 121, 1388, - -1415, 1419, 1419, 121, 1390, 9723, 9723, 10916, 619, 5724, - 619, 619, 1210, 619, 5938, 1419, -1415, -1415, -1415, 1433, - -1415, -1415, -1415, 1397, -1415, 1399, 9723, 9723, 9723, 9723, - 7597, -1415, 1448, -1415, -1415, 11117, -1415, -1415, -1415, 569, - 1353, -1415, -1415, -1415, -1415, -1415, -1415, 1401, -1415, 1466, - 419, -1415, -1415, -1415, 121, -1415, -1415, -1415, -1415, -1415, - -1415, 9723, -1415, -1415, 2851, 2851, -1415, 3526, -1415, -1415, - 1407, 1408, 1410, 1428, -1415, 1107, 318, 1462, 837, 851, - -1415, -1415, -1415, -1415, -1415, 9723, 1474, 1477, 1478, 9293, - 451, 1265, 430, 656, -1415, -1415, 9383, 1530, -1415, -1415, - -1415, 1481, -1415, 5599, 10770, 4975, 6527, -1415, -1415, 1527, - -1415, -1415, -1415, 8454, -1415, -1415, 1443, 420, -1415, -1415, - -1415, -1415, 3937, -1415, -1415, 7597, 1444, 1449, 2961, -1415, - -1415, -1415, -1415, -1415, -1415, -1415, -1415, -1415, 10916, 10916, - -1415, 1419, 794, 869, 9723, -1415, -1415, -1415, 1029, 1029, - 1419, 1419, 885, 1419, -1415, -1415, 6395, 121, 121, -1415, - -1415, 1455, 1456, 1465, 1467, -1415, 7597, 9723, -1415, 569, - -1415, -1415, -1415, -1415, 121, 1468, -1415, -1415, -1415, -1415, - 1428, -1415, 1265, -1415, -1415, -1415, -1415, -1415, -1415, 792, - 792, 1079, 1453, 1463, 5091, -1415, -1415, -1415, -1415, 1496, - 9723, 1510, 1511, 1524, 1545, 1693, -1415, 1079, -1415, -1415, - 1487, -1415, -1415, 1029, 1120, -1415, 1141, 1029, 9468, 1157, - 324, -1415, -1415, -1415, -1415, -1415, -1415, 525, -1415, -1415, - -1415, -1415, -1415, 121, 121, -1415, -1415, -1415, 9723, 9723, - 10916, 619, 619, -1415, -1415, -1415, -1415, 8208, -1415, -1415, - -1415, -1415, 121, 121, -1415, -1415, -1415, -1415, -1415, 1480, - -1415, -1415, -1415, 1497, -1415, -1415, -1415, 9638, -1415, -1415, - -1415, 1583, 8750, 6949, 9638, 9723, -1415, 8562, -1415, 1544, - -1415, -1415, 1551, -1415, 1524, 1545, -1415, -1415, 849, -1415, - -1415, 10154, 10154, 7507, -1415, -1415, 1079, -1415, -1415, 10916, - 10916, -1415, 1419, 1419, 1500, 11027, 1513, -1415, -1415, -1415, - 11010, -1415, -1415, 1503, 190, 625, 1079, 8656, -1415, -1415, - 66, -1415, -1415, 1548, 1504, 11095, 8562, -1415, -1415, -1415, - -1415, 1428, 81, -1415, -1415, -1415, -1415, -1415, -1415, -1415, - -1415, 526, 497, 1505, 1506, 1079, -1415, 1029, -1415, -1415, - -1415, -1415, 811, -1415, 7777, -1415, -1415, -1415, -1415, 1428, - 1605, 1557, 193, -1415, -1415, -1415, -1415, 619, 66, -1415, - 9723, 1559, -1415, 1561, -1415, 1079, 8562, 1534, 51, 1570, - -1415, -1415, -1415, 96, -1415, 1569, -1415, 1526, -1415, -1415, - -1415, -1415, 9723, 1605, 1575, 1605, -1415, -1415, -1415, 7867, - 1531, 95, -1415, -1415, 7597, 1532, -1415, 1627, 1585, -1415, - -1415, -1415, 382, -1415, 8656, 1632, 1587, -1415, -1415, -1415 -}; - -/* YYPGOTO[NTERM-NUM]. */ -static const yytype_int16 yypgoto[] = -{ - -1415, -1415, 1652, -1415, -333, 1484, -394, 17, 4, 1663, - -1415, 1631, -1415, -1415, 114, -1415, 264, -1415, 275, -1415, - 256, 995, 20, 13, -1415, -1415, -638, -1415, -1415, 735, - 47, 1507, 1236, 1517, -706, 134, -175, -7, 148, -1415, - -1415, -1415, -1415, -1415, 911, -1415, -1415, -1415, -1415, -1415, - -1415, 521, 1146, -1415, -1415, -1415, -1415, -1415, -1415, -1415, - -1415, -1415, -1415, -1415, 1593, -582, 5825, 1454, -49, -602, - -101, -70, 1555, -538, -1415, 682, -1415, 300, -1415, -1394, - -1415, -1397, 77, -1415, 1218, 1294, -272, 452, -535, -1415, - -829, 1686, 7, 1552, 3607, 1411, -329, -72, -76, 680, - -141, -67, 91, -1415, -1415, -1415, -328, -1415, -155, -1415, - -1415, -1230, -50, -340, 4852, 136, 910, -113, 79, 100, - -205, -6, -146, -168, -174, 14, -23, 120, -1415, -370, - -1415, -1415, -1415, -1415, -1415, 211, 1306, 8, -1415, 785, - -1415, -1415, -1097, -379, 986, -1415, -1415, -1415, -1415, -1415, - -18, -1415, -1415, -1415, -1415, -1415, 797, -352, -1415, -1415, - -1415, -1415, -1415, -1415, -1415, -1415, 1472, -1415, 380, 512, - -1415, -1415, -1415, -1415, -1415, 937, -671, -1415, -1415, -1415, - -1415, -1415, -1415, 947, -1415, 504, 1071, 808, 1133, 4227, - 45, 19, -457, 1538, 1269, -669, -1415, 2, -1415, 820, - 4043, -149, 171, -104, 4531, 1396, -1415, 4888, 2552, 73, - -20, -116, -1415, 1607, -81, -1415, 4712, 3373, -31, -1415, - 1976, -1415, -1415, 435, -1415, -1415, 570, 162, -441, -1415, - -1415, -1415, -1415, -1358, -1415, -1187, -1388, -1415, -1415, -1415, - -1415, -1415, -1415, -1415, -1415, -1415, -1415, -1415, -1415, -1415, - -1415, 187, -1415, -1415, -1415, -1415, -1415, 224, -1324, -1415, - -1415, -47, -1415, -1415, -1415, -1415, -1414, 160, -1415, 161, - -1415, -678, -585, 762, -1415, -1415, -1415, -1415, -390, -1415, - -384, -443, -1415, 1611, 440, -1415, -214, -1415, -232 -}; - -/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule which - number is the opposite. If zero, do what YYDEFACT says. - If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -831 -static const yytype_int16 yytable[] = -{ - 61, 445, 422, 425, 447, 124, 489, 198, 437, 446, - 38, 633, 394, 986, 696, 258, 723, 434, 105, 44, - 697, 517, 358, 37, 359, 184, 180, 756, 642, 643, - 824, 61, 402, 255, 539, 542, 1103, 176, 61, 300, - 893, 38, 673, 223, 510, 393, 916, 893, 712, 983, - 44, 74, 694, 211, 37, 251, 958, 44, 179, 400, - 401, 171, 765, 399, 172, 611, 1474, 572, 249, 1533, - 863, 411, 226, 494, 497, 192, 1418, 143, 148, 258, - 298, 611, 74, 727, 351, 59, 351, 262, 351, 74, - 1534, 173, 611, 529, 1529, 454, 1023, 720, 488, 1178, - 1028, 965, 1030, 351, 351, 784, 60, 496, 1184, 1057, - 366, 1065, 90, 1603, 1344, 1345, 59, 1070, 88, 964, - 40, 822, 761, 178, 994, 646, 157, 198, 1365, 1433, - 520, 299, 408, 1563, 351, 351, 1436, 60, 258, 1561, - 376, 787, 57, 1570, 60, 377, 529, 310, 1543, -2, - 226, 40, -357, 180, 721, 260, 455, 1617, 1185, 1604, - 442, 61, 709, 28, 176, 61, 226, 89, 1558, 895, - 1584, 995, 211, 57, 996, 1179, 192, 785, 971, 260, - 177, 1596, 744, 74, 44, 179, 297, -303, 171, 1571, - 456, 172, 492, 223, 1592, 1615, 421, 424, 217, 218, - 809, 223, 223, 1618, 16, 139, 160, 210, 260, 129, - 130, 95, 74, -145, 520, 524, 74, 407, 173, 260, - 823, 192, 226, -366, 1129, 17, 22, 1600, 930, 4, - 226, 223, -303, -303, 1058, 25, 1561, 621, 60, 469, - 472, 474, 157, 157, 157, 1474, 59, 226, -296, 999, - 178, -357, 262, 1531, 1447, 455, -366, 647, 648, 28, - -366, 132, 133, 1453, 1454, -3, 1455, 60, 165, 595, - 41, 60, 617, 91, 406, 870, 616, 931, 260, 987, - 223, 42, 808, 1059, 470, 871, 405, 96, 157, 456, - 649, 681, 92, 249, -366, 717, 1000, 608, 872, 1001, - 1537, 41, 621, 57, 1271, 1151, 676, 177, 166, 702, - 703, 994, 42, 260, 596, 543, 544, 643, 1332, 969, - 970, 893, 160, 160, 160, 351, 210, 422, 425, 1102, - -296, 552, 943, 223, 553, 554, 1136, 260, 298, 1139, - 564, 934, 494, 497, 569, 109, 249, 808, 1209, 1568, - 494, 696, 610, 1272, 351, 652, 699, 1005, 995, 262, - 1214, 996, -830, 1252, 497, 893, 91, 1333, 160, -581, - 224, 225, -581, 518, -142, 17, 759, 110, 1394, -416, - 1165, 1166, 517, 497, 1394, 92, 93, 111, 944, 299, - 223, -367, 1057, 17, 1233, 451, 1235, 633, 693, 1601, - 595, 211, -121, 945, 17, 94, 74, 898, -416, 1154, - 17, -416, 893, 1200, -416, 1546, 1547, 684, 519, -581, - 1378, -581, -581, -581, -367, 137, 180, 1395, -367, 260, - 763, -585, -305, 1505, -581, -121, -581, 714, 61, -121, - 407, 1625, -416, -416, 297, 596, 1131, -305, -119, 695, - 17, -305, -581, -581, 97, 112, 113, -416, 179, 777, - 226, 60, -367, 1033, 737, 805, 141, -305, -581, 638, - 223, 223, -627, -121, 131, 762, -585, 191, 223, -305, - -305, -119, -305, -305, 28, -119, 1413, 260, 1104, 74, - 1626, 798, 223, 565, 351, 566, 1034, 651, 163, -144, - 1035, 983, 61, 226, 692, 10, 522, 114, 115, 650, - 141, 223, -305, -305, 639, 695, 621, -627, -627, -119, - 242, 748, 749, 178, 243, 771, 224, 448, -305, 351, - 164, 1410, 351, -627, 1036, 351, 799, 968, 1023, 351, - 814, 814, 814, 814, 60, 1177, 129, 130, 917, 365, - 1470, 185, 351, 74, 696, 1268, 1269, 132, 133, 608, - 697, 808, 351, 552, 553, 351, 461, 157, 157, 157, - 692, 681, -305, 1201, 893, 1203, 189, 260, 940, 1207, - 177, 523, 462, 642, 643, 1205, 1215, 779, 1075, 1076, - 1077, 17, 694, 10, 11, -416, 28, 90, 132, 133, - 298, 919, 754, 893, 181, 260, 939, 937, 60, 529, - 760, 463, 870, 494, -585, 1206, 866, -305, -305, 693, - 129, 130, 871, -416, -416, 190, 737, -416, 9, 10, - 11, 12, 867, -299, 223, 872, 572, 365, 262, 866, - 951, 881, 956, 957, 778, 132, 133, 160, 160, 160, - 20, 299, 883, 246, 1257, 867, 774, 93, 301, -585, - 484, 868, 1377, 124, 365, -143, 23, 887, 889, 1023, - 695, 351, 132, 133, 139, 223, 94, 695, 139, 28, - 646, 29, 30, 362, 868, 211, 882, 957, 901, 249, - 379, 885, 260, 140, 1009, 195, 523, 884, 984, 1037, - 9, 10, 252, 12, 1078, 196, 297, 380, 260, 92, - 34, 378, 1241, 1243, 1171, 155, 364, 197, 1416, 223, - 1066, 1067, 777, 1068, 777, 692, 94, 382, 1043, 141, - 777, 777, 692, 902, 903, 693, 886, 777, 23, 1010, - 302, 223, 374, 12, 1038, 253, 141, 97, 98, 99, - 381, 1031, 1032, 29, 30, 972, 973, 974, 383, 1172, - 1060, 1338, 1339, 1340, 568, 61, 809, 61, 20, 434, - -296, 129, 130, 211, 61, 1173, 520, 254, 23, 565, - 61, 566, 34, 693, 351, 351, 695, 351, 771, 693, - 771, 368, 372, 428, 429, 1167, 223, 771, 28, 975, - 100, 101, 102, 771, 1175, 1243, 28, 430, 976, 977, - 9, 129, 130, 12, 1328, 1330, 74, 431, 74, 1334, - 1174, 28, 34, 132, 133, 74, 129, 130, 403, 432, - 427, 74, 423, 426, 695, 91, 1150, 530, 191, 1476, - 695, 692, 435, 1216, 978, 10, 11, 531, 23, 1176, - 779, -622, 779, 149, 92, 253, 1448, 351, 1579, 779, - 305, 1375, 1106, 29, 30, 779, 1593, 90, -8, 394, - 365, 60, 166, 60, 449, 512, 450, 155, 132, 133, - 60, 453, 93, 1112, 1477, 465, 60, 254, 258, 692, - 814, 91, 34, 129, 130, 692, 693, 132, 133, 1397, - 737, 94, 254, 1580, 466, 93, 500, 778, 505, 1029, - 92, 552, 553, 1398, 262, 527, 778, 525, 226, 774, - 513, 774, 778, 91, 94, 526, 1042, 1052, 774, 129, - 130, 1449, 796, 131, 774, 129, 130, 528, 693, 93, - 814, 351, 92, 28, 693, 132, 133, 695, 536, 887, - 889, 695, 482, 483, 1025, 545, 1439, 684, 94, 546, - 1480, 93, 568, 413, 547, 1228, 1229, 1230, 415, 302, - 396, 397, 12, 1014, 548, 809, 1497, 797, 549, 1043, - 94, 132, 133, 258, 260, 28, 260, 132, 133, 695, - 611, 737, 657, 1155, 1156, 695, 1062, 1468, 660, 1026, - 661, 255, 692, 663, 814, 664, 692, 23, 422, 425, - 665, 561, 677, 559, 777, 678, 149, 10, 11, 1218, - 693, 92, 320, 30, 94, 1220, 1221, 706, 260, 1218, - 1223, -7, 693, 1221, 129, 130, 710, 422, 425, 129, - 130, 157, 695, 732, 692, 1260, 10, 11, -53, 755, - 692, 34, -53, 118, 119, 120, 17, 61, -184, 490, - 491, 365, 500, -53, 750, 1480, 693, 790, 693, 132, - 133, 695, 141, -184, 791, -184, 1253, 1254, 792, 1256, - 771, 521, 621, 695, 28, 1480, 132, 133, 157, 28, - 365, 132, 133, 254, 258, 793, 814, 692, 132, 133, - 530, 9, 10, 11, 12, 622, 121, 122, 74, 351, - 531, 423, 707, 800, 1576, 623, 801, 695, 818, 695, - 1258, 160, 523, 260, 820, 624, 692, 625, 626, 821, - 696, 482, 715, 97, 112, 113, 1554, 721, 692, 23, - 1426, 823, 779, 878, 1480, 1424, 253, 1429, 880, 731, - 984, 894, 723, 693, 29, 30, 896, 423, 426, 1382, - 490, 716, 103, 60, 593, 594, 1392, 1393, 160, 898, - 117, 922, 692, 524, 692, 1315, 923, 1042, 254, 482, - 1499, 936, 737, 34, 809, 1307, 114, 115, 116, 932, - 22, 217, 218, 552, 553, 933, 351, 16, 1306, 778, - 490, 1500, 1274, 1275, 695, 938, 946, 260, 97, 416, - 417, 774, 947, 235, 129, 1362, 482, 1504, 561, 22, - 559, 561, 960, 559, -299, 967, 74, 811, 25, 966, - 455, 1274, 1275, 695, 260, 1619, 991, 423, 819, 992, - 559, 704, 1211, 1212, 705, 97, 98, 99, 157, 157, - 157, 561, 993, 559, -829, 998, 708, 838, 365, 692, - 1314, 114, 101, 1423, 1007, 1423, 132, 133, 97, 112, - 113, 1225, 390, 1012, 1011, 1061, 1015, 157, 157, 157, - 1079, 60, 1080, 1081, 861, 1082, 1083, 1088, 692, 1084, - 523, 877, 413, 1085, 415, 260, 418, 223, 100, 101, - 1315, 590, 591, 592, 593, 594, 1086, 521, 211, 1087, - 1315, 1089, 909, 564, 690, -141, 1091, 1315, 1092, 529, - 1307, 114, 115, 1306, 1094, 1095, 814, 1307, 160, 160, - 160, 1096, 1097, 1306, 1111, 1451, 1452, 1098, 142, 142, - 1306, 158, 1113, 1542, 1115, 1114, 1116, 118, 973, 974, - 1124, 74, 422, 425, 118, 973, 974, 160, 160, 160, - 1122, 74, 1130, 1123, 1132, 214, 1133, 222, 74, 1135, - 1149, 1142, 1145, 239, 129, 130, 1148, 1573, 1170, 15, - 690, 1017, 118, 119, 120, 1314, 501, 503, 384, 385, - 386, 1193, 97, 98, 99, 1314, 227, 228, 229, 515, - 121, 122, 1314, 1199, 492, 28, 60, 121, 122, 588, - 589, 590, 591, 592, 593, 594, 60, 621, 1202, 1204, - 20, 1219, 1224, 60, 28, 230, 132, 133, 1350, 1351, - 1227, 1360, 1361, 28, 1363, 121, 122, 1231, 1236, 28, - 622, 388, 389, 28, 1237, 100, 101, 231, 1238, 142, - 623, 1239, 1244, 1247, 142, 1259, 1246, 158, 158, 158, - 624, 1248, 625, 626, 473, 475, 479, 1270, 1255, 551, - 1178, 1524, 1251, 1261, 1262, 1557, 1315, 1315, 1524, 1263, - 1266, 1315, 462, 1273, 214, 1267, 1307, -664, 909, 1278, - 452, 1307, 232, 233, 234, 1327, 1343, 351, 1347, 1306, - 1306, 142, 142, 158, 1306, 1369, 223, 1370, 552, 553, - 1376, 659, 1380, 1381, 693, 1386, 1387, 222, 1388, 157, - 669, 1315, 299, 1389, 1396, 495, 222, 74, 74, 299, - 1315, 1307, 74, 659, 1577, 690, 1405, 1406, 1407, 1419, - 1307, 1421, 690, 1434, 1306, 1483, 748, 749, 97, 112, - 113, 1437, 1440, 1306, 1109, 1484, 1488, 1441, 1524, 1445, - 1446, 1314, 1314, 1464, 1465, 695, 1314, 142, 704, 705, - 1490, 708, 74, 1466, 377, 1467, 1472, 297, 1491, 1498, - 1315, 74, 60, 60, 297, 423, 819, 60, 559, 1520, - 1307, 1519, 157, 157, 157, 97, 112, 113, 514, 160, - 1528, 1492, 115, 1306, 1538, 1539, 1314, 1548, 1565, 299, - 1550, 1556, 1566, 1574, 1575, 1314, 1587, 1591, 1315, 1598, - 692, 1599, 302, 396, 397, 12, 1602, 60, 1307, 1605, - 155, 74, 1607, 23, 1608, 1612, 60, 158, 1621, 1616, - 1620, 1306, 341, 1628, 341, 1623, 341, 1629, 114, 115, - 764, 690, 2, 97, 112, 113, 444, 666, 667, 668, - 23, 1511, 1512, 1513, 297, 1314, 7, 253, 162, 74, - 935, 1495, 160, 160, 160, 320, 30, 1190, 443, 1152, - 713, 728, 129, 130, 441, 1572, 60, 248, 728, 361, - 1053, 1279, 341, 341, 502, 410, 97, 112, 113, 690, - 1479, 1627, 1379, 1314, 34, 690, 114, 115, 384, 385, - 386, 990, 535, 214, 222, 1144, 831, 507, 1442, 1341, - 1544, 1545, 1143, 1063, 60, 621, 1055, 142, 1364, 925, - 142, 1141, 28, 392, 132, 133, 158, 158, 158, 865, - 485, 746, 142, 747, 618, 473, 475, 479, 622, 1494, - 115, 1432, 1324, 387, 728, 1606, 758, 729, 623, 1594, - 879, 388, 389, 1611, 735, 1569, 1613, 1192, 624, 149, - 625, 626, 1438, 97, 98, 99, 0, 0, 142, 0, - 142, 0, 158, 158, 158, 0, 0, 452, 1595, 0, - 0, 0, 0, 142, 495, 222, 0, 0, 452, 0, - 0, 0, 495, 0, 0, 9, 129, 130, 12, 0, - 0, 15, 690, 0, 728, 0, 690, 452, 365, 728, - 0, 0, 0, 0, 0, 0, 100, 101, 0, 942, - 806, 0, 0, 20, 0, 0, 0, 0, 423, 426, - 959, 0, 0, 23, 158, 0, 0, 158, 0, 0, - 728, 0, 0, 0, 690, 0, 28, 728, 29, 30, - 690, 0, 158, 158, 158, 0, 0, 423, 1326, 0, - 559, 831, 32, 0, 550, 0, 0, 158, 0, 0, - 0, 0, 33, 0, 1336, 0, 0, 34, 0, 0, - 859, 0, 0, 0, 35, 860, 0, 302, 10, 11, - 12, 0, 0, 9, 10, 11, 12, 690, 0, 15, - 0, 0, 341, 0, 302, 10, 11, 12, 1371, 1372, - 1373, 1374, 0, 0, 302, 10, 11, 12, 0, 0, - 0, 20, 0, 914, 0, 23, 690, 0, 910, 0, - 0, 23, 253, 0, 0, 0, 0, 621, 690, 0, - 320, 30, 23, 0, 28, 0, 29, 30, 222, 253, - 0, 0, 23, 0, 0, 0, 0, 320, 30, 253, - 948, 0, 0, 0, 254, 413, 415, 320, 30, 34, - 949, 1409, 690, 521, 690, 34, 0, 0, 597, 0, - 624, 523, 950, 626, 0, 0, 34, 214, 0, 222, - 239, 0, 0, 0, 0, 0, 34, 0, 302, 129, - 130, 12, 0, 0, 726, 730, 0, 746, 747, 0, - 758, 0, 730, 0, 0, 0, 728, 598, 599, 0, - 0, 0, 600, 601, 602, 603, 627, 627, 627, 0, - 0, 0, 0, 222, 0, 0, 23, 1048, 0, 0, - 0, 0, 341, 253, 142, 142, 0, 142, 0, 1469, - 0, 320, 30, 0, 0, 495, 0, 0, 452, 690, - 0, 0, 216, 217, 218, 0, 669, 0, 0, 16, - 728, 728, 0, 0, 0, 214, 728, 341, 730, 942, - 34, 452, 1489, 0, 704, 705, 20, 708, 690, 0, - 728, 22, 728, 0, 728, 0, 0, 0, 1190, 0, - 25, 0, 0, 0, 158, 0, 302, 396, 397, 12, - 341, 0, 726, 0, 0, 835, 836, 0, 840, 841, - 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, - 852, 853, 854, 855, 856, 857, 858, 0, 730, 0, - 728, 0, 0, 730, 23, 0, 1099, 1100, 0, 1522, - 0, 0, 1105, 0, 0, 838, 1522, 28, 0, 320, - 30, 0, 0, 0, 0, 0, 1117, 0, 1118, 0, - 1119, 0, 423, 1326, 730, 559, 9, 10, 11, 12, - 0, 730, 0, 0, 0, 0, 728, 0, 34, 586, - 587, 588, 589, 590, 591, 592, 593, 594, 0, 0, - 158, 158, 910, 927, 929, 728, 0, 473, 475, 479, - 0, 216, 217, 218, 23, 0, 1147, 0, 16, 341, - 621, 0, 0, 0, 0, 0, 0, 28, 1242, 29, - 30, 0, 0, 0, 0, 20, 1522, 129, 130, 239, - 22, 217, 218, 948, 142, 142, 910, 16, 0, 25, - 0, 0, 1597, 949, 0, 0, 479, 0, 34, 0, - 0, 0, 1168, 624, 700, 950, 626, 726, 0, 22, - 0, 0, 0, 0, 1610, 0, 0, 0, 25, 0, - 621, 838, 0, 0, 0, 0, 0, 28, 1048, 132, - 133, 0, 0, 910, 0, 0, 0, 0, 627, 627, - 0, 627, 0, 622, 0, 0, 0, 0, 908, 0, - 129, 130, 1027, 623, 1284, 520, 630, 634, 637, 0, - 1242, 0, 0, 624, 0, 632, 626, 452, 452, 0, - 0, 0, 341, 341, 0, 341, 0, 0, 0, 640, - 10, 11, 12, 0, 0, 0, 0, 0, 0, 0, - 730, 0, 0, 621, 0, 0, 452, 0, 1013, 0, - 28, 0, 132, 133, 0, 0, 627, 0, 627, 627, - 0, 627, 1090, 0, 310, 641, 622, 23, 0, 0, - 728, 0, 728, 0, 728, 0, 623, 0, 0, 1064, - 28, 0, 132, 133, 0, 1069, 624, 0, 625, 626, - 0, 493, 217, 218, 730, 730, 0, 0, 16, 726, - 730, 0, 0, 627, 746, 747, 473, 475, 479, 0, - 690, 0, 758, 0, 730, 20, 730, 0, 730, 0, - 22, 0, 0, 0, 0, 0, 1411, 1412, 0, 25, - 0, 0, 0, 0, 0, 473, 475, 479, 0, 0, - 0, 142, 142, 158, 158, 910, 1280, 0, 1281, 142, - 1282, 0, 0, 0, 1140, 0, 0, 0, 0, 0, - 1039, 1040, 11, 12, 730, 0, 0, 0, 1358, 728, - 0, 0, 158, 158, 910, 0, 0, 0, 0, 341, - 627, 0, 0, 0, 0, 0, 0, 0, 1125, 0, - 1126, 0, 1164, 0, 0, 0, 0, 0, 23, 0, - 0, 0, 0, 452, 452, 0, 452, 452, 0, 452, - 730, 28, 0, 29, 30, 0, 0, 1210, 1475, 1041, - 0, 0, 0, 746, 747, 0, 758, 195, 0, 730, - 9, 10, 11, 12, 0, 0, 0, 196, 82, 0, - 1493, 1496, 34, 0, 0, 1385, 0, 0, 106, 197, - 0, 0, 0, 627, 0, 627, 0, 0, 135, 0, - 142, 142, 0, 142, 146, 146, 627, 146, 23, 82, - 908, 908, 908, 1217, 0, 0, 82, 0, 888, 890, - 0, 28, 0, 29, 30, 0, 0, 194, 0, 205, - 0, 82, 0, 0, 0, 0, 0, 195, 0, 240, - 214, 222, 0, 0, 0, 0, 106, 196, 0, 0, - 0, 0, 34, 0, 627, 627, 627, 264, 106, 197, - 0, 1540, 0, 726, 726, 0, 728, 1245, 0, 216, - 217, 218, 0, 0, 452, 452, 16, 0, 0, 0, - 106, 0, 0, 0, 0, 0, 953, 341, 630, 634, - 0, 637, 0, 20, 0, 0, 0, 0, 22, 0, - 0, 0, 1232, 908, 1234, 0, 0, 25, 135, 0, - 82, 0, 0, 0, 146, 146, 0, 479, 0, 414, - 146, 0, 920, 146, 146, 146, 0, 0, 0, 0, - 0, 10, 11, 634, 0, 14, 248, 0, 0, 82, - 0, 16, 0, 82, 730, 0, 730, 0, 730, 205, - 82, 0, 0, 0, 158, 18, 726, 19, 0, 1265, - 0, 0, 0, 22, 0, 726, 726, 205, 205, 205, - 726, 0, 25, 0, 621, 0, 452, 452, 452, 0, - 0, 28, 0, 132, 133, 0, 0, 1348, 1349, 0, - 473, 475, 479, 0, 0, 0, 205, 622, 0, 10, - 11, 0, 0, 14, 15, 0, 0, 623, 0, 16, - 634, 0, 726, 504, 0, 0, 0, 624, 0, 625, - 626, 0, 106, 18, 0, 19, 0, 158, 158, 158, - 0, 22, 0, 146, 0, 452, 452, 0, 0, 1342, - 25, 0, 0, 730, 1346, 0, 0, 0, 0, 28, - 0, 132, 133, 604, 0, 0, 0, 0, 0, 0, - 0, 627, 627, 627, 627, 627, 0, 1404, 0, 627, - 0, 106, 532, 0, 9, 10, 11, 12, 0, 0, - 248, 0, 0, 1120, 0, 1121, 0, 605, 0, 0, - 0, 0, 908, 908, 908, 1383, 1127, 0, 0, 0, - 888, 890, 20, 452, 97, 112, 113, 726, 227, 228, - 229, 0, 23, 0, 0, 0, 106, 0, 621, 0, - 619, 0, 532, 532, 635, 28, 1450, 29, 30, 0, - 0, 0, 20, 82, 0, 0, 0, 230, 0, 0, - 0, 948, 0, 0, 888, 890, 0, 0, 726, 0, - 0, 949, 0, 0, 0, 0, 34, 114, 115, 0, - 0, 624, 0, 950, 626, 0, 0, 135, 0, 0, - 0, 0, 0, 0, 0, 0, 106, 0, 205, 106, - 627, 627, 0, 627, 118, 973, 974, 0, 1016, 9, - 10, 11, 12, 146, 0, 15, 146, 0, 1460, 1461, - 730, 0, 0, 0, 0, 0, 0, 0, 146, 0, - 0, 1017, 0, 0, 0, 1471, 82, 20, 1018, 0, - 1509, 1510, 0, 0, 0, 0, 0, 23, 0, 1515, - 0, 0, 0, 621, 0, 28, 0, 121, 122, 0, - 28, 0, 29, 30, 205, 0, 205, 0, 205, 205, - 205, 0, 0, 0, 205, 0, 1157, 1535, 0, 205, - 10, 11, 205, 169, 14, 15, 1158, 0, 734, 0, - 16, 34, 0, 0, 1507, 1508, 624, 0, 1159, 626, - 82, 0, 0, 0, 18, 0, 19, 20, 0, 0, - 0, 0, 22, 1517, 1518, 0, 0, 0, 0, 0, - 0, 25, 0, 621, 0, 0, 0, 0, 0, 0, - 28, 0, 132, 133, 0, 0, 0, 0, 106, 106, - 106, 106, 0, 0, 0, 0, 622, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 623, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 624, 0, 625, 626, - 0, 1120, 1121, 888, 890, 0, 0, 0, 766, 1127, - 9, 10, 767, 12, 169, 14, 15, 0, 0, 0, - 0, 16, 0, 0, 0, 0, 0, 0, 106, 0, - 532, 0, 888, 890, 0, 18, 726, 19, 20, 21, - 0, 0, 619, 22, 532, 532, 0, 635, 23, 0, - 0, 0, 25, 768, 911, 170, 0, 0, 913, 0, - 0, 28, 0, 29, 30, 0, 0, 769, 0, 770, - 0, 0, 0, 205, 0, 0, 0, 32, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, - 0, 0, 34, 0, 0, 0, 0, 135, 555, 35, - 302, 10, 11, 12, 135, 14, 303, 304, 305, 0, - 306, 16, 205, 955, 205, 205, 240, 635, 0, 0, - 1120, 1121, 0, 1127, 0, 18, 307, 19, 20, 21, - 0, 308, 309, 22, 0, 310, 311, 312, 23, 313, - 314, 0, 25, 0, 0, 0, 315, 316, 317, 318, - 319, 28, 0, 320, 30, -313, 0, 0, 322, 205, - 0, 0, 0, 955, 323, 0, 0, 556, 0, 0, - 205, 205, 0, 205, 0, 325, 326, 557, 0, 0, - 0, 0, 328, 329, 330, 0, 0, 0, 0, 558, - 135, 0, 0, 82, 0, 82, 0, 0, 0, 0, - 1050, 82, 82, 0, 0, 129, 130, 332, 82, 217, - 218, 106, 0, 0, 0, 16, 0, 106, 0, 0, - 0, 0, 0, 0, 532, 532, 532, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 532, 22, 0, 0, - 0, 0, 0, 0, 0, 0, 25, 0, 621, 85, - 0, 0, 0, 0, 0, 28, 0, 132, 133, 108, - 0, 0, 0, 0, 0, 0, 0, 0, 128, 136, - 0, 622, 0, 0, 0, 147, 147, 0, 147, 0, - 85, 623, 0, 0, 0, 0, 0, 85, 0, 0, - 0, 624, 0, 625, 626, 0, 0, 0, 0, 0, - 147, 0, 85, 0, 0, 0, 0, 0, 0, 532, - 241, 532, 0, 0, 0, 0, 0, 250, 106, 0, - 0, 0, 532, 0, 106, 0, 911, 911, 911, 250, - 0, 0, 0, 0, 1134, 0, 9, 10, 11, 12, - 169, 14, 15, 0, 0, 734, 0, 16, 582, 583, - 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, - 594, 18, 0, 19, 20, 0, 106, 0, 106, 22, - 205, 205, 1161, 0, 23, 0, 0, 0, 25, 0, - 621, 85, 0, 0, 0, 147, 147, 28, 0, 29, - 30, 147, 0, 0, 147, 147, 147, 0, 0, 9, - 10, 11, 12, 1157, 0, 520, 0, 0, 0, 0, - 85, 0, 0, 1158, 85, 0, 0, 0, 34, 1161, - 147, 85, 0, 624, 0, 1159, 626, 20, 0, 0, - 0, 0, 106, 0, 0, 0, 0, 23, 147, 147, - 147, 0, 0, 621, 0, 0, 0, 0, 106, 0, - 28, 1050, 29, 30, 0, 0, 0, 0, 0, 0, - 106, 0, 0, 0, 0, 0, 948, 147, 0, 0, - 0, 0, 0, 1222, 0, 0, 949, 0, 0, 0, - 0, 34, 0, 53, 0, 82, 624, 0, 950, 626, - 0, 0, 0, 0, 106, 0, 106, 0, 612, 0, - 302, 396, 397, 12, 147, 613, 0, 0, 0, 53, - 53, 0, 154, 0, 53, 10, 11, 0, 0, 14, - 15, 53, 0, 0, 106, 16, 0, 0, 0, 532, - 532, 0, 532, 0, 53, 0, 53, 0, 23, 18, - 0, 19, 250, 147, 0, 614, 0, 22, 0, 0, - 0, 28, 0, 320, 30, 0, 25, 0, 0, 256, - 0, 0, 0, 0, 0, 28, 0, 132, 133, 0, - 0, 0, 0, 0, 0, 0, 0, 205, 205, 205, - 205, 1161, 615, 0, 0, 205, 0, 250, 0, 0, - 0, 620, 0, 147, 147, 636, 0, 0, 0, 0, - 645, 0, 0, 864, 85, 0, 0, 0, 1161, 1161, - 1161, 0, 398, 398, 0, 53, 0, 0, 0, 53, - 53, 0, 0, 256, 0, 53, 0, 0, 154, 154, - 154, 0, 0, 0, 0, 433, 0, 0, 682, 0, - 0, 205, 0, 0, 53, 0, 146, 250, 53, 147, - 250, 0, 10, 11, 53, 53, 14, 248, 0, 0, - 0, 0, 16, 0, 147, 0, 0, 147, 0, 0, - 0, 0, 53, 53, 154, 0, 18, 0, 19, 147, - 0, 0, 256, 0, 22, 0, 0, 85, 0, 0, - 0, 0, 0, 25, 0, 0, 205, 205, 0, 205, - 0, 53, 28, 0, 132, 133, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 147, 0, 147, 0, 147, - 147, 147, 0, 0, 0, 147, 0, 0, 0, 0, - 147, 0, 0, 147, 0, 205, 955, 205, 53, 0, - 766, 0, 9, 10, 767, 12, 169, 14, 15, 0, - 0, 85, 0, 16, 106, 583, 584, 585, 586, 587, - 588, 589, 590, 591, 592, 593, 594, 18, 0, 19, - 20, 21, 0, 0, 0, 22, -527, 0, 0, 0, - 23, 0, 0, 0, 25, 768, 0, 170, 0, 250, - 250, 250, 250, 28, 0, 29, 30, 0, 0, 769, - 0, 770, 0, 0, 9, 129, 130, 12, 560, 32, - 248, 10, 11, 0, 0, 14, 15, 0, 0, 33, - 0, 16, 0, 0, 34, 398, 0, 0, 0, 0, - 0, 35, 20, 256, 0, 18, 0, 19, 53, 0, - 0, 0, 23, 22, 0, 0, 0, 0, -527, 250, - 1161, 147, 25, 0, 0, 28, 0, 29, 30, 0, - 0, 28, 0, 132, 133, 147, 147, 0, 636, 0, - 0, 32, 398, 0, 0, 912, 0, 0, 0, 0, - 0, 33, 0, 53, 0, 0, 34, 0, 645, 0, - 0, 0, 0, 35, 147, 0, 0, 0, 53, 0, - 0, 53, 0, 0, 0, 0, 0, 433, 433, 433, - 0, 0, 0, 53, 0, 0, 0, 0, 682, 78, - 0, 53, 0, 1161, 1161, 1161, 128, 0, 9, 129, - 130, 12, 0, 147, 636, 147, 147, 241, 636, 0, - 0, 0, 106, 0, 0, 0, 0, 205, 0, 53, - 78, 53, 0, 154, 154, 154, 20, 78, 0, 53, - 0, 985, 0, 0, 53, 0, 23, 53, 0, 0, - 203, 0, 215, 0, 0, 0, 0, 0, 0, 28, - 147, 29, 30, 0, 636, 53, 0, 0, 0, 0, - 0, 147, 147, 0, 147, 151, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 152, 0, 0, 985, 0, - 34, 136, 0, 0, 85, 560, 85, 153, 560, 0, - 0, 1051, 85, 85, 0, 0, 0, 0, 0, 85, - 0, 0, 250, 560, 560, 560, 0, 0, 250, 0, - 0, 0, 0, 0, 0, 147, 147, 147, 560, 0, - 0, 409, 0, 0, 0, 412, 0, 147, 0, 0, - 0, 0, 0, 0, 9, 10, 11, 12, 216, 217, - 218, 0, 0, 0, 0, 16, 0, 0, 0, 0, - 78, 0, 0, 0, 78, 0, 0, 0, 0, 0, - 203, 215, 20, 0, 0, 0, 256, 22, 0, 0, - 0, 0, 23, 0, 0, 0, 25, 0, 621, 560, - 0, 0, 0, 0, 0, 28, 0, 29, 30, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, - 147, 948, 147, 0, 0, 0, 0, 203, 0, 250, - 0, 949, 0, 147, 0, 250, 34, 912, 912, 912, - 0, 624, 398, 950, 626, 645, 0, 0, 0, 398, - 0, 0, 9, 129, 130, 12, 0, 53, 53, 53, - 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 261, 9, 129, 130, 12, 0, 250, 15, 250, - 20, 147, 147, 636, 0, 0, 0, 0, 0, 0, - 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 20, 0, 0, 28, 53, 29, 30, 0, 53, 0, - 23, 0, 0, 0, 0, 53, 53, 0, 53, 32, - 0, 0, 0, 28, 0, 29, 30, 0, 0, 33, - 912, 0, 0, 0, 34, 0, 0, 0, 53, 151, - 53, 35, 0, 250, 0, 53, 53, 53, 436, 152, - 0, 0, 0, 53, 34, 0, 0, 0, 0, 250, - 0, 153, 1051, 0, 653, 0, 0, 0, 0, 0, - 0, 250, 0, 0, 0, 560, 0, 0, 0, 0, - 471, 0, 0, 0, 0, 9, 10, 11, 12, 0, - 0, 15, 0, 487, 0, 0, 85, 0, 0, 0, - 0, 0, 0, 0, 0, 250, 0, 250, 0, 203, - 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 250, 28, 0, 29, 30, - 147, 147, 0, 147, 0, 0, 0, 78, 0, 0, - 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 196, 0, 0, 0, 0, 34, 0, 0, - 0, 560, 560, 560, 197, 0, 0, 433, 256, 0, - 0, 0, 0, 0, 0, 203, 0, 0, 147, 147, - 147, 147, 636, 203, 0, 0, 147, 80, 0, 0, - 0, 0, 0, 985, 0, 9, 10, 11, 12, 0, - 0, 783, 0, 0, 0, 53, 53, 154, 0, 912, - 912, 912, 256, 80, 80, 0, 80, 0, 80, 0, - 0, 0, 0, 20, 0, 80, 0, 0, 0, 0, - 985, 0, 0, 23, 0, 0, 0, 0, 80, 0, - 80, 0, 147, 0, 0, 0, 28, 147, 29, 30, - 0, 0, 0, 0, 1189, 0, 0, 0, 0, 0, - 0, 0, 476, 0, 9, 129, 130, 12, 0, 0, - 520, 0, 477, 0, 0, 0, 0, 34, 0, 0, - 0, 0, 0, 0, 478, 0, 53, 0, 0, 0, - 0, 0, 20, 0, 0, 0, 0, 147, 147, 0, - 147, 0, 23, 0, 0, 0, 0, 256, 0, 0, - 0, 0, 0, 0, 0, 28, 0, 29, 30, 80, - 53, 0, 0, 80, 80, 1415, 0, 0, 0, 80, - 0, 32, 80, 80, 80, 0, 147, 636, 147, 0, - 0, 33, 0, 0, 203, 0, 34, 0, 80, 0, - 0, 0, 80, 35, 0, 250, 0, 751, 80, 80, - 0, 985, 757, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 80, 80, 80, 0, - 0, 0, 0, 203, 954, 203, 203, 0, 0, 788, - 0, 256, 0, 0, 0, 794, 0, 161, 0, 0, - 0, 1039, 1040, 11, 12, 80, 0, 802, 803, 0, - 804, 0, 53, 53, 154, 154, 154, 0, 256, 206, - 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 203, 0, 0, 0, 1003, 0, 0, 0, 0, 23, - 0, 0, 80, 1189, 1189, 1189, 0, 0, 0, 0, - 0, 912, 28, 0, 29, 30, 0, 0, 0, 0, - 1041, 0, 0, 0, 783, 0, 783, 0, 195, 0, - 0, 1049, 1056, 783, 0, 0, 53, 0, 196, 783, - 0, 53, 0, 34, 0, 0, 0, 0, 0, 0, - 197, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 899, 900, 0, 0, 0, - 899, 0, 0, 161, 161, 161, 0, 0, 0, 0, - 0, 0, 0, 0, 912, 912, 912, 9, 10, 11, - 12, 53, 53, 248, 53, 0, 0, 0, 644, 206, - 0, 0, 80, 250, 0, 0, 0, 0, 147, 0, - 0, 0, 0, 0, 0, 20, 0, 206, 206, 480, - 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, - 53, 53, 53, 0, 0, 0, 0, 0, 28, 0, - 29, 30, 0, 0, 0, 0, 206, 80, 0, 0, - 0, 0, 0, 0, 195, 204, 0, 0, 0, 0, - 0, 0, 80, 0, 196, 80, 0, 0, 0, 34, - 0, 371, 373, 0, 0, 0, 197, 80, 0, 0, - 259, 0, 0, 263, 0, 80, 0, 0, 9, 10, - 11, 12, 216, 217, 218, 0, 0, 0, 0, 16, - 0, 0, 0, 0, 259, 0, 367, 0, 0, 0, - 0, 0, 0, 80, 0, 80, 20, 80, 80, 80, - 0, 22, 533, 80, 0, 0, 23, 0, 80, 0, - 25, 80, 621, 1071, 0, 1073, 0, 0, 0, 28, - 0, 29, 30, 0, 0, 1189, 0, 0, 0, 80, - 0, 0, 0, 0, 0, 195, 0, 0, 9, 10, - 11, 12, 207, 14, 208, 196, 0, 0, 0, 16, - 34, 0, 629, 629, 629, 204, 0, 1428, 0, 0, - 0, 0, 1049, 18, 0, 19, 20, 0, 0, 0, - 0, 22, 0, 204, 204, 204, 23, 0, 0, 0, - 25, 0, 0, 486, 0, 0, 0, 1107, 1108, 28, - 1110, 29, 30, 1485, 0, 209, 783, 0, 1189, 1189, - 1189, 0, 204, 0, 0, 32, 0, 0, 206, 0, - 0, 0, 0, 0, 0, 33, 0, 0, 1128, 0, - 34, 0, 53, 0, 0, 0, 0, 35, 263, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 644, 259, 1486, 573, 574, 575, 576, 577, 578, - 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, 593, 594, 0, 0, 0, 1163, - 0, 0, 80, 563, 206, 0, 206, 0, 480, 480, - 480, 0, 0, 0, 206, 0, 0, 0, 0, 206, - 0, 0, 206, 0, 9, 10, 11, 12, 169, 14, - 15, 0, 0, 0, 0, 16, 0, 0, 0, 0, - 0, 80, 80, 80, 80, 0, 0, 0, 0, 18, - 0, 19, 20, 21, 0, 0, 0, 22, 0, 0, - 0, 0, 23, 0, 259, 263, 25, 0, 0, 170, - 0, 0, 1208, 0, 0, 28, 689, 29, 30, 0, - 0, 0, 1359, 0, 1213, 0, 0, 1359, 80, 0, - 0, 32, 80, 0, 0, 0, 0, 0, 0, 80, - 80, 33, 80, 0, 0, 0, 34, 0, 0, 0, - 0, 0, 0, 35, 204, 0, 0, 0, 0, 36, - 0, 0, 80, 0, 80, 0, 0, 0, 0, 80, - 80, 80, 0, 0, 0, 0, 0, 80, 0, 0, - 873, 0, 736, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 629, 629, 0, 629, 0, 0, - 0, 0, 0, 0, 629, 0, 0, 0, 0, 0, - 1264, 0, 0, 0, 0, 0, 203, 1427, 203, 0, - 204, 0, 204, 206, 204, 204, 204, 0, 0, 0, - 204, 0, 0, 0, 0, 204, 0, 0, 204, 0, - 9, 10, 11, 12, 216, 217, 218, 0, 0, 1277, - 807, 16, 0, 810, 0, 0, 0, 812, 813, 815, - 816, 817, 952, 0, 952, 952, 0, 629, 20, 0, - 563, 0, 0, 22, 0, 0, 0, 0, 23, 0, - 0, 0, 25, 834, 621, 0, 0, 0, 0, 0, - 0, 28, 0, 29, 30, 0, 0, 0, 0, 0, - 0, 0, 0, 644, 0, 0, 0, 948, 0, 952, - 0, 0, 0, 0, 1367, 0, 0, 949, 1368, 0, - 206, 206, 34, 206, 0, 0, 0, 624, 0, 997, - 626, 0, 0, 0, 0, 0, 0, 891, 0, 80, - 80, 80, 0, 0, 891, 0, 0, 0, 0, 0, - 206, 0, 0, 1384, 0, 0, 0, 0, 0, 0, - 766, 0, 9, 10, 767, 12, 169, 14, 15, 0, - 0, 0, 0, 16, 533, 533, 533, 0, 0, 0, - 0, 0, 0, 259, 263, 0, 629, 18, 1191, 19, - 20, 21, 0, 0, 0, 22, -528, 0, 0, 204, - 23, 0, 0, 0, 25, 768, 0, 170, 0, 0, - 0, 0, 0, 28, 0, 29, 30, 0, 0, 769, - 80, 770, 0, 0, 0, 0, 0, 0, 203, 32, - 1443, 0, 0, 0, 1444, 0, 0, 0, 204, 33, - 204, 204, 0, 0, 34, 0, 0, 0, 0, 0, - 0, 35, 0, 689, 80, 0, 1462, 1463, 0, 629, - 0, 629, 9, 10, 11, 12, 0, 0, -528, 0, - 0, 0, 629, 0, 0, 0, 629, 629, 629, 0, - 0, 0, 0, 0, 0, 204, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 204, 204, 0, 204, - 23, 736, 0, 0, 0, 0, 0, 736, 0, 0, - 0, 0, 0, 28, 0, 29, 30, 0, 0, 1422, - 952, 952, 1162, 0, 0, 0, 204, 0, 0, 195, - -388, 10, 11, -388, -388, 14, 248, 0, 0, 196, - 0, 16, 0, 0, 34, 0, 80, 80, 80, 80, - 80, 197, 0, 0, 80, 18, 0, 19, -388, 0, - 0, 0, 0, 22, 0, 0, 0, 0, -388, 1162, - 0, 0, 25, 0, 621, 1101, 0, 1191, 1191, 1191, - 0, 28, 0, 132, 133, 0, 0, 1352, 1353, 11, - 12, 0, 0, 0, 0, 0, 0, 622, 0, 0, - 0, 206, 0, 0, 0, 0, 0, 623, 834, 0, - 80, 0, -388, 0, 736, 80, 0, 624, 891, 625, - 626, 0, 0, 0, 0, 23, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, - 29, 30, 0, 0, 0, 0, 1354, 0, 0, 0, - 0, 0, 0, 0, 195, 0, 689, 0, 1153, 259, - 263, 259, 891, 0, 196, 80, 80, 0, 80, 34, - 0, 0, 0, 0, 0, 0, 197, 0, 0, 873, - 873, 0, 873, 0, 0, 0, 9, 10, 11, 12, - 0, 0, 15, 0, 0, 0, 204, 204, 1160, 0, - 0, 104, 0, 259, 80, 80, 80, 0, 0, 891, - 123, 104, 0, 0, 20, 0, 0, 104, 104, 0, - 104, 0, 1195, 0, 23, 0, 0, 952, 952, 1162, - 1162, 1162, 0, 263, 0, 952, 0, 28, 736, 29, - 30, 9, 10, 11, 12, 1160, 0, 520, 0, 0, - 736, 0, 237, 476, 0, 0, 0, 0, 1162, 1162, - 1162, 0, 0, 477, 0, 0, 0, 0, 34, 20, - 0, 0, 0, 0, 0, 478, 0, 204, 0, 23, - 0, 0, 0, 0, 736, 0, 736, 0, 0, 0, - 0, 206, 28, 0, 29, 30, 0, 0, 486, 0, - 0, 1352, 129, 130, 12, 0, 0, 0, 195, 0, - 0, 391, 0, 123, 1250, 0, 0, 0, 196, 1191, - 104, 104, 0, 34, 0, 0, 0, 104, 104, 0, - 197, 104, 104, 104, 0, 419, 104, 104, 104, 23, - 0, 0, 0, 0, 0, 0, 952, 952, 0, 952, - 0, 0, 28, 0, 29, 30, 0, 0, 0, 0, - 1354, 0, 0, 0, 0, 0, 0, 0, 32, 0, - 0, 891, 0, 0, 0, 0, 0, 0, 33, 0, - 0, 0, 259, 34, 0, 206, 0, 206, 0, 0, - 35, 0, 1191, 1191, 1191, 0, 0, 0, 0, 0, - 891, 0, 0, 204, 204, 204, 204, 1160, 0, 1276, - 0, 204, 0, 0, 1337, 0, 80, 0, 0, 0, - 0, 0, 0, 0, 0, 237, 104, 0, 0, 0, - 0, 0, 0, 0, 1160, 1160, 1160, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 104, 0, 766, 0, - 9, 10, 767, 12, 169, 14, 15, 0, 0, 0, - 0, 16, 0, 0, 0, 0, 0, 204, 0, 0, - 0, 0, 0, 0, 0, 18, 0, 19, 20, 21, - 0, 0, 0, 22, -530, 104, 0, 0, 23, 0, - 0, 0, 25, 768, 0, 170, 0, 0, 0, 0, - 480, 28, 0, 29, 30, 0, 0, 769, 0, 770, - 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, - 0, 0, 204, 204, 0, 204, 0, 33, 0, 0, - 0, 0, 34, 104, 0, 104, 104, 0, 0, 35, - 0, 0, 0, 0, 1195, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -530, 0, 0, 0, - 0, 204, 0, 204, 0, 0, 10, 11, 0, 169, - 14, 15, 0, 480, 480, 480, 16, 0, 0, 0, - 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 18, 0, 19, 20, 0, 0, 0, 206, 22, 104, - 0, 0, 0, 0, 0, 0, 104, 683, 0, 104, - 170, 0, 0, 0, 0, 0, 28, 0, 132, 133, - 0, 104, 555, 0, 302, 10, 11, 12, 169, 14, - 303, 304, 305, 734, 306, 16, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, - 307, 19, 20, 21, 0, 308, 309, 22, 0, 310, - 311, 312, 23, 313, 314, 0, 25, 0, 621, 0, - 315, 316, 317, 318, 319, 28, 1160, 320, 30, -313, - 0, 0, 322, 0, 0, 0, 0, 0, 323, 104, - 0, 904, 10, 11, 0, 207, 14, 208, 0, 325, - 326, 905, 16, 0, 0, 0, 328, 329, 330, 0, - 0, 624, 0, 906, 626, 563, 18, 104, 19, 20, - 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, - 0, 332, 689, 25, 0, 0, 0, 0, 0, 0, - 0, 0, 28, 0, 132, 133, 0, 0, 0, 1160, - 1160, 1160, 0, 0, 0, 0, 1456, 0, -480, -480, - -480, -480, -480, -480, -480, 0, 0, -480, 0, -480, - 0, 0, 0, 204, 0, 0, 0, 0, 0, 0, - -480, 0, -480, 0, 0, 0, -480, 0, 0, 0, - 0, -480, 0, 104, 0, 0, -480, 0, 0, 0, - -480, 0, -480, 0, 104, 104, 0, 104, 104, -480, - 0, -480, -480, -480, -480, -480, 0, -480, -480, -480, - -480, -480, -480, -480, -480, -480, -480, -480, -480, -480, - -480, -480, -480, -480, -480, -480, -480, -480, -480, -480, - -480, -480, -480, 0, 0, -480, -480, -480, -480, -480, - 0, -480, -480, 0, 0, 0, 0, 1457, 0, 0, - 104, 0, -480, -480, -480, 0, -480, 104, 123, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, - 0, 0, 0, 0, 0, 0, 0, 0, 1430, 0, - 1287, 1288, 1289, 12, 169, 14, 303, 304, 305, 0, - 306, 16, 1290, 982, 1291, 1292, 1293, 1294, 1295, 1296, - 1297, 1298, 1299, 1300, 17, 18, 307, 19, 20, 21, - 0, 308, 309, 22, 0, 310, 311, 312, 23, 313, - 314, 1301, 25, 1302, 0, 0, 315, 316, 317, 318, - 319, 28, 0, 320, 1303, 721, 0, 1304, 322, 0, - 982, 0, 0, 104, 323, 0, 0, 324, 0, 0, - 0, 0, 0, 0, 0, 325, 326, 327, 0, 0, - 0, 0, 328, 329, 330, 0, 0, 0, 0, 331, - 0, 0, 0, 1305, 0, 0, 0, 104, 104, 104, - 0, 0, 0, 0, 0, 0, 1431, 332, 1286, 104, - 1287, 1288, 1289, 12, 169, 14, 303, 304, 305, 0, - 306, 16, 1290, 0, 1291, 1292, 1293, 1294, 1295, 1296, - 1297, 1298, 1299, 1300, 17, 18, 307, 19, 20, 21, - 0, 308, 309, 22, 0, 310, 311, 312, 23, 313, - 314, 1301, 25, 1302, 0, 0, 315, 316, 317, 318, - 319, 28, 0, 320, 1303, 721, 0, 1304, 322, 0, - 0, 0, 0, 0, 323, 0, 0, 324, 0, 0, - 0, 0, 104, 0, 104, 325, 326, 327, 0, 0, - 0, 0, 328, 329, 330, 104, 0, 0, 0, 331, - 0, 0, 0, 1305, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 555, 332, 9, 10, - 11, 12, 169, 14, 303, 304, 305, 734, 306, 16, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 18, 307, 19, 20, 21, 0, 308, - 309, 22, 0, 310, 311, 312, 23, 313, 314, 0, - 25, 0, 621, 0, 315, 316, 317, 318, 319, 28, - 0, 29, 30, -313, 0, 0, 322, 0, 0, 0, - 982, 0, 323, 0, 0, 1186, 0, 0, 0, 0, - 0, 0, 0, 325, 326, 1187, 0, 0, 0, 0, - 328, 329, 330, 0, 0, 624, 0, 1188, 626, 0, - 733, 0, 302, 10, 11, 12, 169, 14, 303, 304, - 305, 734, 306, 16, 0, 332, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 18, 307, 19, - 20, 21, 0, 308, 309, 22, 104, 310, 311, 312, - 23, 313, 314, 0, 25, 0, 0, 0, 315, 316, - 317, 318, 319, 28, 0, 320, 30, 0, 0, 0, - 322, 0, 0, 0, 0, 0, 323, 0, 0, 324, - 0, 0, 0, 0, 0, 0, 0, 325, 326, 327, - 0, 0, 0, 0, 328, 329, 330, 0, 0, 0, - 0, 331, 104, 104, 0, 104, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -800, 0, 332, - 837, 0, 302, 10, 11, 12, 169, 14, 303, 304, - 305, 0, 306, 16, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 18, 307, 19, - 20, 21, 0, 308, 309, 22, 0, 310, 311, 312, - 23, 313, 314, 0, 25, 982, 0, 0, 315, 316, - 317, 318, 319, 28, 0, 320, 30, 1530, 0, -790, - 322, 0, 0, 0, 0, 0, 323, 0, 0, 324, - 0, 0, 0, 0, 0, 0, 0, 325, 326, 327, - 0, 0, 982, 0, 328, 329, 330, 0, 0, 0, - 0, 331, 0, 0, 0, 0, 0, 104, 724, 104, - 825, 826, 827, 12, 0, 14, 537, 304, 305, 332, - 306, 16, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 18, 307, 19, 0, 21, - 0, 308, 309, 22, 0, 310, 311, 312, 23, 313, - 314, 0, 25, 0, 0, 0, 315, 316, 317, 318, - 319, 28, 0, 828, 829, 725, 0, 0, 322, 0, - 0, 0, 0, 0, 323, 0, 0, 324, 0, 0, - 0, 0, 0, 0, 0, 325, 326, 327, 0, 0, - 0, 0, 328, 329, 330, 0, 0, 0, 0, 331, - 830, 724, 0, 825, 826, 827, 12, 0, 14, 537, - 304, 305, 0, 306, 16, 0, 989, 332, 0, 0, - 0, 0, 0, 982, 0, 0, 0, 0, 18, 307, - 19, 0, 21, 0, 308, 309, 22, 0, 310, 311, - 312, 23, 313, 314, 0, 25, 0, 0, 0, 315, - 316, 317, 318, 319, 28, 0, 828, 829, 725, 0, - 0, 322, 0, 0, 0, 0, 0, 323, 0, 0, - 324, 0, 0, 0, 0, 0, 0, 0, 325, 326, - 327, 0, 0, 0, 0, 328, 329, 330, 0, 0, - 0, 0, 331, 830, 724, 0, 825, 826, 827, 12, - 0, 14, 537, 304, 305, 0, 306, 16, 0, 0, - 332, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 18, 307, 19, 0, 21, 0, 308, 309, 22, - 0, 310, 311, 312, 23, 313, 314, 0, 25, 0, - 0, 0, 315, 316, 317, 318, 319, 28, 0, 828, - 829, 725, 0, 0, 322, 0, 0, 0, 0, 0, - 323, 0, 0, 324, 0, 0, 0, 0, 0, 0, - 0, 325, 326, 327, 0, 0, 0, 0, 328, 329, - 330, 0, 0, 0, 724, 331, 825, 826, 827, 12, - 0, 14, 537, 304, 305, 0, 306, 16, 0, 0, - 0, 0, -484, 332, 0, 0, 0, 0, 0, 0, - 0, 18, 307, 19, 0, 21, 0, 308, 309, 22, - 0, 310, 311, 312, 23, 313, 314, 0, 25, 0, - 0, 0, 315, 316, 317, 318, 319, 28, 0, 828, - 829, 725, 0, 0, 322, 0, 0, 0, 0, 0, - 323, 0, 0, 324, 0, 0, 0, 0, 0, 0, - 0, 325, 326, 327, 0, 0, 0, 0, 328, 329, - 330, 0, 0, 0, 724, 331, 302, 10, 11, 12, - 0, 14, 537, 304, 305, 0, 306, 16, 0, 0, - 0, 0, 1325, 332, 0, 0, 0, 0, 0, 0, - 0, 18, 307, 19, 0, 21, 0, 308, 309, 22, - 0, 310, 311, 312, 23, 313, 314, 0, 25, 0, - 0, 0, 315, 316, 317, 318, 319, 28, 0, 320, - 30, 725, 0, 0, 322, 0, 0, 0, 0, 0, - 323, 0, 0, 324, 0, 0, 0, 0, 0, 0, - 0, 325, 326, 327, 0, 0, 0, 0, 328, 329, - 330, 0, 0, 0, 0, 331, 0, 0, 555, 0, - 9, 10, 11, 12, 1329, 14, 303, 304, 305, 0, - 306, 16, 0, 332, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 18, 307, 19, 20, 21, - 0, 308, 309, 22, 0, 310, 311, 312, 23, 313, - 314, 0, 25, 0, 0, 0, 315, 316, 317, 318, - 319, 28, 0, 29, 30, -313, 0, 0, 322, 0, - 0, 0, 0, 0, 323, 0, 0, 1501, 0, 0, - 0, 0, 0, 0, 0, 325, 326, 1502, 0, 0, - 0, 0, 328, 329, 330, 0, 0, 0, 724, 1503, - 302, 10, 11, 12, 0, 14, 537, 304, 305, 0, - 306, 16, 0, 0, 0, 0, 0, 332, 0, 0, - 0, 0, 0, 0, 0, 18, 307, 19, 0, 21, - 0, 308, 309, 22, 0, 310, 311, 312, 23, 313, - 314, 0, 25, 0, 0, 0, 315, 316, 317, 318, - 319, 28, 0, 320, 30, 725, 0, 0, 322, 0, - 0, 0, 0, 0, 323, 0, 0, 324, 0, 0, - 0, 0, 0, 0, 0, 325, 326, 327, 0, 0, - 0, 0, 328, 329, 330, 0, 0, 0, 837, 331, - 302, 10, 11, 12, 0, 14, 537, 304, 305, 0, - 306, 16, 0, 0, 0, 0, 0, 332, 0, 0, - 0, 0, 0, 0, 0, 18, 307, 19, 0, 21, - 0, 308, 309, 22, 0, 310, 311, 312, 23, 313, - 314, 0, 25, 0, 0, 0, 315, 316, 317, 318, - 319, 28, 0, 320, 30, 0, 0, 0, 322, -790, - 0, 0, 0, 0, 323, 0, 0, 324, 0, 0, - 0, 0, 0, 0, 0, 325, 326, 327, 0, 0, - 0, 0, 328, 329, 330, 0, 0, 0, 1582, 331, - 302, 10, 11, 12, 0, 14, 303, 304, 305, 0, - 306, 16, 0, 0, 0, 0, 0, 332, 0, 0, - 0, 0, 0, 0, 0, 18, 307, 19, 0, 21, - 0, 308, 309, 22, 0, 310, 311, 312, 23, 313, - 314, 0, 25, 0, 0, 0, 315, 316, 317, 318, - 319, 28, 0, 320, 30, 0, 0, -197, 322, 0, - 0, 0, 0, 0, 323, 0, 0, 324, 0, 0, - 0, 0, 0, 0, 0, 325, 326, 327, 0, 0, - 0, 0, 328, 329, 330, 0, 0, 0, 837, 331, - 302, 10, 11, 12, 0, 14, 537, 304, 305, 0, - 306, 16, 0, 0, 0, 0, 0, 332, 0, 0, - 0, 0, 0, 0, 0, 18, 307, 19, 0, 21, - 0, 308, 309, 22, 0, 310, 311, 312, 23, 313, - 314, 0, 25, 0, 0, 0, 315, 316, 317, 318, - 319, 28, 0, 320, 30, 0, 0, 0, 322, 0, - 0, 0, 0, 0, 323, 265, 0, 324, 10, 11, - 0, 0, 14, 15, 0, 325, 326, 327, 16, 0, - 0, 0, 328, 329, 330, 0, 0, 0, 0, 331, - 0, 0, 18, 0, 19, 0, 0, 0, 0, 0, - 22, 0, 266, 267, 0, -790, 0, 332, 0, 25, - 0, 268, 0, 0, 0, 0, 0, 0, 28, 0, - 132, 133, 0, 269, 0, 0, 0, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 0, 290, 291, - 292, 293, 0, 0, 0, 0, 0, 294, 295, 926, - 0, 302, 10, 11, 12, 0, 14, 537, 304, 305, - 0, 306, 16, 0, 296, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 18, 307, 19, 0, - 21, 0, 308, 309, 22, 0, 310, 311, 312, 23, - 313, 314, 0, 25, 0, 0, 0, 315, 316, 317, - 318, 319, 28, 0, 320, 30, 0, 0, 0, 322, - 0, 0, 0, 0, 0, 323, 0, 0, 324, 0, - 0, 0, 0, 0, 0, 0, 325, 326, 327, 0, - 0, 0, 0, 328, 329, 330, 0, 0, 0, 928, - 331, 302, 10, 11, 12, 0, 14, 537, 304, 305, - 0, 306, 16, 0, 0, 0, 0, 0, 332, 0, - 0, 0, 0, 0, 0, 0, 18, 307, 19, 0, - 21, 0, 308, 309, 22, 0, 310, 311, 312, 23, - 313, 314, 0, 25, 0, 0, 0, 315, 316, 317, - 318, 319, 28, 0, 320, 30, 0, 0, 0, 322, - 0, 0, 0, 0, 0, 323, 0, 0, 324, 0, - 0, 0, 0, 0, 0, 0, 325, 326, 327, 0, - 0, 0, 0, 328, 329, 330, 0, 0, 0, 1514, - 331, 302, 10, 11, 12, 0, 14, 537, 304, 305, - 0, 306, 16, 0, 0, 0, 0, 0, 332, 0, - 0, 0, 0, 0, 0, 0, 18, 307, 19, 0, - 21, 0, 308, 309, 22, 0, 310, 311, 312, 23, - 313, 314, 0, 25, 0, 0, 0, 315, 316, 317, - 318, 319, 28, 0, 320, 30, 0, 0, 0, 322, - 0, 0, 0, 0, 0, 323, 0, 0, 324, 0, - 0, 0, 0, 0, 0, 0, 325, 326, 327, 0, - 0, 0, 0, 328, 329, 330, 302, 10, 11, 12, - 331, 14, 537, 304, 305, 0, 306, 16, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 332, 0, - 0, 18, 307, 19, 0, 21, 0, 308, 309, 22, - 0, 310, 311, 312, 23, 313, 314, 0, 25, 0, - 0, 0, 315, 316, 317, 318, 319, 28, 0, 320, - 30, 0, 0, 0, 322, 0, 0, 0, 0, 0, - 323, 0, 766, 324, 9, 10, 767, 12, 169, 14, - 15, 325, 326, 327, 0, 16, 0, 0, 328, 329, - 330, 0, 0, 0, 0, 331, 0, 0, 0, 18, - 0, 19, 20, 21, 0, 0, 0, 22, -529, 0, - 0, 0, 23, 332, 876, 0, 25, 768, 0, 170, - 0, 0, 0, 0, 0, 28, 0, 29, 30, 0, - 0, 769, 0, 770, 0, 0, 0, 0, 0, 0, - 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 33, 0, 0, 0, 0, 34, 0, 0, 0, - 0, 0, 0, 35, 0, 0, 0, 1287, 1288, 1289, - 12, 169, 14, 303, 304, 305, 0, 306, 16, 1290, - -529, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1298, 1299, - 1300, 17, 18, 307, 19, 20, 21, 0, 308, 309, - 22, 0, 310, 311, 312, 23, 313, 314, 1301, 25, - 1302, 0, 0, 315, 316, 317, 318, 319, 28, 0, - 320, 1303, 721, 0, 1304, 322, 0, 0, 0, 0, - 0, 323, 0, 0, 324, 0, 0, 0, 0, 0, - 0, 0, 325, 326, 327, 0, 0, 0, 0, 328, - 329, 330, 0, 0, 0, 0, 331, 0, 0, 0, - 1305, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1435, 332, 1287, 1288, 1289, 12, 169, - 14, 303, 304, 305, 0, 306, 16, 1290, 0, 1291, - 1292, 1293, 1294, 1295, 1296, 1297, 1298, 1299, 1300, 17, - 18, 307, 19, 20, 21, 0, 308, 309, 22, 0, - 310, 311, 312, 23, 313, 314, 1301, 25, 1302, 0, - 0, 315, 316, 317, 318, 319, 28, 0, 320, 1303, - 721, 0, 1304, 322, 0, 0, 0, 0, 0, 323, - 0, 0, 324, 0, 0, 0, 0, 0, 0, 0, - 325, 326, 327, 0, 0, 0, 0, 328, 329, 330, - 0, 0, 0, 0, 331, 0, 0, 0, 1305, 1287, - 1288, 1289, 12, 169, 14, 303, 304, 305, 0, 306, - 16, 1290, 332, 1291, 1292, 1293, 1294, 1295, 1296, 1297, - 1298, 1299, 1300, 17, 18, 307, 19, 20, 21, 0, - 308, 309, 22, 0, 310, 311, 312, 23, 313, 314, - 1301, 25, 1302, 0, 0, 315, 316, 317, 318, 319, - 28, 0, 320, 1303, 1559, 0, 1304, 322, 0, 0, - 0, 0, 0, 323, 0, 0, 324, 0, 0, 0, - 0, 0, 0, 0, 325, 326, 327, 0, 0, 0, - 0, 328, 329, 330, 0, 0, 0, 0, 331, 0, - 0, 0, 1305, 1287, 1288, 1289, 12, 169, 14, 303, - 304, 305, 0, 306, 16, 1290, 332, 1291, 1292, 1293, - 1294, 1295, 1296, 1297, 1298, 1299, 1300, 17, 18, 307, - 19, 20, 21, 0, 308, 309, 22, 0, 310, 311, - 312, 23, 313, 314, 1301, 25, 1302, 0, 0, 315, - 316, 317, 318, 319, 28, 0, 320, 1303, 0, 0, - 1304, 322, 0, 0, 0, 0, 0, 323, 0, 0, - 324, 0, 0, 0, 0, 0, 0, 0, 325, 326, - 327, 0, 0, 0, 0, 328, 329, 330, 0, 0, - 0, 0, 331, 0, 0, 0, 1305, 302, 10, 11, - 12, 169, 14, 303, 304, 305, 734, 306, 16, 0, - 332, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 18, 307, 19, 20, 21, 0, 308, 309, - 22, 0, 310, 311, 312, 23, 313, 314, 0, 25, - 0, 621, 0, 315, 316, 317, 318, 319, 28, 0, - 320, 30, 0, 0, 0, 322, 0, 0, 0, 0, - 0, 323, 0, 0, 904, 0, 0, 0, 0, 0, - 0, 0, 325, 326, 905, 0, 0, 0, 0, 328, - 329, 330, 0, 0, 624, 0, 906, 626, 9, 10, - 11, 12, 169, 14, 303, 304, 305, 734, 306, 16, - 0, 0, 0, 0, 332, 0, 0, 0, 0, 0, - 0, 0, 0, 18, 307, 19, 20, 21, 0, 308, - 309, 22, 0, 310, 311, 312, 23, 313, 314, 0, - 25, 0, 621, 0, 315, 316, 317, 318, 319, 28, - 0, 29, 30, 0, 0, 0, 322, 0, 0, 0, - 0, 0, 323, 0, 0, 1186, 0, 0, 0, 0, - 0, 0, 0, 325, 326, 1187, 0, 0, 0, 0, - 328, 329, 330, 0, 0, 624, 0, 1188, 626, 302, - 10, 11, 12, 0, 14, 303, 304, 305, 0, 306, - 16, 0, 0, 0, 0, 332, 0, 0, 0, 0, - 0, 0, 0, 0, 18, 307, 19, 20, 21, 0, - 308, 309, 22, 0, 310, 311, 312, 23, 313, 314, - 0, 25, 0, 621, 0, 315, 316, 317, 318, 319, - 28, 0, 320, 30, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 323, 0, 0, 904, 0, 0, 0, - 0, 0, 0, 0, 325, 326, 905, 0, 0, 0, - 0, 328, 329, 330, 0, 0, 624, 0, 906, 626, - 9, 10, 11, 12, 0, 14, 303, 304, 305, 0, - 306, 16, 0, 0, 0, 0, 332, 0, 0, 0, - 0, 0, 0, 0, 0, 18, 307, 19, 20, 21, - 0, 308, 309, 22, 0, 310, 311, 312, 23, 313, - 314, 0, 25, 0, 621, 0, 315, 316, 317, 318, - 319, 28, 0, 29, 30, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 323, 0, 0, 1186, 0, 0, - 0, 0, 0, 0, 0, 325, 326, 1187, 0, 0, - 0, 0, 328, 329, 330, 0, 0, 624, 0, 1188, - 626, 302, 10, 11, 12, 0, 14, 537, 304, 305, - 0, 306, 16, 0, 0, 0, 0, 332, 0, 0, - 0, 0, 0, 0, 0, 0, 18, 307, 19, 20, - 21, 0, 308, 309, 22, 0, 310, 311, 312, 23, - 313, 314, 0, 25, 0, 0, 0, 315, 316, 317, - 318, 319, 28, 0, 320, 30, 0, 0, 0, 322, - 0, 0, 0, 0, 0, 323, 0, 0, 556, 0, - 0, 0, 0, 0, 0, 0, 325, 326, 557, 0, - 0, 0, 0, 328, 329, 330, 302, 10, 11, 12, - 558, 14, 537, 304, 305, 0, 306, 16, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 332, 0, - 0, 18, 307, 19, 0, 21, 0, 308, 309, 22, - 0, 310, 311, 312, 23, 313, 314, 0, 25, 0, - 0, 0, 315, 316, 317, 318, 319, 28, 0, 320, - 30, 0, 0, 1408, 322, 0, 0, 0, 0, 0, - 323, 0, 0, 324, 0, 0, 0, 0, 0, 0, - 0, 325, 326, 327, 0, 0, 0, 0, 328, 329, - 330, 0, 0, 0, 0, 331, 302, 10, 11, 12, - 169, 14, 303, 304, 305, 0, 306, 16, 0, 0, - 0, 0, 0, 332, 0, 0, 0, 0, 0, 0, - 0, 18, 307, 19, 20, 21, 0, 308, 309, 22, - 0, 310, 311, 312, 23, 313, 314, 0, 25, 0, - 0, 0, 315, 316, 317, 318, 319, 28, 0, 320, - 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 323, 0, 0, 324, 0, 0, 0, 0, 0, 0, - 0, 325, 326, 327, 0, 0, 0, 0, 328, 329, - 330, 9, 10, 11, 12, 331, 14, 537, 304, 305, - 0, 306, 16, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 332, 0, 0, 18, 307, 19, 20, - 21, 0, 308, 309, 22, 0, 310, 311, 312, 23, - 313, 314, 0, 25, 0, 0, 0, 315, 316, 317, - 318, 319, 28, 0, 29, 30, 0, 0, 0, 322, - 0, 0, 0, 0, 0, 323, 0, 0, 1501, 0, - 0, 0, 0, 0, 0, 0, 325, 326, 1502, 0, - 0, 0, 0, 328, 329, 330, 302, 10, 11, 12, - 1503, 14, 303, 304, 305, 0, 306, 16, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 332, 0, - 0, 18, 307, 19, 0, 21, 0, 308, 309, 22, - 0, 310, 311, 312, 23, 313, 314, 0, 25, 0, - 0, 0, 315, 316, 317, 318, 319, 28, 0, 320, - 321, 0, 0, 0, 322, 0, 0, 0, 0, 0, - 323, 0, 0, 324, 0, 0, 0, 0, 0, 0, - 0, 325, 326, 327, 0, 0, 0, 0, 328, 329, - 330, 302, 10, 11, 12, 331, 14, 303, 304, 305, - 0, 306, 16, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 332, 0, 0, 18, 307, 19, 0, - 21, 0, 308, 309, 22, 0, 310, 311, 312, 23, - 313, 314, 0, 25, 0, 0, 0, 315, 316, 317, - 318, 319, 28, 0, 320, 30, 0, 0, 0, 322, - 0, 0, 0, 0, 0, 323, 0, 0, 324, 0, - 0, 0, 0, 0, 0, 0, 325, 326, 327, 0, - 0, 0, 0, 328, 329, 330, 302, 10, 11, 12, - 331, 14, 537, 304, 305, 0, 306, 16, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 332, 0, - 0, 18, 307, 19, 0, 21, 0, 308, 309, 22, - 0, 310, 311, 312, 23, 313, 314, 0, 25, 0, - 0, 0, 315, 316, 317, 318, 319, 28, 0, 320, - 30, 0, 0, 0, 322, 0, 0, 0, 0, 0, - 323, 0, 0, 324, 0, 0, 0, 0, 0, 0, - 0, 325, 326, 327, 0, 0, 0, 0, 328, 329, - 330, 302, 10, 11, 12, 331, 14, 537, 304, 305, - 0, 306, 16, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 332, 0, 0, 18, 307, 19, 0, - 21, 0, 308, 309, 22, 0, 310, 311, 312, 23, - 313, 314, 0, 25, 0, 0, 0, 315, 316, 317, - 318, 319, 28, 0, 320, 30, 570, 0, 0, 0, - 0, 0, 0, 0, 0, 323, 0, 0, 324, 0, - 0, 0, 0, 0, 0, 0, 325, 326, 327, 0, - 0, 0, 0, 328, 329, 330, 302, 10, 11, 12, - 571, 14, 537, 304, 305, 0, 306, 16, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 332, 0, - 0, 18, 307, 19, 0, 21, 0, 308, 309, 22, - 0, 310, 311, 312, 23, 313, 314, 0, 25, 0, - 0, 0, 315, 316, 317, 318, 319, 28, 0, 320, - 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 323, 0, 0, 324, 0, 0, 0, 0, 0, 0, - 0, 325, 326, 327, 0, 0, 0, 0, 328, 329, - 330, 0, 0, 0, 0, 331, 609, 302, 10, 11, - 12, 0, 14, 537, 304, 305, 0, 306, 16, 0, - 0, 0, 0, 332, 0, 0, 0, 0, 0, 0, - 0, 0, 18, 307, 19, 20, 21, 0, 308, 309, - 22, 0, 310, 311, 312, 23, 313, 314, 0, 25, - 0, 0, 0, 315, 316, 317, 318, 319, 28, 0, - 320, 30, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 323, 0, 0, 556, 0, 0, 0, 0, 0, - 0, 0, 325, 326, 557, 0, 0, 0, 0, 328, - 329, 330, 1146, 10, 11, 12, 558, 14, 537, 304, - 305, 0, 306, 16, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 332, 0, 0, 18, 307, 19, - 0, 21, 0, 308, 309, 22, 0, 310, 311, 312, - 23, 313, 314, 0, 25, 0, 0, 0, 315, 316, - 317, 318, 319, 28, 0, 320, 30, 0, 0, 0, - 322, 0, 0, 0, 0, 0, 323, 0, 0, 324, - 0, 0, 0, 0, 0, 0, 0, 325, 326, 327, - 0, 0, 0, 0, 328, 329, 330, 9, 10, 11, - 12, 331, 14, 303, 304, 305, 0, 306, 16, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 332, - 0, 0, 18, 307, 19, 20, 21, 0, 308, 309, - 22, 0, 310, 311, 312, 23, 313, 314, 0, 25, - 0, 0, 0, 315, 316, 317, 318, 319, 28, 0, - 29, 30, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 323, 0, 0, 1501, 0, 0, 0, 0, 0, - 0, 0, 325, 326, 1502, 0, 0, 0, 0, 328, - 329, 330, 302, 10, 11, 12, 1503, 14, 537, 304, - 305, 0, 306, 16, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 332, 0, 0, 18, 307, 19, - 0, 21, 0, 308, 309, 22, 0, 310, 311, 312, - 23, 313, 314, 0, 25, 0, 0, 0, 315, 316, - 317, 318, 319, 28, 0, 320, 30, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 323, 0, 0, 324, - 0, 0, 0, 0, 0, 0, 0, 325, 326, 327, - 0, 0, 0, 0, 328, 329, 330, 302, 10, 11, - 12, 538, 14, 537, 304, 305, 0, 306, 16, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 332, - 0, 0, 18, 307, 19, 0, 21, 0, 308, 309, - 22, 0, 310, 311, 312, 23, 313, 314, 0, 25, - 0, 0, 0, 315, 316, 317, 318, 319, 28, 0, - 320, 30, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 323, 0, 0, 324, 0, 0, 0, 0, 0, - 0, 0, 325, 326, 327, 0, 0, 0, 0, 328, - 329, 330, 302, 10, 11, 12, 541, 14, 537, 304, - 305, 0, 306, 16, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 332, 0, 0, 18, 307, 19, - 0, 21, 0, 308, 309, 22, 0, 310, 311, 312, - 23, 313, 314, 0, 25, 0, 0, 0, 315, 316, - 317, 318, 319, 28, 0, 320, 30, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 323, 0, 8, 324, - 9, 10, 11, 12, 13, 14, 15, 325, 326, 327, - 0, 16, 0, 0, 328, 329, 330, 0, 0, 0, - 0, 331, 0, 0, 17, 18, 0, 19, 20, 21, - 0, 0, 0, 22, 0, 0, 0, 0, 23, 332, - 0, 24, 25, 26, 0, 27, 0, 0, 0, 0, - 0, 28, 0, 29, 30, 0, 168, 31, 9, 10, - 11, 12, 169, 14, 15, 0, 0, 32, 0, 16, - 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, - 0, 0, 34, 18, 0, 19, 20, 21, 0, 35, - 0, 22, 0, 0, 0, 36, 23, 0, 0, 0, - 25, 0, 0, 170, 0, 0, 0, 0, 0, 28, - 0, 29, 30, 0, 8, 0, 9, 10, 11, 12, - 13, 14, 15, 0, 0, 32, 0, 16, 0, 0, - 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, - 34, 18, 0, 19, 20, 0, 0, 35, 0, 22, - 0, 0, 0, 36, 23, 0, 0, 0, 25, 0, - 0, 440, 0, 0, 0, 0, 0, 28, 0, 29, - 30, 0, 0, 31, 0, 9, 10, 11, 12, 169, - 14, 15, 0, 32, 1002, 0, 16, 0, 0, 0, - 0, 0, 0, 33, 0, 0, 0, 0, 34, 0, - 18, 0, 19, 20, 0, 35, 0, 0, 22, 0, - 0, 0, 0, 23, 0, 0, 0, 25, 0, 0, - 0, 0, 0, 0, 0, 0, 28, 0, 29, 30, - 0, 0, 0, 1039, 10, 767, 12, 207, 14, 208, - 0, 0, 32, 0, 16, 0, 0, 0, 0, 0, - 0, 0, 33, 0, 0, 0, 0, 34, 18, 0, - 19, 20, 0, 0, 35, 0, 22, 0, 0, 0, - 0, 23, 0, 0, 0, 25, 0, 0, 0, 0, - 0, 0, 0, 0, 28, 0, 29, 30, 0, 0, - 0, 0, 1041, 9, 10, 11, 12, 207, 14, 208, - 32, 0, 0, 0, 16, 0, 0, 0, 0, 0, - 33, 0, 0, 0, 0, 34, 0, 0, 18, 0, - 19, 20, 35, 0, 0, 0, 22, 0, 0, 0, - 0, 23, 0, 0, 0, 25, 0, 0, 0, 0, - 0, 0, 0, 0, 28, 0, 29, 30, 0, 0, - 1425, 9, 10, 11, 12, 169, 14, 15, 0, 0, - 32, 0, 16, 0, 0, 0, 0, 0, 0, 0, - 33, 0, 0, 0, 0, 34, 18, 0, 19, 20, - 0, 0, 35, 0, 22, 0, 0, 0, 0, 23, - 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, - 0, 0, 28, 0, 29, 30, 0, 0, 0, 9, - 10, 11, 12, 207, 14, 208, 0, 0, 32, 0, - 16, 0, 0, 0, 0, 0, 0, 0, 33, 0, - 0, 0, 0, 34, 18, 0, 19, 20, 0, 0, - 35, 0, 22, 0, 0, 0, 0, 23, 0, 0, - 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, - 28, 0, 29, 30, 0, 0, 0, 20, 0, 0, - 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, - 0, 34, 0, 0, 0, 0, 0, 0, 35, 573, - 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, - 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, - 594, 10, 11, 0, 169, 14, 15, 0, 0, 734, - 0, 16, 0, 0, 10, 11, 0, 169, 14, 15, - 0, 0, 1553, 0, 16, 18, 0, 19, 20, 0, - 0, 0, 0, 22, 0, 0, 0, 0, 18, 0, - 19, 20, 25, 0, 0, 0, 22, 0, 0, 0, - 0, 28, 0, 132, 133, 25, 0, 0, 0, 0, - 0, 0, 0, 0, 28, 0, 132, 133, 573, 574, - 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, - 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, - 593, 594, 0, 0, 0, 0, 1240, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 662, 0, 0, 1549, 573, 574, 575, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, - 588, 589, 590, 591, 592, 593, 594, 1567, 573, 574, - 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, - 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, - 593, 594, 573, 574, 575, 576, 577, 578, 579, 580, - 581, 582, 583, 0, 585, 586, 587, 588, 589, 590, - 591, 592, 593, 594, 577, 578, 579, 580, 581, 582, - 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, - 593, 594, 578, 579, 580, 581, 582, 583, 584, 585, - 586, 587, 588, 589, 590, 591, 592, 593, 594, 579, - 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 594, 580, 581, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 591, 592, 593, 594 -}; - -static const yytype_int16 yycheck[] = -{ - 6, 176, 151, 152, 178, 25, 211, 57, 163, 177, - 6, 351, 128, 719, 404, 82, 457, 158, 16, 6, - 404, 253, 92, 6, 94, 48, 44, 484, 357, 357, - 568, 37, 136, 82, 306, 307, 865, 44, 44, 86, - 625, 37, 375, 61, 249, 126, 648, 632, 442, 718, - 37, 6, 404, 59, 37, 78, 694, 44, 44, 135, - 136, 44, 505, 135, 44, 11, 1390, 339, 74, 1483, - 605, 141, 64, 219, 220, 56, 1306, 32, 33, 146, - 86, 11, 37, 462, 90, 6, 92, 85, 94, 44, - 1484, 44, 11, 298, 1482, 1, 765, 1, 211, 33, - 771, 703, 773, 109, 110, 37, 6, 220, 59, 780, - 108, 789, 73, 62, 1211, 1212, 37, 795, 60, 701, - 6, 562, 492, 44, 12, 357, 35, 177, 1225, 1316, - 9, 86, 138, 1530, 140, 141, 1323, 37, 205, 1527, - 58, 511, 6, 62, 44, 63, 351, 38, 1506, 0, - 142, 37, 58, 171, 58, 82, 62, 62, 109, 108, - 167, 167, 108, 54, 171, 171, 158, 109, 1526, 626, - 1564, 59, 178, 37, 62, 109, 157, 109, 108, 106, - 44, 1578, 61, 138, 171, 171, 86, 47, 171, 108, - 96, 171, 215, 211, 1, 1609, 151, 152, 8, 9, - 540, 219, 220, 108, 14, 54, 35, 59, 135, 4, - 5, 73, 167, 62, 9, 264, 171, 138, 171, 146, - 108, 202, 214, 25, 902, 27, 36, 1585, 59, 0, - 222, 249, 92, 93, 60, 45, 1624, 47, 138, 47, - 195, 196, 151, 152, 153, 1569, 167, 239, 108, 12, - 171, 58, 250, 1483, 1351, 62, 58, 358, 359, 54, - 62, 56, 57, 1360, 1361, 0, 1363, 167, 58, 47, - 6, 171, 348, 54, 138, 70, 348, 108, 205, 720, - 298, 6, 92, 109, 92, 80, 138, 48, 197, 96, - 360, 395, 73, 299, 96, 450, 59, 344, 93, 62, - 1487, 37, 47, 167, 59, 943, 387, 171, 98, 410, - 411, 12, 37, 240, 92, 308, 309, 645, 59, 713, - 714, 906, 151, 152, 153, 331, 178, 476, 477, 864, - 108, 324, 684, 351, 327, 328, 918, 264, 344, 921, - 333, 674, 488, 489, 337, 92, 352, 92, 1026, 1536, - 496, 741, 345, 108, 360, 361, 406, 741, 59, 357, - 1038, 62, 63, 108, 510, 950, 54, 108, 197, 9, - 59, 60, 12, 47, 62, 27, 489, 92, 60, 31, - 962, 963, 614, 529, 60, 73, 54, 92, 59, 344, - 408, 25, 1063, 27, 1072, 184, 1074, 737, 404, 1586, - 47, 407, 25, 74, 27, 73, 361, 47, 60, 947, - 27, 63, 997, 1015, 31, 1512, 1513, 404, 92, 59, - 1249, 61, 62, 63, 58, 73, 444, 109, 62, 356, - 500, 47, 12, 109, 74, 58, 76, 444, 444, 62, - 361, 59, 59, 60, 344, 92, 903, 27, 25, 404, - 27, 31, 92, 93, 3, 4, 5, 109, 444, 508, - 452, 361, 96, 25, 470, 535, 73, 47, 108, 47, - 488, 489, 47, 96, 44, 498, 92, 93, 496, 59, - 60, 58, 62, 63, 54, 62, 56, 414, 867, 444, - 108, 47, 510, 74, 500, 76, 58, 361, 92, 62, - 62, 1170, 508, 495, 404, 4, 5, 56, 57, 361, - 73, 529, 92, 93, 92, 470, 47, 92, 93, 96, - 58, 476, 477, 444, 62, 508, 59, 60, 108, 535, - 60, 80, 538, 108, 96, 541, 92, 712, 1207, 545, - 546, 547, 548, 549, 444, 986, 4, 5, 649, 48, - 1379, 25, 558, 508, 944, 1137, 1138, 56, 57, 606, - 944, 92, 568, 556, 557, 571, 47, 476, 477, 478, - 470, 675, 47, 1016, 1159, 1018, 60, 504, 682, 1022, - 444, 80, 63, 912, 912, 7, 62, 508, 802, 803, - 804, 27, 944, 4, 5, 31, 54, 73, 56, 57, - 606, 651, 482, 1188, 107, 532, 682, 677, 508, 814, - 490, 92, 70, 759, 47, 37, 47, 92, 93, 625, - 4, 5, 80, 59, 60, 54, 632, 63, 3, 4, - 5, 6, 63, 108, 652, 93, 908, 48, 636, 47, - 690, 47, 692, 693, 508, 56, 57, 476, 477, 478, - 31, 606, 47, 58, 1111, 63, 508, 54, 73, 92, - 93, 92, 93, 683, 48, 62, 41, 622, 623, 1338, - 625, 677, 56, 57, 54, 693, 73, 632, 54, 54, - 912, 56, 57, 109, 92, 691, 92, 737, 47, 695, - 54, 47, 619, 73, 47, 70, 80, 92, 718, 47, - 3, 4, 5, 6, 805, 80, 606, 54, 635, 73, - 85, 54, 1091, 1092, 47, 35, 58, 92, 62, 737, - 790, 791, 771, 793, 773, 625, 73, 54, 778, 73, - 779, 780, 632, 92, 93, 741, 92, 786, 41, 92, - 3, 759, 92, 6, 92, 48, 73, 3, 4, 5, - 54, 774, 775, 56, 57, 3, 4, 5, 54, 92, - 783, 1204, 1205, 1206, 59, 771, 1106, 773, 31, 910, - 108, 4, 5, 779, 780, 47, 9, 80, 41, 74, - 786, 76, 85, 789, 790, 791, 741, 793, 771, 795, - 773, 109, 110, 56, 57, 970, 814, 780, 54, 47, - 56, 57, 58, 786, 47, 1184, 54, 70, 56, 57, - 3, 4, 5, 6, 1193, 1194, 771, 80, 773, 1198, - 92, 54, 85, 56, 57, 780, 4, 5, 74, 92, - 108, 786, 152, 153, 789, 54, 937, 70, 93, 47, - 795, 741, 108, 62, 92, 4, 5, 80, 41, 92, - 771, 108, 773, 33, 73, 48, 62, 863, 47, 780, - 11, 1240, 868, 56, 57, 786, 1572, 73, 109, 985, - 48, 771, 98, 773, 60, 47, 92, 197, 56, 57, - 780, 3, 54, 876, 92, 60, 786, 80, 955, 789, - 896, 54, 85, 4, 5, 795, 902, 56, 57, 62, - 906, 73, 80, 92, 111, 54, 73, 771, 62, 773, - 73, 904, 905, 62, 912, 62, 780, 93, 910, 771, - 92, 773, 786, 54, 73, 93, 778, 779, 780, 4, - 5, 62, 47, 44, 786, 4, 5, 111, 944, 54, - 946, 947, 73, 54, 950, 56, 57, 902, 92, 904, - 905, 906, 59, 60, 47, 92, 1335, 944, 73, 73, - 1401, 54, 59, 143, 73, 1066, 1067, 1068, 148, 3, - 4, 5, 6, 762, 73, 1315, 1417, 92, 73, 1029, - 73, 56, 57, 1050, 911, 54, 913, 56, 57, 944, - 11, 997, 109, 948, 949, 950, 785, 1376, 108, 92, - 59, 1050, 902, 108, 1010, 108, 906, 41, 1157, 1158, - 108, 331, 73, 331, 1063, 54, 196, 4, 5, 1042, - 1026, 73, 56, 57, 73, 1048, 1049, 108, 955, 1052, - 1053, 109, 1038, 1056, 4, 5, 109, 1186, 1187, 4, - 5, 950, 997, 111, 944, 1115, 4, 5, 59, 111, - 950, 85, 63, 3, 4, 5, 27, 1063, 59, 59, - 60, 48, 73, 74, 108, 1506, 1072, 73, 1074, 56, - 57, 1026, 73, 74, 73, 76, 1107, 1108, 54, 1110, - 1063, 261, 47, 1038, 54, 1526, 56, 57, 997, 54, - 48, 56, 57, 80, 1161, 73, 1102, 997, 56, 57, - 70, 3, 4, 5, 6, 70, 56, 57, 1063, 1115, - 80, 431, 432, 111, 1555, 80, 111, 1072, 108, 1074, - 1113, 950, 80, 1050, 108, 90, 1026, 92, 93, 108, - 1520, 59, 60, 3, 4, 5, 1520, 58, 1038, 41, - 1314, 108, 1063, 54, 1585, 1313, 48, 1315, 8, 467, - 1170, 111, 1593, 1159, 56, 57, 92, 477, 478, 1260, - 59, 60, 16, 1063, 83, 84, 59, 60, 997, 47, - 24, 63, 1072, 1222, 1074, 1181, 59, 1029, 80, 59, - 60, 54, 1188, 85, 1524, 1181, 56, 57, 58, 92, - 36, 8, 9, 1186, 1187, 109, 1202, 14, 1181, 1063, - 59, 60, 1157, 1158, 1159, 60, 63, 1134, 3, 4, - 5, 1063, 63, 67, 4, 5, 59, 60, 538, 36, - 538, 541, 63, 541, 108, 60, 1181, 545, 45, 108, - 62, 1186, 1187, 1188, 1161, 1614, 108, 557, 558, 108, - 558, 421, 1031, 1032, 424, 3, 4, 5, 1157, 1158, - 1159, 571, 108, 571, 63, 108, 436, 575, 48, 1159, - 1181, 56, 57, 1313, 63, 1315, 56, 57, 3, 4, - 5, 1060, 126, 111, 63, 62, 74, 1186, 1187, 1188, - 108, 1181, 108, 108, 602, 108, 108, 108, 1188, 74, - 80, 609, 472, 74, 474, 1222, 150, 1315, 56, 57, - 1306, 80, 81, 82, 83, 84, 74, 487, 1314, 74, - 1316, 108, 632, 1306, 404, 62, 62, 1323, 59, 1524, - 1316, 56, 57, 1306, 108, 62, 1332, 1323, 1157, 1158, - 1159, 108, 108, 1316, 93, 1358, 1359, 111, 32, 33, - 1323, 35, 111, 1498, 73, 85, 47, 3, 4, 5, - 111, 1306, 1501, 1502, 3, 4, 5, 1186, 1187, 1188, - 108, 1316, 111, 108, 108, 59, 108, 61, 1323, 108, - 60, 109, 108, 67, 4, 5, 109, 1552, 59, 9, - 470, 30, 3, 4, 5, 1306, 240, 241, 3, 4, - 5, 63, 3, 4, 5, 1316, 7, 8, 9, 253, - 56, 57, 1323, 63, 1427, 54, 1306, 56, 57, 78, - 79, 80, 81, 82, 83, 84, 1316, 47, 92, 59, - 31, 59, 59, 1323, 54, 36, 56, 57, 1217, 1218, - 108, 1220, 1221, 54, 1223, 56, 57, 108, 92, 54, - 70, 56, 57, 54, 92, 56, 57, 58, 92, 143, - 80, 92, 109, 108, 148, 8, 109, 151, 152, 153, - 90, 108, 92, 93, 195, 196, 197, 109, 111, 323, - 33, 1477, 108, 108, 108, 1525, 1482, 1483, 1484, 108, - 108, 1487, 63, 108, 178, 111, 1482, 54, 808, 108, - 184, 1487, 103, 104, 105, 108, 108, 1503, 108, 1482, - 1483, 195, 196, 197, 1487, 108, 1524, 108, 1501, 1502, - 62, 365, 111, 47, 1520, 108, 108, 211, 108, 1428, - 374, 1527, 1477, 95, 62, 219, 220, 1482, 1483, 1484, - 1536, 1527, 1487, 387, 1557, 625, 62, 60, 60, 9, - 1536, 60, 632, 16, 1527, 92, 1501, 1502, 3, 4, - 5, 108, 108, 1536, 872, 92, 60, 108, 1564, 1348, - 1349, 1482, 1483, 108, 108, 1520, 1487, 261, 748, 749, - 60, 751, 1527, 108, 63, 108, 108, 1477, 54, 92, - 1586, 1536, 1482, 1483, 1484, 905, 906, 1487, 906, 92, - 1586, 111, 1501, 1502, 1503, 3, 4, 5, 6, 1428, - 17, 56, 57, 1586, 60, 54, 1527, 107, 60, 1564, - 97, 108, 108, 108, 108, 1536, 11, 60, 1624, 60, - 1520, 60, 3, 4, 5, 6, 92, 1527, 1624, 59, - 950, 1586, 63, 41, 108, 60, 1536, 331, 11, 108, - 108, 1624, 90, 11, 92, 60, 94, 60, 56, 57, - 504, 741, 0, 3, 4, 5, 172, 7, 8, 9, - 41, 1450, 1451, 1452, 1564, 1586, 3, 48, 37, 1624, - 675, 1415, 1501, 1502, 1503, 56, 57, 997, 171, 944, - 444, 463, 4, 5, 167, 1551, 1586, 9, 470, 96, - 779, 1170, 140, 141, 240, 140, 3, 4, 5, 789, - 1400, 1624, 1250, 1624, 85, 795, 56, 57, 3, 4, - 5, 725, 301, 407, 408, 930, 570, 245, 1338, 1207, - 1509, 1510, 925, 786, 1624, 47, 779, 421, 1224, 658, - 424, 923, 54, 126, 56, 57, 430, 431, 432, 606, - 202, 472, 436, 474, 348, 476, 477, 478, 70, 56, - 57, 1316, 1182, 48, 536, 1593, 487, 463, 80, 1572, - 614, 56, 57, 1603, 470, 1541, 1605, 1005, 90, 949, - 92, 93, 1332, 3, 4, 5, -1, -1, 472, -1, - 474, -1, 476, 477, 478, -1, -1, 481, 1577, -1, - -1, -1, -1, 487, 488, 489, -1, -1, 492, -1, - -1, -1, 496, -1, -1, 3, 4, 5, 6, -1, - -1, 9, 902, -1, 596, -1, 906, 511, 48, 601, - -1, -1, -1, -1, -1, -1, 56, 57, -1, 683, - 536, -1, -1, 31, -1, -1, -1, -1, 1158, 1159, - 694, -1, -1, 41, 538, -1, -1, 541, -1, -1, - 632, -1, -1, -1, 944, -1, 54, 639, 56, 57, - 950, -1, 556, 557, 558, -1, -1, 1187, 1188, -1, - 1188, 725, 70, -1, 322, -1, -1, 571, -1, -1, - -1, -1, 80, -1, 1202, -1, -1, 85, -1, -1, - 596, -1, -1, -1, 92, 601, -1, 3, 4, 5, - 6, -1, -1, 3, 4, 5, 6, 997, -1, 9, - -1, -1, 360, -1, 3, 4, 5, 6, 1236, 1237, - 1238, 1239, -1, -1, 3, 4, 5, 6, -1, -1, - -1, 31, -1, 639, -1, 41, 1026, -1, 632, -1, - -1, 41, 48, -1, -1, -1, -1, 47, 1038, -1, - 56, 57, 41, -1, 54, -1, 56, 57, 652, 48, - -1, -1, 41, -1, -1, -1, -1, 56, 57, 48, - 70, -1, -1, -1, 80, 1155, 1156, 56, 57, 85, - 80, 1299, 1072, 1163, 1074, 85, -1, -1, 47, -1, - 90, 80, 92, 93, -1, -1, 85, 691, -1, 693, - 694, -1, -1, -1, -1, -1, 85, -1, 3, 4, - 5, 6, -1, -1, 462, 463, -1, 748, 749, -1, - 751, -1, 470, -1, -1, -1, 808, 86, 87, -1, - -1, -1, 91, 92, 93, 94, 350, 351, 352, -1, - -1, -1, -1, 737, -1, -1, 41, 778, -1, -1, - -1, -1, 500, 48, 748, 749, -1, 751, -1, 1377, - -1, 56, 57, -1, -1, 759, -1, -1, 762, 1159, - -1, -1, 7, 8, 9, -1, 930, -1, -1, 14, - 862, 863, -1, -1, -1, 779, 868, 535, 536, 943, - 85, 785, 1410, -1, 1274, 1275, 31, 1277, 1188, -1, - 882, 36, 884, -1, 886, -1, -1, -1, 1428, -1, - 45, -1, -1, -1, 808, -1, 3, 4, 5, 6, - 568, -1, 570, -1, -1, 573, 574, -1, 576, 577, - 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, - 588, 589, 590, 591, 592, 593, 594, -1, 596, -1, - 932, -1, -1, 601, 41, -1, 862, 863, -1, 1477, - -1, -1, 868, -1, -1, 1483, 1484, 54, -1, 56, - 57, -1, -1, -1, -1, -1, 882, -1, 884, -1, - 886, -1, 1502, 1503, 632, 1503, 3, 4, 5, 6, - -1, 639, -1, -1, -1, -1, 978, -1, 85, 76, - 77, 78, 79, 80, 81, 82, 83, 84, -1, -1, - 904, 905, 906, 661, 662, 997, -1, 948, 949, 950, - -1, 7, 8, 9, 41, -1, 932, -1, 14, 677, - 47, -1, -1, -1, -1, -1, -1, 54, 1092, 56, - 57, -1, -1, -1, -1, 31, 1564, 4, 5, 943, - 36, 8, 9, 70, 948, 949, 950, 14, -1, 45, - -1, -1, 1580, 80, -1, -1, 997, -1, 85, -1, - -1, -1, 978, 90, 60, 92, 93, 725, -1, 36, - -1, -1, -1, -1, 1602, -1, -1, -1, 45, -1, - 47, 1609, -1, -1, -1, -1, -1, 54, 1029, 56, - 57, -1, -1, 997, -1, -1, -1, -1, 622, 623, - -1, 625, -1, 70, -1, -1, -1, -1, 632, -1, - 4, 5, 770, 80, 1178, 9, 350, 351, 352, -1, - 1184, -1, -1, 90, -1, 92, 93, 1031, 1032, -1, - -1, -1, 790, 791, -1, 793, -1, -1, -1, 3, - 4, 5, 6, -1, -1, -1, -1, -1, -1, -1, - 808, -1, -1, 47, -1, -1, 1060, -1, 757, -1, - 54, -1, 56, 57, -1, -1, 690, -1, 692, 693, - -1, 695, 830, -1, 38, 39, 70, 41, -1, -1, - 1172, -1, 1174, -1, 1176, -1, 80, -1, -1, 788, - 54, -1, 56, 57, -1, 794, 90, -1, 92, 93, - -1, 7, 8, 9, 862, 863, -1, -1, 14, 867, - 868, -1, -1, 737, 1155, 1156, 1157, 1158, 1159, -1, - 1520, -1, 1163, -1, 882, 31, 884, -1, 886, -1, - 36, -1, -1, -1, -1, -1, 1300, 1301, -1, 45, - -1, -1, -1, -1, -1, 1186, 1187, 1188, -1, -1, - -1, 1155, 1156, 1157, 1158, 1159, 1172, -1, 1174, 1163, - 1176, -1, -1, -1, 922, -1, -1, -1, -1, -1, - 3, 4, 5, 6, 932, -1, -1, -1, 1219, 1271, - -1, -1, 1186, 1187, 1188, -1, -1, -1, -1, 947, - 814, -1, -1, -1, -1, -1, -1, -1, 897, -1, - 899, -1, 960, -1, -1, -1, -1, -1, 41, -1, - -1, -1, -1, 1217, 1218, -1, 1220, 1221, -1, 1223, - 978, 54, -1, 56, 57, -1, -1, 60, 1392, 62, - -1, -1, -1, 1274, 1275, -1, 1277, 70, -1, 997, - 3, 4, 5, 6, -1, -1, -1, 80, 6, -1, - 1414, 1415, 85, -1, -1, 1271, -1, -1, 16, 92, - -1, -1, -1, 887, -1, 889, -1, -1, 26, -1, - 1274, 1275, -1, 1277, 32, 33, 900, 35, 41, 37, - 904, 905, 906, 1041, -1, -1, 44, -1, 622, 623, - -1, 54, -1, 56, 57, -1, -1, 60, -1, 57, - -1, 59, -1, -1, -1, -1, -1, 70, -1, 67, - 1314, 1315, -1, -1, -1, -1, 74, 80, -1, -1, - -1, -1, 85, -1, 948, 949, 950, 85, 86, 92, - -1, 1495, -1, 1091, 1092, -1, 1428, 1095, -1, 7, - 8, 9, -1, -1, 1348, 1349, 14, -1, -1, -1, - 108, -1, -1, -1, -1, -1, 690, 1115, 692, 693, - -1, 695, -1, 31, -1, -1, -1, -1, 36, -1, - -1, -1, 1071, 997, 1073, -1, -1, 45, 136, -1, - 138, -1, -1, -1, 142, 143, -1, 1428, -1, 147, - 148, -1, 60, 151, 152, 153, -1, -1, -1, -1, - -1, 4, 5, 737, -1, 8, 9, -1, -1, 167, - -1, 14, -1, 171, 1172, -1, 1174, -1, 1176, 177, - 178, -1, -1, -1, 1428, 28, 1184, 30, -1, 1128, - -1, -1, -1, 36, -1, 1193, 1194, 195, 196, 197, - 1198, -1, 45, -1, 47, -1, 1450, 1451, 1452, -1, - -1, 54, -1, 56, 57, -1, -1, 1215, 1216, -1, - 1501, 1502, 1503, -1, -1, -1, 224, 70, -1, 4, - 5, -1, -1, 8, 9, -1, -1, 80, -1, 14, - 814, -1, 1240, 241, -1, -1, -1, 90, -1, 92, - 93, -1, 250, 28, -1, 30, -1, 1501, 1502, 1503, - -1, 36, -1, 261, -1, 1509, 1510, -1, -1, 1208, - 45, -1, -1, 1271, 1213, -1, -1, -1, -1, 54, - -1, 56, 57, 58, -1, -1, -1, -1, -1, -1, - -1, 1155, 1156, 1157, 1158, 1159, -1, 1295, -1, 1163, - -1, 299, 300, -1, 3, 4, 5, 6, -1, -1, - 9, -1, -1, 887, -1, 889, -1, 92, -1, -1, - -1, -1, 1186, 1187, 1188, 1264, 900, -1, -1, -1, - 904, 905, 31, 1577, 3, 4, 5, 1335, 7, 8, - 9, -1, 41, -1, -1, -1, 344, -1, 47, -1, - 348, -1, 350, 351, 352, 54, 1354, 56, 57, -1, - -1, -1, 31, 361, -1, -1, -1, 36, -1, -1, - -1, 70, -1, -1, 948, 949, -1, -1, 1376, -1, - -1, 80, -1, -1, -1, -1, 85, 56, 57, -1, - -1, 90, -1, 92, 93, -1, -1, 395, -1, -1, - -1, -1, -1, -1, -1, -1, 404, -1, 406, 407, - 1274, 1275, -1, 1277, 3, 4, 5, -1, 7, 3, - 4, 5, 6, 421, -1, 9, 424, -1, 1367, 1368, - 1428, -1, -1, -1, -1, -1, -1, -1, 436, -1, - -1, 30, -1, -1, -1, 1384, 444, 31, 37, -1, - 1448, 1449, -1, -1, -1, -1, -1, 41, -1, 1457, - -1, -1, -1, 47, -1, 54, -1, 56, 57, -1, - 54, -1, 56, 57, 472, -1, 474, -1, 476, 477, - 478, -1, -1, -1, 482, -1, 70, 1485, -1, 487, - 4, 5, 490, 7, 8, 9, 80, -1, 12, -1, - 14, 85, -1, -1, 1443, 1444, 90, -1, 92, 93, - 508, -1, -1, -1, 28, -1, 30, 31, -1, -1, - -1, -1, 36, 1462, 1463, -1, -1, -1, -1, -1, - -1, 45, -1, 47, -1, -1, -1, -1, -1, -1, - 54, -1, 56, 57, -1, -1, -1, -1, 546, 547, - 548, 549, -1, -1, -1, -1, 70, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 80, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 90, -1, 92, 93, - -1, 1155, 1156, 1157, 1158, -1, -1, -1, 1, 1163, - 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, - -1, 14, -1, -1, -1, -1, -1, -1, 606, -1, - 608, -1, 1186, 1187, -1, 28, 1614, 30, 31, 32, - -1, -1, 620, 36, 622, 623, -1, 625, 41, -1, - -1, -1, 45, 46, 632, 48, -1, -1, 636, -1, - -1, 54, -1, 56, 57, -1, -1, 60, -1, 62, - -1, -1, -1, 651, -1, -1, -1, 70, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 80, -1, -1, - -1, -1, 85, -1, -1, -1, -1, 675, 1, 92, - 3, 4, 5, 6, 682, 8, 9, 10, 11, -1, - 13, 14, 690, 691, 692, 693, 694, 695, -1, -1, - 1274, 1275, -1, 1277, -1, 28, 29, 30, 31, 32, - -1, 34, 35, 36, -1, 38, 39, 40, 41, 42, - 43, -1, 45, -1, -1, -1, 49, 50, 51, 52, - 53, 54, -1, 56, 57, 58, -1, -1, 61, 737, - -1, -1, -1, 741, 67, -1, -1, 70, -1, -1, - 748, 749, -1, 751, -1, 78, 79, 80, -1, -1, - -1, -1, 85, 86, 87, -1, -1, -1, -1, 92, - 768, -1, -1, 771, -1, 773, -1, -1, -1, -1, - 778, 779, 780, -1, -1, 4, 5, 110, 786, 8, - 9, 789, -1, -1, -1, 14, -1, 795, -1, -1, - -1, -1, -1, -1, 802, 803, 804, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 814, 36, -1, -1, - -1, -1, -1, -1, -1, -1, 45, -1, 47, 6, - -1, -1, -1, -1, -1, 54, -1, 56, 57, 16, - -1, -1, -1, -1, -1, -1, -1, -1, 25, 26, - -1, 70, -1, -1, -1, 32, 33, -1, 35, -1, - 37, 80, -1, -1, -1, -1, -1, 44, -1, -1, - -1, 90, -1, 92, 93, -1, -1, -1, -1, -1, - 57, -1, 59, -1, -1, -1, -1, -1, -1, 887, - 67, 889, -1, -1, -1, -1, -1, 74, 896, -1, - -1, -1, 900, -1, 902, -1, 904, 905, 906, 86, - -1, -1, -1, -1, 912, -1, 3, 4, 5, 6, - 7, 8, 9, -1, -1, 12, -1, 14, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 28, -1, 30, 31, -1, 944, -1, 946, 36, - 948, 949, 950, -1, 41, -1, -1, -1, 45, -1, - 47, 138, -1, -1, -1, 142, 143, 54, -1, 56, - 57, 148, -1, -1, 151, 152, 153, -1, -1, 3, - 4, 5, 6, 70, -1, 9, -1, -1, -1, -1, - 167, -1, -1, 80, 171, -1, -1, -1, 85, 997, - 177, 178, -1, 90, -1, 92, 93, 31, -1, -1, - -1, -1, 1010, -1, -1, -1, -1, 41, 195, 196, - 197, -1, -1, 47, -1, -1, -1, -1, 1026, -1, - 54, 1029, 56, 57, -1, -1, -1, -1, -1, -1, - 1038, -1, -1, -1, -1, -1, 70, 224, -1, -1, - -1, -1, -1, 1051, -1, -1, 80, -1, -1, -1, - -1, 85, -1, 6, -1, 1063, 90, -1, 92, 93, - -1, -1, -1, -1, 1072, -1, 1074, -1, 1, -1, - 3, 4, 5, 6, 261, 8, -1, -1, -1, 32, - 33, -1, 35, -1, 37, 4, 5, -1, -1, 8, - 9, 44, -1, -1, 1102, 14, -1, -1, -1, 1107, - 1108, -1, 1110, -1, 57, -1, 59, -1, 41, 28, - -1, 30, 299, 300, -1, 48, -1, 36, -1, -1, - -1, 54, -1, 56, 57, -1, 45, -1, -1, 82, - -1, -1, -1, -1, -1, 54, -1, 56, 57, -1, - -1, -1, -1, -1, -1, -1, -1, 1155, 1156, 1157, - 1158, 1159, 85, -1, -1, 1163, -1, 344, -1, -1, - -1, 348, -1, 350, 351, 352, -1, -1, -1, -1, - 357, -1, -1, 92, 361, -1, -1, -1, 1186, 1187, - 1188, -1, 135, 136, -1, 138, -1, -1, -1, 142, - 143, -1, -1, 146, -1, 148, -1, -1, 151, 152, - 153, -1, -1, -1, -1, 158, -1, -1, 395, -1, - -1, 1219, -1, -1, 167, -1, 1224, 404, 171, 406, - 407, -1, 4, 5, 177, 178, 8, 9, -1, -1, - -1, -1, 14, -1, 421, -1, -1, 424, -1, -1, - -1, -1, 195, 196, 197, -1, 28, -1, 30, 436, - -1, -1, 205, -1, 36, -1, -1, 444, -1, -1, - -1, -1, -1, 45, -1, -1, 1274, 1275, -1, 1277, - -1, 224, 54, -1, 56, 57, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 472, -1, 474, -1, 476, - 477, 478, -1, -1, -1, 482, -1, -1, -1, -1, - 487, -1, -1, 490, -1, 1313, 1314, 1315, 261, -1, - 1, -1, 3, 4, 5, 6, 7, 8, 9, -1, - -1, 508, -1, 14, 1332, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 28, -1, 30, - 31, 32, -1, -1, -1, 36, 37, -1, -1, -1, - 41, -1, -1, -1, 45, 46, -1, 48, -1, 546, - 547, 548, 549, 54, -1, 56, 57, -1, -1, 60, - -1, 62, -1, -1, 3, 4, 5, 6, 331, 70, - 9, 4, 5, -1, -1, 8, 9, -1, -1, 80, - -1, 14, -1, -1, 85, 348, -1, -1, -1, -1, - -1, 92, 31, 356, -1, 28, -1, 30, 361, -1, - -1, -1, 41, 36, -1, -1, -1, -1, 109, 606, - 1428, 608, 45, -1, -1, 54, -1, 56, 57, -1, - -1, 54, -1, 56, 57, 622, 623, -1, 625, -1, - -1, 70, 395, -1, -1, 632, -1, -1, -1, -1, - -1, 80, -1, 406, -1, -1, 85, -1, 645, -1, - -1, -1, -1, 92, 651, -1, -1, -1, 421, -1, - -1, 424, -1, -1, -1, -1, -1, 430, 431, 432, - -1, -1, -1, 436, -1, -1, -1, -1, 675, 6, - -1, 444, -1, 1501, 1502, 1503, 683, -1, 3, 4, - 5, 6, -1, 690, 691, 692, 693, 694, 695, -1, - -1, -1, 1520, -1, -1, -1, -1, 1525, -1, 472, - 37, 474, -1, 476, 477, 478, 31, 44, -1, 482, - -1, 718, -1, -1, 487, -1, 41, 490, -1, -1, - 57, -1, 59, -1, -1, -1, -1, -1, -1, 54, - 737, 56, 57, -1, 741, 508, -1, -1, -1, -1, - -1, 748, 749, -1, 751, 70, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 80, -1, -1, 765, -1, - 85, 768, -1, -1, 771, 538, 773, 92, 541, -1, - -1, 778, 779, 780, -1, -1, -1, -1, -1, 786, - -1, -1, 789, 556, 557, 558, -1, -1, 795, -1, - -1, -1, -1, -1, -1, 802, 803, 804, 571, -1, - -1, 138, -1, -1, -1, 142, -1, 814, -1, -1, - -1, -1, -1, -1, 3, 4, 5, 6, 7, 8, - 9, -1, -1, -1, -1, 14, -1, -1, -1, -1, - 167, -1, -1, -1, 171, -1, -1, -1, -1, -1, - 177, 178, 31, -1, -1, -1, 619, 36, -1, -1, - -1, -1, 41, -1, -1, -1, 45, -1, 47, 632, - -1, -1, -1, -1, -1, 54, -1, 56, 57, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 651, -1, - 887, 70, 889, -1, -1, -1, -1, 224, -1, 896, - -1, 80, -1, 900, -1, 902, 85, 904, 905, 906, - -1, 90, 675, 92, 93, 912, -1, -1, -1, 682, - -1, -1, 3, 4, 5, 6, -1, 690, 691, 692, - 693, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 84, 3, 4, 5, 6, -1, 944, 9, 946, - 31, 948, 949, 950, -1, -1, -1, -1, -1, -1, - 41, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 31, -1, -1, 54, 737, 56, 57, -1, 741, -1, - 41, -1, -1, -1, -1, 748, 749, -1, 751, 70, - -1, -1, -1, 54, -1, 56, 57, -1, -1, 80, - 997, -1, -1, -1, 85, -1, -1, -1, 771, 70, - 773, 92, -1, 1010, -1, 778, 779, 780, 161, 80, - -1, -1, -1, 786, 85, -1, -1, -1, -1, 1026, - -1, 92, 1029, -1, 361, -1, -1, -1, -1, -1, - -1, 1038, -1, -1, -1, 808, -1, -1, -1, -1, - 193, -1, -1, -1, -1, 3, 4, 5, 6, -1, - -1, 9, -1, 206, -1, -1, 1063, -1, -1, -1, - -1, -1, -1, -1, -1, 1072, -1, 1074, -1, 406, - -1, -1, -1, 31, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 41, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 1102, 54, -1, 56, 57, - 1107, 1108, -1, 1110, -1, -1, -1, 444, -1, -1, - -1, -1, 70, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 80, -1, -1, -1, -1, 85, -1, -1, - -1, 904, 905, 906, 92, -1, -1, 910, 911, -1, - -1, -1, -1, -1, -1, 482, -1, -1, 1155, 1156, - 1157, 1158, 1159, 490, -1, -1, 1163, 6, -1, -1, - -1, -1, -1, 1170, -1, 3, 4, 5, 6, -1, - -1, 508, -1, -1, -1, 948, 949, 950, -1, 1186, - 1187, 1188, 955, 32, 33, -1, 35, -1, 37, -1, - -1, -1, -1, 31, -1, 44, -1, -1, -1, -1, - 1207, -1, -1, 41, -1, -1, -1, -1, 57, -1, - 59, -1, 1219, -1, -1, -1, 54, 1224, 56, 57, - -1, -1, -1, -1, 997, -1, -1, -1, -1, -1, - -1, -1, 70, -1, 3, 4, 5, 6, -1, -1, - 9, -1, 80, -1, -1, -1, -1, 85, -1, -1, - -1, -1, -1, -1, 92, -1, 1029, -1, -1, -1, - -1, -1, 31, -1, -1, -1, -1, 1274, 1275, -1, - 1277, -1, 41, -1, -1, -1, -1, 1050, -1, -1, - -1, -1, -1, -1, -1, 54, -1, 56, 57, 138, - 1063, -1, -1, 142, 143, 1302, -1, -1, -1, 148, - -1, 70, 151, 152, 153, -1, 1313, 1314, 1315, -1, - -1, 80, -1, -1, 651, -1, 85, -1, 167, -1, - -1, -1, 171, 92, -1, 1332, -1, 480, 177, 178, - -1, 1338, 485, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 195, 196, 197, -1, - -1, -1, -1, 690, 691, 692, 693, -1, -1, 512, - -1, 1134, -1, -1, -1, 518, -1, 35, -1, -1, - -1, 3, 4, 5, 6, 224, -1, 530, 531, -1, - 533, -1, 1155, 1156, 1157, 1158, 1159, -1, 1161, 57, - 1163, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 737, -1, -1, -1, 741, -1, -1, -1, -1, 41, - -1, -1, 261, 1186, 1187, 1188, -1, -1, -1, -1, - -1, 1428, 54, -1, 56, 57, -1, -1, -1, -1, - 62, -1, -1, -1, 771, -1, 773, -1, 70, -1, - -1, 778, 779, 780, -1, -1, 1219, -1, 80, 786, - -1, 1224, -1, 85, -1, -1, -1, -1, -1, -1, - 92, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 628, 629, -1, -1, -1, - 633, -1, -1, 151, 152, 153, -1, -1, -1, -1, - -1, -1, -1, -1, 1501, 1502, 1503, 3, 4, 5, - 6, 1274, 1275, 9, 1277, -1, -1, -1, 357, 177, - -1, -1, 361, 1520, -1, -1, -1, -1, 1525, -1, - -1, -1, -1, -1, -1, 31, -1, 195, 196, 197, - -1, -1, -1, -1, -1, 41, -1, -1, -1, -1, - 1313, 1314, 1315, -1, -1, -1, -1, -1, 54, -1, - 56, 57, -1, -1, -1, -1, 224, 406, -1, -1, - -1, -1, -1, -1, 70, 57, -1, -1, -1, -1, - -1, -1, 421, -1, 80, 424, -1, -1, -1, 85, - -1, 109, 110, -1, -1, -1, 92, 436, -1, -1, - 82, -1, -1, 85, -1, 444, -1, -1, 3, 4, - 5, 6, 7, 8, 9, -1, -1, -1, -1, 14, - -1, -1, -1, -1, 106, -1, 108, -1, -1, -1, - -1, -1, -1, 472, -1, 474, 31, 476, 477, 478, - -1, 36, 300, 482, -1, -1, 41, -1, 487, -1, - 45, 490, 47, 796, -1, 798, -1, -1, -1, 54, - -1, 56, 57, -1, -1, 1428, -1, -1, -1, 508, - -1, -1, -1, -1, -1, 70, -1, -1, 3, 4, - 5, 6, 7, 8, 9, 80, -1, -1, -1, 14, - 85, -1, 350, 351, 352, 177, -1, 92, -1, -1, - -1, -1, 1029, 28, -1, 30, 31, -1, -1, -1, - -1, 36, -1, 195, 196, 197, 41, -1, -1, -1, - 45, -1, -1, 205, -1, -1, -1, 870, 871, 54, - 873, 56, 57, 12, -1, 60, 1063, -1, 1501, 1502, - 1503, -1, 224, -1, -1, 70, -1, -1, 406, -1, - -1, -1, -1, -1, -1, 80, -1, -1, 901, -1, - 85, -1, 1525, -1, -1, -1, -1, 92, 250, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 620, 264, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, -1, -1, -1, 952, - -1, -1, 651, 331, 472, -1, 474, -1, 476, 477, - 478, -1, -1, -1, 482, -1, -1, -1, -1, 487, - -1, -1, 490, -1, 3, 4, 5, 6, 7, 8, - 9, -1, -1, -1, -1, 14, -1, -1, -1, -1, - -1, 690, 691, 692, 693, -1, -1, -1, -1, 28, - -1, 30, 31, 32, -1, -1, -1, 36, -1, -1, - -1, -1, 41, -1, 356, 357, 45, -1, -1, 48, - -1, -1, 1025, -1, -1, 54, 404, 56, 57, -1, - -1, -1, 1219, -1, 1037, -1, -1, 1224, 737, -1, - -1, 70, 741, -1, -1, -1, -1, -1, -1, 748, - 749, 80, 751, -1, -1, -1, 85, -1, -1, -1, - -1, -1, -1, 92, 406, -1, -1, -1, -1, 98, - -1, -1, 771, -1, 773, -1, -1, -1, -1, 778, - 779, 780, -1, -1, -1, -1, -1, 786, -1, -1, - 608, -1, 470, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 622, 623, -1, 625, -1, -1, - -1, -1, -1, -1, 632, -1, -1, -1, -1, -1, - 1123, -1, -1, -1, -1, -1, 1313, 1314, 1315, -1, - 472, -1, 474, 651, 476, 477, 478, -1, -1, -1, - 482, -1, -1, -1, -1, 487, -1, -1, 490, -1, - 3, 4, 5, 6, 7, 8, 9, -1, -1, 1162, - 538, 14, -1, 541, -1, -1, -1, 545, 546, 547, - 548, 549, 690, -1, 692, 693, -1, 695, 31, -1, - 558, -1, -1, 36, -1, -1, -1, -1, 41, -1, - -1, -1, 45, 571, 47, -1, -1, -1, -1, -1, - -1, 54, -1, 56, 57, -1, -1, -1, -1, -1, - -1, -1, -1, 912, -1, -1, -1, 70, -1, 737, - -1, -1, -1, -1, 1227, -1, -1, 80, 1231, -1, - 748, 749, 85, 751, -1, -1, -1, 90, -1, 92, - 93, -1, -1, -1, -1, -1, -1, 625, -1, 948, - 949, 950, -1, -1, 632, -1, -1, -1, -1, -1, - 778, -1, -1, 1266, -1, -1, -1, -1, -1, -1, - 1, -1, 3, 4, 5, 6, 7, 8, 9, -1, - -1, -1, -1, 14, 802, 803, 804, -1, -1, -1, - -1, -1, -1, 635, 636, -1, 814, 28, 997, 30, - 31, 32, -1, -1, -1, 36, 37, -1, -1, 651, - 41, -1, -1, -1, 45, 46, -1, 48, -1, -1, - -1, -1, -1, 54, -1, 56, 57, -1, -1, 60, - 1029, 62, -1, -1, -1, -1, -1, -1, 1525, 70, - 1343, -1, -1, -1, 1347, -1, -1, -1, 690, 80, - 692, 693, -1, -1, 85, -1, -1, -1, -1, -1, - -1, 92, -1, 741, 1063, -1, 1369, 1370, -1, 887, - -1, 889, 3, 4, 5, 6, -1, -1, 109, -1, - -1, -1, 900, -1, -1, -1, 904, 905, 906, -1, - -1, -1, -1, -1, -1, 737, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 748, 749, -1, 751, - 41, 789, -1, -1, -1, -1, -1, 795, -1, -1, - -1, -1, -1, 54, -1, 56, 57, -1, -1, 60, - 948, 949, 950, -1, -1, -1, 778, -1, -1, 70, - 3, 4, 5, 6, 7, 8, 9, -1, -1, 80, - -1, 14, -1, -1, 85, -1, 1155, 1156, 1157, 1158, - 1159, 92, -1, -1, 1163, 28, -1, 30, 31, -1, - -1, -1, -1, 36, -1, -1, -1, -1, 41, 997, - -1, -1, 45, -1, 47, 863, -1, 1186, 1187, 1188, - -1, 54, -1, 56, 57, -1, -1, 3, 4, 5, - 6, -1, -1, -1, -1, -1, -1, 70, -1, -1, - -1, 1029, -1, -1, -1, -1, -1, 80, 896, -1, - 1219, -1, 85, -1, 902, 1224, -1, 90, 906, 92, - 93, -1, -1, -1, -1, 41, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 54, -1, - 56, 57, -1, -1, -1, -1, 62, -1, -1, -1, - -1, -1, -1, -1, 70, -1, 944, -1, 946, 911, - 912, 913, 950, -1, 80, 1274, 1275, -1, 1277, 85, - -1, -1, -1, -1, -1, -1, 92, -1, -1, 1107, - 1108, -1, 1110, -1, -1, -1, 3, 4, 5, 6, - -1, -1, 9, -1, -1, -1, 948, 949, 950, -1, - -1, 16, -1, 955, 1313, 1314, 1315, -1, -1, 997, - 25, 26, -1, -1, 31, -1, -1, 32, 33, -1, - 35, -1, 1010, -1, 41, -1, -1, 1155, 1156, 1157, - 1158, 1159, -1, 985, -1, 1163, -1, 54, 1026, 56, - 57, 3, 4, 5, 6, 997, -1, 9, -1, -1, - 1038, -1, 67, 70, -1, -1, -1, -1, 1186, 1187, - 1188, -1, -1, 80, -1, -1, -1, -1, 85, 31, - -1, -1, -1, -1, -1, 92, -1, 1029, -1, 41, - -1, -1, -1, -1, 1072, -1, 1074, -1, -1, -1, - -1, 1219, 54, -1, 56, 57, -1, -1, 1050, -1, - -1, 3, 4, 5, 6, -1, -1, -1, 70, -1, - -1, 126, -1, 128, 1102, -1, -1, -1, 80, 1428, - 135, 136, -1, 85, -1, -1, -1, 142, 143, -1, - 92, 146, 147, 148, -1, 150, 151, 152, 153, 41, - -1, -1, -1, -1, -1, -1, 1274, 1275, -1, 1277, - -1, -1, 54, -1, 56, 57, -1, -1, -1, -1, - 62, -1, -1, -1, -1, -1, -1, -1, 70, -1, - -1, 1159, -1, -1, -1, -1, -1, -1, 80, -1, - -1, -1, 1134, 85, -1, 1313, -1, 1315, -1, -1, - 92, -1, 1501, 1502, 1503, -1, -1, -1, -1, -1, - 1188, -1, -1, 1155, 1156, 1157, 1158, 1159, -1, 1161, - -1, 1163, -1, -1, 1202, -1, 1525, -1, -1, -1, - -1, -1, -1, -1, -1, 240, 241, -1, -1, -1, - -1, -1, -1, -1, 1186, 1187, 1188, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 261, -1, 1, -1, - 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, - -1, 14, -1, -1, -1, -1, -1, 1219, -1, -1, - -1, -1, -1, -1, -1, 28, -1, 30, 31, 32, - -1, -1, -1, 36, 37, 300, -1, -1, 41, -1, - -1, -1, 45, 46, -1, 48, -1, -1, -1, -1, - 1428, 54, -1, 56, 57, -1, -1, 60, -1, 62, - -1, -1, -1, -1, -1, -1, -1, 70, -1, -1, - -1, -1, 1274, 1275, -1, 1277, -1, 80, -1, -1, - -1, -1, 85, 348, -1, 350, 351, -1, -1, 92, - -1, -1, -1, -1, 1332, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 109, -1, -1, -1, - -1, 1313, -1, 1315, -1, -1, 4, 5, -1, 7, - 8, 9, -1, 1501, 1502, 1503, 14, -1, -1, -1, - 395, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 28, -1, 30, 31, -1, -1, -1, 1525, 36, 414, - -1, -1, -1, -1, -1, -1, 421, 45, -1, 424, - 48, -1, -1, -1, -1, -1, 54, -1, 56, 57, - -1, 436, 1, -1, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 14, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 28, - 29, 30, 31, 32, -1, 34, 35, 36, -1, 38, - 39, 40, 41, 42, 43, -1, 45, -1, 47, -1, - 49, 50, 51, 52, 53, 54, 1428, 56, 57, 58, - -1, -1, 61, -1, -1, -1, -1, -1, 67, 504, - -1, 70, 4, 5, -1, 7, 8, 9, -1, 78, - 79, 80, 14, -1, -1, -1, 85, 86, 87, -1, - -1, 90, -1, 92, 93, 1503, 28, 532, 30, 31, - -1, -1, -1, -1, 36, -1, -1, -1, -1, -1, - -1, 110, 1520, 45, -1, -1, -1, -1, -1, -1, - -1, -1, 54, -1, 56, 57, -1, -1, -1, 1501, - 1502, 1503, -1, -1, -1, -1, 1, -1, 3, 4, - 5, 6, 7, 8, 9, -1, -1, 12, -1, 14, - -1, -1, -1, 1525, -1, -1, -1, -1, -1, -1, - 25, -1, 27, -1, -1, -1, 31, -1, -1, -1, - -1, 36, -1, 608, -1, -1, 41, -1, -1, -1, - 45, -1, 47, -1, 619, 620, -1, 622, 623, 54, - -1, 56, 57, 58, 59, 60, -1, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, -1, -1, 90, 91, 92, 93, 94, - -1, 96, 97, -1, -1, -1, -1, 102, -1, -1, - 675, -1, 107, 108, 109, -1, 111, 682, 683, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 694, - -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, - 3, 4, 5, 6, 7, 8, 9, 10, 11, -1, - 13, 14, 15, 718, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - -1, 34, 35, 36, -1, 38, 39, 40, 41, 42, - 43, 44, 45, 46, -1, -1, 49, 50, 51, 52, - 53, 54, -1, 56, 57, 58, -1, 60, 61, -1, - 765, -1, -1, 768, 67, -1, -1, 70, -1, -1, - -1, -1, -1, -1, -1, 78, 79, 80, -1, -1, - -1, -1, 85, 86, 87, -1, -1, -1, -1, 92, - -1, -1, -1, 96, -1, -1, -1, 802, 803, 804, - -1, -1, -1, -1, -1, -1, 109, 110, 1, 814, - 3, 4, 5, 6, 7, 8, 9, 10, 11, -1, - 13, 14, 15, -1, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - -1, 34, 35, 36, -1, 38, 39, 40, 41, 42, - 43, 44, 45, 46, -1, -1, 49, 50, 51, 52, - 53, 54, -1, 56, 57, 58, -1, 60, 61, -1, - -1, -1, -1, -1, 67, -1, -1, 70, -1, -1, - -1, -1, 887, -1, 889, 78, 79, 80, -1, -1, - -1, -1, 85, 86, 87, 900, -1, -1, -1, 92, - -1, -1, -1, 96, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 1, 110, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 28, 29, 30, 31, 32, -1, 34, - 35, 36, -1, 38, 39, 40, 41, 42, 43, -1, - 45, -1, 47, -1, 49, 50, 51, 52, 53, 54, - -1, 56, 57, 58, -1, -1, 61, -1, -1, -1, - 985, -1, 67, -1, -1, 70, -1, -1, -1, -1, - -1, -1, -1, 78, 79, 80, -1, -1, -1, -1, - 85, 86, 87, -1, -1, 90, -1, 92, 93, -1, - 1, -1, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, -1, 110, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 28, 29, 30, - 31, 32, -1, 34, 35, 36, 1051, 38, 39, 40, - 41, 42, 43, -1, 45, -1, -1, -1, 49, 50, - 51, 52, 53, 54, -1, 56, 57, -1, -1, -1, - 61, -1, -1, -1, -1, -1, 67, -1, -1, 70, - -1, -1, -1, -1, -1, -1, -1, 78, 79, 80, - -1, -1, -1, -1, 85, 86, 87, -1, -1, -1, - -1, 92, 1107, 1108, -1, 1110, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 108, -1, 110, - 1, -1, 3, 4, 5, 6, 7, 8, 9, 10, - 11, -1, 13, 14, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 28, 29, 30, - 31, 32, -1, 34, 35, 36, -1, 38, 39, 40, - 41, 42, 43, -1, 45, 1170, -1, -1, 49, 50, - 51, 52, 53, 54, -1, 56, 57, 58, -1, 60, - 61, -1, -1, -1, -1, -1, 67, -1, -1, 70, - -1, -1, -1, -1, -1, -1, -1, 78, 79, 80, - -1, -1, 1207, -1, 85, 86, 87, -1, -1, -1, - -1, 92, -1, -1, -1, -1, -1, 1222, 1, 1224, - 3, 4, 5, 6, -1, 8, 9, 10, 11, 110, - 13, 14, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 28, 29, 30, -1, 32, - -1, 34, 35, 36, -1, 38, 39, 40, 41, 42, - 43, -1, 45, -1, -1, -1, 49, 50, 51, 52, - 53, 54, -1, 56, 57, 58, -1, -1, 61, -1, - -1, -1, -1, -1, 67, -1, -1, 70, -1, -1, - -1, -1, -1, -1, -1, 78, 79, 80, -1, -1, - -1, -1, 85, 86, 87, -1, -1, -1, -1, 92, - 93, 1, -1, 3, 4, 5, 6, -1, 8, 9, - 10, 11, -1, 13, 14, -1, 109, 110, -1, -1, - -1, -1, -1, 1338, -1, -1, -1, -1, 28, 29, - 30, -1, 32, -1, 34, 35, 36, -1, 38, 39, - 40, 41, 42, 43, -1, 45, -1, -1, -1, 49, - 50, 51, 52, 53, 54, -1, 56, 57, 58, -1, - -1, 61, -1, -1, -1, -1, -1, 67, -1, -1, - 70, -1, -1, -1, -1, -1, -1, -1, 78, 79, - 80, -1, -1, -1, -1, 85, 86, 87, -1, -1, - -1, -1, 92, 93, 1, -1, 3, 4, 5, 6, - -1, 8, 9, 10, 11, -1, 13, 14, -1, -1, - 110, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 28, 29, 30, -1, 32, -1, 34, 35, 36, - -1, 38, 39, 40, 41, 42, 43, -1, 45, -1, - -1, -1, 49, 50, 51, 52, 53, 54, -1, 56, - 57, 58, -1, -1, 61, -1, -1, -1, -1, -1, - 67, -1, -1, 70, -1, -1, -1, -1, -1, -1, - -1, 78, 79, 80, -1, -1, -1, -1, 85, 86, - 87, -1, -1, -1, 1, 92, 3, 4, 5, 6, - -1, 8, 9, 10, 11, -1, 13, 14, -1, -1, - -1, -1, 109, 110, -1, -1, -1, -1, -1, -1, - -1, 28, 29, 30, -1, 32, -1, 34, 35, 36, - -1, 38, 39, 40, 41, 42, 43, -1, 45, -1, - -1, -1, 49, 50, 51, 52, 53, 54, -1, 56, - 57, 58, -1, -1, 61, -1, -1, -1, -1, -1, - 67, -1, -1, 70, -1, -1, -1, -1, -1, -1, - -1, 78, 79, 80, -1, -1, -1, -1, 85, 86, - 87, -1, -1, -1, 1, 92, 3, 4, 5, 6, - -1, 8, 9, 10, 11, -1, 13, 14, -1, -1, - -1, -1, 109, 110, -1, -1, -1, -1, -1, -1, - -1, 28, 29, 30, -1, 32, -1, 34, 35, 36, - -1, 38, 39, 40, 41, 42, 43, -1, 45, -1, - -1, -1, 49, 50, 51, 52, 53, 54, -1, 56, - 57, 58, -1, -1, 61, -1, -1, -1, -1, -1, - 67, -1, -1, 70, -1, -1, -1, -1, -1, -1, - -1, 78, 79, 80, -1, -1, -1, -1, 85, 86, - 87, -1, -1, -1, -1, 92, -1, -1, 1, -1, - 3, 4, 5, 6, 101, 8, 9, 10, 11, -1, - 13, 14, -1, 110, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 28, 29, 30, 31, 32, - -1, 34, 35, 36, -1, 38, 39, 40, 41, 42, - 43, -1, 45, -1, -1, -1, 49, 50, 51, 52, - 53, 54, -1, 56, 57, 58, -1, -1, 61, -1, - -1, -1, -1, -1, 67, -1, -1, 70, -1, -1, - -1, -1, -1, -1, -1, 78, 79, 80, -1, -1, - -1, -1, 85, 86, 87, -1, -1, -1, 1, 92, - 3, 4, 5, 6, -1, 8, 9, 10, 11, -1, - 13, 14, -1, -1, -1, -1, -1, 110, -1, -1, - -1, -1, -1, -1, -1, 28, 29, 30, -1, 32, - -1, 34, 35, 36, -1, 38, 39, 40, 41, 42, - 43, -1, 45, -1, -1, -1, 49, 50, 51, 52, - 53, 54, -1, 56, 57, 58, -1, -1, 61, -1, - -1, -1, -1, -1, 67, -1, -1, 70, -1, -1, - -1, -1, -1, -1, -1, 78, 79, 80, -1, -1, - -1, -1, 85, 86, 87, -1, -1, -1, 1, 92, - 3, 4, 5, 6, -1, 8, 9, 10, 11, -1, - 13, 14, -1, -1, -1, -1, -1, 110, -1, -1, - -1, -1, -1, -1, -1, 28, 29, 30, -1, 32, - -1, 34, 35, 36, -1, 38, 39, 40, 41, 42, - 43, -1, 45, -1, -1, -1, 49, 50, 51, 52, - 53, 54, -1, 56, 57, -1, -1, -1, 61, 62, - -1, -1, -1, -1, 67, -1, -1, 70, -1, -1, - -1, -1, -1, -1, -1, 78, 79, 80, -1, -1, - -1, -1, 85, 86, 87, -1, -1, -1, 1, 92, - 3, 4, 5, 6, -1, 8, 9, 10, 11, -1, - 13, 14, -1, -1, -1, -1, -1, 110, -1, -1, - -1, -1, -1, -1, -1, 28, 29, 30, -1, 32, - -1, 34, 35, 36, -1, 38, 39, 40, 41, 42, - 43, -1, 45, -1, -1, -1, 49, 50, 51, 52, - 53, 54, -1, 56, 57, -1, -1, 60, 61, -1, - -1, -1, -1, -1, 67, -1, -1, 70, -1, -1, - -1, -1, -1, -1, -1, 78, 79, 80, -1, -1, - -1, -1, 85, 86, 87, -1, -1, -1, 1, 92, - 3, 4, 5, 6, -1, 8, 9, 10, 11, -1, - 13, 14, -1, -1, -1, -1, -1, 110, -1, -1, - -1, -1, -1, -1, -1, 28, 29, 30, -1, 32, - -1, 34, 35, 36, -1, 38, 39, 40, 41, 42, - 43, -1, 45, -1, -1, -1, 49, 50, 51, 52, - 53, 54, -1, 56, 57, -1, -1, -1, 61, -1, - -1, -1, -1, -1, 67, 1, -1, 70, 4, 5, - -1, -1, 8, 9, -1, 78, 79, 80, 14, -1, - -1, -1, 85, 86, 87, -1, -1, -1, -1, 92, - -1, -1, 28, -1, 30, -1, -1, -1, -1, -1, - 36, -1, 38, 39, -1, 108, -1, 110, -1, 45, - -1, 47, -1, -1, -1, -1, -1, -1, 54, -1, - 56, 57, -1, 59, -1, -1, -1, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, -1, 84, 85, - 86, 87, -1, -1, -1, -1, -1, 93, 94, 1, - -1, 3, 4, 5, 6, -1, 8, 9, 10, 11, - -1, 13, 14, -1, 110, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 28, 29, 30, -1, - 32, -1, 34, 35, 36, -1, 38, 39, 40, 41, - 42, 43, -1, 45, -1, -1, -1, 49, 50, 51, - 52, 53, 54, -1, 56, 57, -1, -1, -1, 61, - -1, -1, -1, -1, -1, 67, -1, -1, 70, -1, - -1, -1, -1, -1, -1, -1, 78, 79, 80, -1, - -1, -1, -1, 85, 86, 87, -1, -1, -1, 1, - 92, 3, 4, 5, 6, -1, 8, 9, 10, 11, - -1, 13, 14, -1, -1, -1, -1, -1, 110, -1, - -1, -1, -1, -1, -1, -1, 28, 29, 30, -1, - 32, -1, 34, 35, 36, -1, 38, 39, 40, 41, - 42, 43, -1, 45, -1, -1, -1, 49, 50, 51, - 52, 53, 54, -1, 56, 57, -1, -1, -1, 61, - -1, -1, -1, -1, -1, 67, -1, -1, 70, -1, - -1, -1, -1, -1, -1, -1, 78, 79, 80, -1, - -1, -1, -1, 85, 86, 87, -1, -1, -1, 1, - 92, 3, 4, 5, 6, -1, 8, 9, 10, 11, - -1, 13, 14, -1, -1, -1, -1, -1, 110, -1, - -1, -1, -1, -1, -1, -1, 28, 29, 30, -1, - 32, -1, 34, 35, 36, -1, 38, 39, 40, 41, - 42, 43, -1, 45, -1, -1, -1, 49, 50, 51, - 52, 53, 54, -1, 56, 57, -1, -1, -1, 61, - -1, -1, -1, -1, -1, 67, -1, -1, 70, -1, - -1, -1, -1, -1, -1, -1, 78, 79, 80, -1, - -1, -1, -1, 85, 86, 87, 3, 4, 5, 6, - 92, 8, 9, 10, 11, -1, 13, 14, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 110, -1, - -1, 28, 29, 30, -1, 32, -1, 34, 35, 36, - -1, 38, 39, 40, 41, 42, 43, -1, 45, -1, - -1, -1, 49, 50, 51, 52, 53, 54, -1, 56, - 57, -1, -1, -1, 61, -1, -1, -1, -1, -1, - 67, -1, 1, 70, 3, 4, 5, 6, 7, 8, - 9, 78, 79, 80, -1, 14, -1, -1, 85, 86, - 87, -1, -1, -1, -1, 92, -1, -1, -1, 28, - -1, 30, 31, 32, -1, -1, -1, 36, 37, -1, - -1, -1, 41, 110, 111, -1, 45, 46, -1, 48, - -1, -1, -1, -1, -1, 54, -1, 56, 57, -1, - -1, 60, -1, 62, -1, -1, -1, -1, -1, -1, - -1, 70, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 80, -1, -1, -1, -1, 85, -1, -1, -1, - -1, -1, -1, 92, -1, -1, -1, 3, 4, 5, - 6, 7, 8, 9, 10, 11, -1, 13, 14, 15, - 109, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, -1, 34, 35, - 36, -1, 38, 39, 40, 41, 42, 43, 44, 45, - 46, -1, -1, 49, 50, 51, 52, 53, 54, -1, - 56, 57, 58, -1, 60, 61, -1, -1, -1, -1, - -1, 67, -1, -1, 70, -1, -1, -1, -1, -1, - -1, -1, 78, 79, 80, -1, -1, -1, -1, 85, - 86, 87, -1, -1, -1, -1, 92, -1, -1, -1, - 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 109, 110, 3, 4, 5, 6, 7, - 8, 9, 10, 11, -1, 13, 14, 15, -1, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, -1, 34, 35, 36, -1, - 38, 39, 40, 41, 42, 43, 44, 45, 46, -1, - -1, 49, 50, 51, 52, 53, 54, -1, 56, 57, - 58, -1, 60, 61, -1, -1, -1, -1, -1, 67, - -1, -1, 70, -1, -1, -1, -1, -1, -1, -1, - 78, 79, 80, -1, -1, -1, -1, 85, 86, 87, - -1, -1, -1, -1, 92, -1, -1, -1, 96, 3, - 4, 5, 6, 7, 8, 9, 10, 11, -1, 13, - 14, 15, 110, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, - 34, 35, 36, -1, 38, 39, 40, 41, 42, 43, - 44, 45, 46, -1, -1, 49, 50, 51, 52, 53, - 54, -1, 56, 57, 58, -1, 60, 61, -1, -1, - -1, -1, -1, 67, -1, -1, 70, -1, -1, -1, - -1, -1, -1, -1, 78, 79, 80, -1, -1, -1, - -1, 85, 86, 87, -1, -1, -1, -1, 92, -1, - -1, -1, 96, 3, 4, 5, 6, 7, 8, 9, - 10, 11, -1, 13, 14, 15, 110, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, -1, 34, 35, 36, -1, 38, 39, - 40, 41, 42, 43, 44, 45, 46, -1, -1, 49, - 50, 51, 52, 53, 54, -1, 56, 57, -1, -1, - 60, 61, -1, -1, -1, -1, -1, 67, -1, -1, - 70, -1, -1, -1, -1, -1, -1, -1, 78, 79, - 80, -1, -1, -1, -1, 85, 86, 87, -1, -1, - -1, -1, 92, -1, -1, -1, 96, 3, 4, 5, - 6, 7, 8, 9, 10, 11, 12, 13, 14, -1, - 110, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 28, 29, 30, 31, 32, -1, 34, 35, - 36, -1, 38, 39, 40, 41, 42, 43, -1, 45, - -1, 47, -1, 49, 50, 51, 52, 53, 54, -1, - 56, 57, -1, -1, -1, 61, -1, -1, -1, -1, - -1, 67, -1, -1, 70, -1, -1, -1, -1, -1, - -1, -1, 78, 79, 80, -1, -1, -1, -1, 85, - 86, 87, -1, -1, 90, -1, 92, 93, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - -1, -1, -1, -1, 110, -1, -1, -1, -1, -1, - -1, -1, -1, 28, 29, 30, 31, 32, -1, 34, - 35, 36, -1, 38, 39, 40, 41, 42, 43, -1, - 45, -1, 47, -1, 49, 50, 51, 52, 53, 54, - -1, 56, 57, -1, -1, -1, 61, -1, -1, -1, - -1, -1, 67, -1, -1, 70, -1, -1, -1, -1, - -1, -1, -1, 78, 79, 80, -1, -1, -1, -1, - 85, 86, 87, -1, -1, 90, -1, 92, 93, 3, - 4, 5, 6, -1, 8, 9, 10, 11, -1, 13, - 14, -1, -1, -1, -1, 110, -1, -1, -1, -1, - -1, -1, -1, -1, 28, 29, 30, 31, 32, -1, - 34, 35, 36, -1, 38, 39, 40, 41, 42, 43, - -1, 45, -1, 47, -1, 49, 50, 51, 52, 53, - 54, -1, 56, 57, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 67, -1, -1, 70, -1, -1, -1, - -1, -1, -1, -1, 78, 79, 80, -1, -1, -1, - -1, 85, 86, 87, -1, -1, 90, -1, 92, 93, - 3, 4, 5, 6, -1, 8, 9, 10, 11, -1, - 13, 14, -1, -1, -1, -1, 110, -1, -1, -1, - -1, -1, -1, -1, -1, 28, 29, 30, 31, 32, - -1, 34, 35, 36, -1, 38, 39, 40, 41, 42, - 43, -1, 45, -1, 47, -1, 49, 50, 51, 52, - 53, 54, -1, 56, 57, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 67, -1, -1, 70, -1, -1, - -1, -1, -1, -1, -1, 78, 79, 80, -1, -1, - -1, -1, 85, 86, 87, -1, -1, 90, -1, 92, - 93, 3, 4, 5, 6, -1, 8, 9, 10, 11, - -1, 13, 14, -1, -1, -1, -1, 110, -1, -1, - -1, -1, -1, -1, -1, -1, 28, 29, 30, 31, - 32, -1, 34, 35, 36, -1, 38, 39, 40, 41, - 42, 43, -1, 45, -1, -1, -1, 49, 50, 51, - 52, 53, 54, -1, 56, 57, -1, -1, -1, 61, - -1, -1, -1, -1, -1, 67, -1, -1, 70, -1, - -1, -1, -1, -1, -1, -1, 78, 79, 80, -1, - -1, -1, -1, 85, 86, 87, 3, 4, 5, 6, - 92, 8, 9, 10, 11, -1, 13, 14, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 110, -1, - -1, 28, 29, 30, -1, 32, -1, 34, 35, 36, - -1, 38, 39, 40, 41, 42, 43, -1, 45, -1, - -1, -1, 49, 50, 51, 52, 53, 54, -1, 56, - 57, -1, -1, 60, 61, -1, -1, -1, -1, -1, - 67, -1, -1, 70, -1, -1, -1, -1, -1, -1, - -1, 78, 79, 80, -1, -1, -1, -1, 85, 86, - 87, -1, -1, -1, -1, 92, 3, 4, 5, 6, - 7, 8, 9, 10, 11, -1, 13, 14, -1, -1, - -1, -1, -1, 110, -1, -1, -1, -1, -1, -1, - -1, 28, 29, 30, 31, 32, -1, 34, 35, 36, - -1, 38, 39, 40, 41, 42, 43, -1, 45, -1, - -1, -1, 49, 50, 51, 52, 53, 54, -1, 56, - 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 67, -1, -1, 70, -1, -1, -1, -1, -1, -1, - -1, 78, 79, 80, -1, -1, -1, -1, 85, 86, - 87, 3, 4, 5, 6, 92, 8, 9, 10, 11, - -1, 13, 14, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 110, -1, -1, 28, 29, 30, 31, - 32, -1, 34, 35, 36, -1, 38, 39, 40, 41, - 42, 43, -1, 45, -1, -1, -1, 49, 50, 51, - 52, 53, 54, -1, 56, 57, -1, -1, -1, 61, - -1, -1, -1, -1, -1, 67, -1, -1, 70, -1, - -1, -1, -1, -1, -1, -1, 78, 79, 80, -1, - -1, -1, -1, 85, 86, 87, 3, 4, 5, 6, - 92, 8, 9, 10, 11, -1, 13, 14, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 110, -1, - -1, 28, 29, 30, -1, 32, -1, 34, 35, 36, - -1, 38, 39, 40, 41, 42, 43, -1, 45, -1, - -1, -1, 49, 50, 51, 52, 53, 54, -1, 56, - 57, -1, -1, -1, 61, -1, -1, -1, -1, -1, - 67, -1, -1, 70, -1, -1, -1, -1, -1, -1, - -1, 78, 79, 80, -1, -1, -1, -1, 85, 86, - 87, 3, 4, 5, 6, 92, 8, 9, 10, 11, - -1, 13, 14, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 110, -1, -1, 28, 29, 30, -1, - 32, -1, 34, 35, 36, -1, 38, 39, 40, 41, - 42, 43, -1, 45, -1, -1, -1, 49, 50, 51, - 52, 53, 54, -1, 56, 57, -1, -1, -1, 61, - -1, -1, -1, -1, -1, 67, -1, -1, 70, -1, - -1, -1, -1, -1, -1, -1, 78, 79, 80, -1, - -1, -1, -1, 85, 86, 87, 3, 4, 5, 6, - 92, 8, 9, 10, 11, -1, 13, 14, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 110, -1, - -1, 28, 29, 30, -1, 32, -1, 34, 35, 36, - -1, 38, 39, 40, 41, 42, 43, -1, 45, -1, - -1, -1, 49, 50, 51, 52, 53, 54, -1, 56, - 57, -1, -1, -1, 61, -1, -1, -1, -1, -1, - 67, -1, -1, 70, -1, -1, -1, -1, -1, -1, - -1, 78, 79, 80, -1, -1, -1, -1, 85, 86, - 87, 3, 4, 5, 6, 92, 8, 9, 10, 11, - -1, 13, 14, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 110, -1, -1, 28, 29, 30, -1, - 32, -1, 34, 35, 36, -1, 38, 39, 40, 41, - 42, 43, -1, 45, -1, -1, -1, 49, 50, 51, - 52, 53, 54, -1, 56, 57, 58, -1, -1, -1, - -1, -1, -1, -1, -1, 67, -1, -1, 70, -1, - -1, -1, -1, -1, -1, -1, 78, 79, 80, -1, - -1, -1, -1, 85, 86, 87, 3, 4, 5, 6, - 92, 8, 9, 10, 11, -1, 13, 14, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 110, -1, - -1, 28, 29, 30, -1, 32, -1, 34, 35, 36, - -1, 38, 39, 40, 41, 42, 43, -1, 45, -1, - -1, -1, 49, 50, 51, 52, 53, 54, -1, 56, - 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 67, -1, -1, 70, -1, -1, -1, -1, -1, -1, - -1, 78, 79, 80, -1, -1, -1, -1, 85, 86, - 87, -1, -1, -1, -1, 92, 93, 3, 4, 5, - 6, -1, 8, 9, 10, 11, -1, 13, 14, -1, - -1, -1, -1, 110, -1, -1, -1, -1, -1, -1, - -1, -1, 28, 29, 30, 31, 32, -1, 34, 35, - 36, -1, 38, 39, 40, 41, 42, 43, -1, 45, - -1, -1, -1, 49, 50, 51, 52, 53, 54, -1, - 56, 57, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 67, -1, -1, 70, -1, -1, -1, -1, -1, - -1, -1, 78, 79, 80, -1, -1, -1, -1, 85, - 86, 87, 3, 4, 5, 6, 92, 8, 9, 10, - 11, -1, 13, 14, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 110, -1, -1, 28, 29, 30, - -1, 32, -1, 34, 35, 36, -1, 38, 39, 40, - 41, 42, 43, -1, 45, -1, -1, -1, 49, 50, - 51, 52, 53, 54, -1, 56, 57, -1, -1, -1, - 61, -1, -1, -1, -1, -1, 67, -1, -1, 70, - -1, -1, -1, -1, -1, -1, -1, 78, 79, 80, - -1, -1, -1, -1, 85, 86, 87, 3, 4, 5, - 6, 92, 8, 9, 10, 11, -1, 13, 14, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 110, - -1, -1, 28, 29, 30, 31, 32, -1, 34, 35, - 36, -1, 38, 39, 40, 41, 42, 43, -1, 45, - -1, -1, -1, 49, 50, 51, 52, 53, 54, -1, - 56, 57, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 67, -1, -1, 70, -1, -1, -1, -1, -1, - -1, -1, 78, 79, 80, -1, -1, -1, -1, 85, - 86, 87, 3, 4, 5, 6, 92, 8, 9, 10, - 11, -1, 13, 14, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 110, -1, -1, 28, 29, 30, - -1, 32, -1, 34, 35, 36, -1, 38, 39, 40, - 41, 42, 43, -1, 45, -1, -1, -1, 49, 50, - 51, 52, 53, 54, -1, 56, 57, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 67, -1, -1, 70, - -1, -1, -1, -1, -1, -1, -1, 78, 79, 80, - -1, -1, -1, -1, 85, 86, 87, 3, 4, 5, - 6, 92, 8, 9, 10, 11, -1, 13, 14, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 110, - -1, -1, 28, 29, 30, -1, 32, -1, 34, 35, - 36, -1, 38, 39, 40, 41, 42, 43, -1, 45, - -1, -1, -1, 49, 50, 51, 52, 53, 54, -1, - 56, 57, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 67, -1, -1, 70, -1, -1, -1, -1, -1, - -1, -1, 78, 79, 80, -1, -1, -1, -1, 85, - 86, 87, 3, 4, 5, 6, 92, 8, 9, 10, - 11, -1, 13, 14, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 110, -1, -1, 28, 29, 30, - -1, 32, -1, 34, 35, 36, -1, 38, 39, 40, - 41, 42, 43, -1, 45, -1, -1, -1, 49, 50, - 51, 52, 53, 54, -1, 56, 57, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 67, -1, 1, 70, - 3, 4, 5, 6, 7, 8, 9, 78, 79, 80, - -1, 14, -1, -1, 85, 86, 87, -1, -1, -1, - -1, 92, -1, -1, 27, 28, -1, 30, 31, 32, - -1, -1, -1, 36, -1, -1, -1, -1, 41, 110, - -1, 44, 45, 46, -1, 48, -1, -1, -1, -1, - -1, 54, -1, 56, 57, -1, 1, 60, 3, 4, - 5, 6, 7, 8, 9, -1, -1, 70, -1, 14, - -1, -1, -1, -1, -1, -1, -1, 80, -1, -1, - -1, -1, 85, 28, -1, 30, 31, 32, -1, 92, - -1, 36, -1, -1, -1, 98, 41, -1, -1, -1, - 45, -1, -1, 48, -1, -1, -1, -1, -1, 54, - -1, 56, 57, -1, 1, -1, 3, 4, 5, 6, - 7, 8, 9, -1, -1, 70, -1, 14, -1, -1, - -1, -1, -1, -1, -1, 80, -1, -1, -1, -1, - 85, 28, -1, 30, 31, -1, -1, 92, -1, 36, - -1, -1, -1, 98, 41, -1, -1, -1, 45, -1, - -1, 48, -1, -1, -1, -1, -1, 54, -1, 56, - 57, -1, -1, 60, -1, 3, 4, 5, 6, 7, - 8, 9, -1, 70, 12, -1, 14, -1, -1, -1, - -1, -1, -1, 80, -1, -1, -1, -1, 85, -1, - 28, -1, 30, 31, -1, 92, -1, -1, 36, -1, - -1, -1, -1, 41, -1, -1, -1, 45, -1, -1, - -1, -1, -1, -1, -1, -1, 54, -1, 56, 57, - -1, -1, -1, 3, 4, 5, 6, 7, 8, 9, - -1, -1, 70, -1, 14, -1, -1, -1, -1, -1, - -1, -1, 80, -1, -1, -1, -1, 85, 28, -1, - 30, 31, -1, -1, 92, -1, 36, -1, -1, -1, - -1, 41, -1, -1, -1, 45, -1, -1, -1, -1, - -1, -1, -1, -1, 54, -1, 56, 57, -1, -1, - -1, -1, 62, 3, 4, 5, 6, 7, 8, 9, - 70, -1, -1, -1, 14, -1, -1, -1, -1, -1, - 80, -1, -1, -1, -1, 85, -1, -1, 28, -1, - 30, 31, 92, -1, -1, -1, 36, -1, -1, -1, - -1, 41, -1, -1, -1, 45, -1, -1, -1, -1, - -1, -1, -1, -1, 54, -1, 56, 57, -1, -1, - 60, 3, 4, 5, 6, 7, 8, 9, -1, -1, - 70, -1, 14, -1, -1, -1, -1, -1, -1, -1, - 80, -1, -1, -1, -1, 85, 28, -1, 30, 31, - -1, -1, 92, -1, 36, -1, -1, -1, -1, 41, - -1, -1, -1, 45, -1, -1, -1, -1, -1, -1, - -1, -1, 54, -1, 56, 57, -1, -1, -1, 3, - 4, 5, 6, 7, 8, 9, -1, -1, 70, -1, - 14, -1, -1, -1, -1, -1, -1, -1, 80, -1, - -1, -1, -1, 85, 28, -1, 30, 31, -1, -1, - 92, -1, 36, -1, -1, -1, -1, 41, -1, -1, - -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, - 54, -1, 56, 57, -1, -1, -1, 31, -1, -1, - -1, -1, -1, -1, -1, -1, 70, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 80, -1, -1, -1, - -1, 85, -1, -1, -1, -1, -1, -1, 92, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 4, 5, -1, 7, 8, 9, -1, -1, 12, - -1, 14, -1, -1, 4, 5, -1, 7, 8, 9, - -1, -1, 12, -1, 14, 28, -1, 30, 31, -1, - -1, -1, -1, 36, -1, -1, -1, -1, 28, -1, - 30, 31, 45, -1, -1, -1, 36, -1, -1, -1, - -1, 54, -1, 56, 57, 45, -1, -1, -1, -1, - -1, -1, -1, -1, 54, -1, 56, 57, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, -1, -1, -1, -1, 111, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 59, -1, -1, 107, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, -1, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84 -}; - -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const yytype_uint16 yystos[] = -{ - 0, 113, 114, 115, 0, 121, 122, 121, 1, 3, - 4, 5, 6, 7, 8, 9, 14, 27, 28, 30, - 31, 32, 36, 41, 44, 45, 46, 48, 54, 56, - 57, 60, 70, 80, 85, 92, 98, 119, 120, 123, - 126, 128, 130, 134, 135, 142, 145, 149, 150, 155, - 167, 178, 180, 206, 208, 213, 214, 227, 228, 230, - 231, 233, 237, 245, 248, 249, 262, 269, 270, 271, - 272, 273, 276, 277, 302, 307, 308, 309, 312, 314, - 316, 319, 320, 321, 328, 329, 399, 400, 60, 109, - 73, 54, 73, 54, 73, 73, 48, 3, 4, 5, - 56, 57, 58, 164, 178, 309, 320, 327, 329, 92, - 92, 92, 4, 5, 56, 57, 58, 164, 3, 4, - 5, 56, 57, 178, 322, 323, 324, 325, 329, 4, - 5, 44, 56, 57, 315, 320, 329, 73, 176, 54, - 73, 73, 248, 302, 311, 312, 320, 329, 302, 311, - 393, 70, 80, 92, 206, 211, 212, 214, 248, 313, - 314, 328, 123, 92, 60, 58, 98, 117, 1, 7, - 48, 119, 134, 142, 143, 144, 149, 227, 230, 237, - 262, 107, 148, 120, 238, 25, 147, 158, 159, 60, - 54, 93, 303, 305, 60, 70, 80, 92, 224, 235, - 243, 306, 310, 312, 319, 320, 328, 7, 9, 60, - 150, 233, 236, 244, 248, 312, 7, 8, 9, 229, - 232, 234, 248, 262, 59, 60, 249, 7, 8, 9, - 36, 58, 103, 104, 105, 164, 166, 178, 179, 248, - 320, 329, 58, 62, 274, 275, 58, 283, 9, 233, - 329, 238, 5, 48, 80, 180, 206, 209, 213, 319, - 321, 301, 309, 319, 320, 1, 38, 39, 47, 59, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 84, 85, 86, 87, 93, 94, 110, 231, 233, 302, - 373, 73, 3, 9, 10, 11, 13, 29, 34, 35, - 38, 39, 40, 42, 43, 49, 50, 51, 52, 53, - 56, 57, 61, 67, 70, 78, 79, 80, 85, 86, - 87, 92, 110, 119, 183, 184, 185, 186, 198, 203, - 204, 205, 206, 215, 217, 218, 219, 220, 222, 226, - 231, 233, 302, 316, 317, 318, 320, 329, 183, 183, - 207, 176, 109, 264, 58, 48, 309, 319, 187, 196, - 205, 226, 187, 226, 92, 125, 58, 63, 54, 54, - 54, 54, 54, 54, 3, 4, 5, 48, 56, 57, - 164, 178, 325, 326, 323, 131, 4, 5, 206, 209, - 210, 210, 315, 74, 136, 150, 227, 230, 233, 312, - 184, 183, 312, 311, 320, 311, 4, 5, 164, 178, - 211, 302, 313, 211, 302, 313, 211, 108, 56, 57, - 70, 80, 92, 206, 212, 108, 301, 220, 114, 116, - 48, 145, 149, 143, 117, 148, 235, 236, 60, 60, - 92, 247, 248, 3, 1, 62, 96, 146, 160, 221, - 363, 47, 63, 92, 254, 60, 111, 303, 304, 47, - 92, 301, 302, 306, 302, 306, 70, 80, 92, 306, - 328, 238, 59, 60, 93, 305, 319, 301, 229, 232, - 59, 60, 238, 7, 234, 248, 229, 234, 224, 239, - 73, 164, 179, 164, 320, 62, 278, 278, 284, 285, - 232, 246, 47, 92, 6, 164, 326, 400, 47, 92, - 9, 311, 5, 80, 180, 93, 93, 62, 111, 232, - 70, 80, 320, 328, 398, 207, 92, 9, 92, 198, - 233, 92, 198, 204, 204, 92, 73, 73, 73, 73, - 205, 164, 204, 204, 204, 1, 70, 80, 92, 187, - 206, 211, 216, 226, 204, 74, 76, 182, 59, 204, - 58, 92, 198, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 47, 92, 47, 86, 87, - 91, 92, 93, 94, 58, 92, 201, 300, 373, 93, - 204, 11, 1, 8, 48, 85, 209, 210, 317, 320, - 329, 47, 70, 80, 90, 92, 93, 203, 225, 328, - 332, 333, 92, 225, 332, 320, 329, 332, 47, 92, - 3, 39, 208, 218, 316, 329, 400, 182, 182, 183, - 150, 227, 233, 312, 164, 298, 299, 109, 263, 164, - 108, 59, 59, 108, 108, 108, 7, 8, 9, 164, - 250, 251, 252, 116, 124, 127, 326, 73, 54, 133, - 210, 315, 329, 45, 135, 137, 139, 140, 141, 226, - 228, 230, 231, 233, 269, 302, 390, 392, 171, 224, - 60, 170, 182, 182, 311, 311, 108, 211, 311, 108, - 109, 118, 118, 144, 149, 60, 60, 220, 161, 364, - 1, 58, 339, 340, 1, 58, 205, 255, 196, 197, - 205, 187, 111, 1, 12, 197, 226, 233, 383, 384, - 388, 389, 390, 392, 61, 395, 306, 306, 302, 302, - 108, 301, 241, 247, 239, 111, 304, 301, 306, 229, - 239, 241, 238, 183, 164, 393, 1, 5, 46, 60, - 62, 119, 128, 135, 150, 156, 157, 180, 227, 230, - 287, 288, 289, 312, 37, 109, 286, 241, 301, 151, - 73, 73, 54, 73, 301, 153, 47, 92, 47, 92, - 111, 111, 301, 301, 301, 183, 197, 226, 92, 225, - 226, 187, 226, 226, 233, 226, 226, 226, 108, 211, - 108, 108, 340, 108, 185, 3, 4, 5, 56, 57, - 93, 164, 255, 256, 226, 205, 205, 1, 187, 378, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 197, - 197, 187, 200, 200, 92, 300, 47, 63, 92, 202, - 70, 80, 93, 328, 330, 331, 111, 187, 54, 164, - 8, 47, 92, 47, 92, 47, 92, 302, 332, 302, - 332, 226, 332, 384, 111, 304, 92, 301, 47, 301, - 301, 47, 92, 93, 70, 80, 92, 197, 203, 211, - 248, 320, 329, 320, 197, 181, 181, 182, 175, 224, - 60, 174, 63, 59, 268, 298, 1, 205, 1, 205, - 59, 108, 92, 109, 116, 133, 54, 183, 60, 210, - 315, 138, 164, 269, 59, 74, 63, 63, 70, 80, - 92, 224, 328, 332, 312, 320, 224, 224, 138, 164, - 63, 177, 169, 168, 177, 181, 108, 60, 148, 118, - 118, 108, 3, 4, 5, 47, 56, 57, 92, 162, - 163, 165, 178, 307, 322, 329, 146, 340, 341, 109, - 256, 108, 108, 108, 12, 59, 62, 92, 108, 12, - 59, 62, 12, 312, 391, 392, 394, 63, 385, 47, - 92, 63, 111, 395, 247, 74, 7, 30, 37, 279, - 280, 281, 282, 307, 322, 47, 92, 205, 288, 227, - 288, 238, 238, 25, 58, 62, 96, 47, 92, 3, - 4, 62, 150, 224, 290, 292, 294, 295, 306, 312, - 320, 329, 150, 156, 291, 295, 312, 288, 60, 109, - 238, 62, 247, 287, 395, 383, 183, 183, 183, 395, - 383, 301, 152, 301, 154, 398, 398, 398, 182, 108, - 108, 108, 108, 108, 74, 74, 74, 74, 108, 108, - 205, 62, 59, 267, 108, 62, 108, 108, 111, 197, - 197, 226, 200, 202, 255, 197, 233, 301, 301, 187, - 301, 93, 204, 111, 85, 73, 47, 197, 197, 197, - 332, 332, 108, 108, 111, 395, 395, 332, 301, 383, - 111, 304, 108, 108, 320, 108, 177, 173, 172, 177, - 205, 299, 109, 268, 251, 108, 3, 197, 109, 60, - 182, 138, 141, 226, 185, 302, 302, 70, 80, 92, - 319, 320, 328, 301, 205, 177, 177, 148, 197, 1, - 59, 47, 92, 47, 92, 47, 92, 340, 33, 109, - 193, 336, 337, 338, 59, 109, 70, 80, 92, 206, - 211, 316, 385, 63, 386, 226, 396, 397, 242, 63, - 181, 393, 92, 393, 59, 7, 37, 393, 301, 383, - 60, 247, 247, 301, 383, 62, 62, 205, 238, 59, - 238, 238, 320, 238, 59, 247, 265, 108, 182, 182, - 182, 108, 395, 383, 395, 383, 92, 92, 92, 92, - 111, 255, 164, 255, 109, 205, 109, 108, 108, 199, - 226, 108, 108, 330, 330, 111, 330, 304, 204, 8, - 183, 108, 108, 108, 301, 395, 108, 111, 177, 177, - 109, 59, 108, 108, 302, 302, 319, 301, 108, 163, - 197, 197, 197, 365, 164, 253, 1, 3, 4, 5, - 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 44, 46, 57, 60, 96, 119, 120, 126, 129, - 130, 187, 223, 227, 230, 233, 334, 335, 340, 342, - 347, 348, 366, 375, 338, 109, 211, 108, 255, 101, - 255, 387, 59, 108, 255, 240, 187, 226, 393, 393, - 393, 281, 395, 108, 254, 254, 395, 108, 205, 205, - 247, 247, 3, 4, 62, 293, 296, 297, 306, 312, - 247, 247, 5, 247, 297, 254, 261, 301, 301, 108, - 108, 187, 187, 187, 187, 255, 62, 93, 202, 199, - 111, 47, 182, 395, 301, 197, 108, 108, 108, 95, - 369, 370, 59, 60, 60, 109, 62, 62, 62, 343, - 350, 352, 354, 358, 205, 62, 60, 60, 60, 187, - 80, 164, 164, 56, 132, 329, 62, 367, 223, 9, - 377, 60, 60, 224, 235, 60, 236, 312, 92, 235, - 1, 109, 335, 347, 16, 109, 347, 108, 396, 255, - 108, 108, 280, 301, 301, 247, 247, 254, 62, 62, - 205, 238, 238, 254, 254, 254, 1, 102, 260, 266, - 395, 395, 301, 301, 108, 108, 108, 108, 255, 187, - 202, 395, 108, 371, 370, 164, 47, 92, 189, 189, - 340, 345, 346, 92, 92, 12, 62, 362, 60, 187, - 60, 54, 56, 164, 56, 132, 164, 340, 92, 60, - 60, 70, 80, 92, 60, 109, 349, 395, 395, 205, - 205, 247, 247, 247, 1, 205, 259, 395, 395, 111, - 92, 374, 187, 191, 233, 373, 344, 351, 17, 348, - 58, 223, 376, 378, 191, 205, 360, 347, 60, 54, - 164, 368, 220, 345, 247, 247, 254, 254, 107, 107, - 97, 257, 258, 12, 392, 372, 108, 224, 345, 58, - 194, 348, 353, 193, 355, 60, 108, 62, 347, 369, - 62, 108, 147, 148, 108, 108, 340, 238, 195, 47, - 92, 188, 1, 190, 191, 359, 361, 11, 379, 380, - 381, 60, 1, 146, 363, 247, 193, 187, 60, 60, - 345, 347, 92, 62, 108, 59, 339, 63, 108, 356, - 187, 379, 60, 381, 192, 378, 108, 62, 108, 255, - 108, 11, 382, 60, 357, 59, 108, 194, 11, 60 -}; - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY (-2) -#define YYEOF 0 - -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab - - -/* Like YYERROR except do call yyerror. This remains here temporarily - to ease the transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ - -#define YYFAIL goto yyerrlab - -#define YYRECOVERING() (!!yyerrstatus) - -#define YYBACKUP(Token, Value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - yytoken = YYTRANSLATE (yychar); \ - YYPOPSTACK (1); \ - goto yybackup; \ - } \ - else \ - { \ - yyerror (YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ -while (YYID (0)) - - -#define YYTERROR 1 -#define YYERRCODE 256 - - -/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. - If N is 0, then set CURRENT to the empty location which ends - the previous symbol: RHS[0] (always defined). */ - -#define YYRHSLOC(Rhs, K) ((Rhs)[K]) -#ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - do \ - if (YYID (N)) \ - { \ - (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ - (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ - (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ - (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ - } \ - else \ - { \ - (Current).first_line = (Current).last_line = \ - YYRHSLOC (Rhs, 0).last_line; \ - (Current).first_column = (Current).last_column = \ - YYRHSLOC (Rhs, 0).last_column; \ - } \ - while (YYID (0)) -#endif - - -/* YY_LOCATION_PRINT -- Print the location on the stream. - This macro was not mandated originally: define only if we know - we won't break user code: when these are the locations we know. */ - -#ifndef YY_LOCATION_PRINT -# if YYLTYPE_IS_TRIVIAL -# define YY_LOCATION_PRINT(File, Loc) \ - fprintf (File, "%d.%d-%d.%d", \ - (Loc).first_line, (Loc).first_column, \ - (Loc).last_line, (Loc).last_column) -# else -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -# endif -#endif - - -/* YYLEX -- calling `yylex' with the right arguments. */ - -#ifdef YYLEX_PARAM -# define YYLEX yylex (YYLEX_PARAM) -#else -# define YYLEX yylex () -#endif - -/* Enable debugging if requested. */ -#if YYDEBUG - -# ifndef YYFPRINTF -# include /* INFRINGES ON USER NAME SPACE */ -# define YYFPRINTF fprintf -# endif - -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (YYID (0)) - -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Type, Value); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (YYID (0)) - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else -static void -yy_symbol_value_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif -{ - if (!yyvaluep) - return; -# ifdef YYPRINT - if (yytype < YYNTOKENS) - YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); -# else - YYUSE (yyoutput); -# endif - switch (yytype) - { - default: - break; - } -} - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else -static void -yy_symbol_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif -{ - if (yytype < YYNTOKENS) - YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); - else - YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); - - yy_symbol_value_print (yyoutput, yytype, yyvaluep); - YYFPRINTF (yyoutput, ")"); -} - -/*------------------------------------------------------------------. -| yy_stack_print -- Print the state stack from its BOTTOM up to its | -| TOP (included). | -`------------------------------------------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) -#else -static void -yy_stack_print (bottom, top) - yytype_int16 *bottom; - yytype_int16 *top; -#endif -{ - YYFPRINTF (stderr, "Stack now"); - for (; bottom <= top; ++bottom) - YYFPRINTF (stderr, " %d", *bottom); - YYFPRINTF (stderr, "\n"); -} - -# define YY_STACK_PRINT(Bottom, Top) \ -do { \ - if (yydebug) \ - yy_stack_print ((Bottom), (Top)); \ -} while (YYID (0)) - - -/*------------------------------------------------. -| Report that the YYRULE is going to be reduced. | -`------------------------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_reduce_print (YYSTYPE *yyvsp, int yyrule) -#else -static void -yy_reduce_print (yyvsp, yyrule) - YYSTYPE *yyvsp; - int yyrule; -#endif -{ - int yynrhs = yyr2[yyrule]; - int yyi; - unsigned long int yylno = yyrline[yyrule]; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", - yyrule - 1, yylno); - /* The symbols being reduced. */ - for (yyi = 0; yyi < yynrhs; yyi++) - { - fprintf (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], - &(yyvsp[(yyi + 1) - (yynrhs)]) - ); - fprintf (stderr, "\n"); - } -} - -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyvsp, Rule); \ -} while (YYID (0)) - -/* Nonzero means print parse trace. It is left uninitialized so that - multiple parsers can coexist. */ -int yydebug; -#else /* !YYDEBUG */ -# define YYDPRINTF(Args) -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) -# define YY_STACK_PRINT(Bottom, Top) -# define YY_REDUCE_PRINT(Rule) -#endif /* !YYDEBUG */ - - -/* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH -# define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only - if the built-in stack extension method is used). - - Do not make this value too large; the results are undefined if - YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) - evaluated with infinite-precision integer arithmetic. */ - -#ifndef YYMAXDEPTH -# define YYMAXDEPTH 10000 -#endif - - - -#if YYERROR_VERBOSE - -# ifndef yystrlen -# if defined __GLIBC__ && defined _STRING_H -# define yystrlen strlen -# else -/* Return the length of YYSTR. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static YYSIZE_T -yystrlen (const char *yystr) -#else -static YYSIZE_T -yystrlen (yystr) - const char *yystr; -#endif -{ - YYSIZE_T yylen; - for (yylen = 0; yystr[yylen]; yylen++) - continue; - return yylen; -} -# endif -# endif - -# ifndef yystpcpy -# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static char * -yystpcpy (char *yydest, const char *yysrc) -#else -static char * -yystpcpy (yydest, yysrc) - char *yydest; - const char *yysrc; -#endif -{ - char *yyd = yydest; - const char *yys = yysrc; - - while ((*yyd++ = *yys++) != '\0') - continue; - - return yyd - 1; -} -# endif -# endif - -# ifndef yytnamerr -/* Copy to YYRES the contents of YYSTR after stripping away unnecessary - quotes and backslashes, so that it's suitable for yyerror. The - heuristic is that double-quoting is unnecessary unless the string - contains an apostrophe, a comma, or backslash (other than - backslash-backslash). YYSTR is taken from yytname. If YYRES is - null, do not copy; instead, return the length of what the result - would have been. */ -static YYSIZE_T -yytnamerr (char *yyres, const char *yystr) -{ - if (*yystr == '"') - { - YYSIZE_T yyn = 0; - char const *yyp = yystr; - - for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } - do_not_strip_quotes: ; - } - - if (! yyres) - return yystrlen (yystr); - - return yystpcpy (yyres, yystr) - yyres; -} -# endif - -/* Copy into YYRESULT an error message about the unexpected token - YYCHAR while in state YYSTATE. Return the number of bytes copied, - including the terminating null byte. If YYRESULT is null, do not - copy anything; just return the number of bytes that would be - copied. As a special case, return 0 if an ordinary "syntax error" - message will do. Return YYSIZE_MAXIMUM if overflow occurs during - size calculation. */ -static YYSIZE_T -yysyntax_error (char *yyresult, int yystate, int yychar) -{ - int yyn = yypact[yystate]; - - if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) - return 0; - else - { - int yytype = YYTRANSLATE (yychar); - YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); - YYSIZE_T yysize = yysize0; - YYSIZE_T yysize1; - int yysize_overflow = 0; - enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - int yyx; - -# if 0 - /* This is so xgettext sees the translatable formats that are - constructed on the fly. */ - YY_("syntax error, unexpected %s"); - YY_("syntax error, unexpected %s, expecting %s"); - YY_("syntax error, unexpected %s, expecting %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); -# endif - char *yyfmt; - char const *yyf; - static char const yyunexpected[] = "syntax error, unexpected %s"; - static char const yyexpecting[] = ", expecting %s"; - static char const yyor[] = " or %s"; - char yyformat[sizeof yyunexpected - + sizeof yyexpecting - 1 - + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) - * (sizeof yyor - 1))]; - char const *yyprefix = yyexpecting; - - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = YYLAST - yyn + 1; - int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yycount = 1; - - yyarg[0] = yytname[yytype]; - yyfmt = yystpcpy (yyformat, yyunexpected); - - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) - { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount = 1; - yysize = yysize0; - yyformat[sizeof yyunexpected - 1] = '\0'; - break; - } - yyarg[yycount++] = yytname[yyx]; - yysize1 = yysize + yytnamerr (0, yytname[yyx]); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - yyfmt = yystpcpy (yyfmt, yyprefix); - yyprefix = yyor; - } - - yyf = YY_(yyformat); - yysize1 = yysize + yystrlen (yyf); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - - if (yysize_overflow) - return YYSIZE_MAXIMUM; - - if (yyresult) - { - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - char *yyp = yyresult; - int yyi = 0; - while ((*yyp = *yyf) != '\0') - { - if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yyarg[yyi++]); - yyf += 2; - } - else - { - yyp++; - yyf++; - } - } - } - return yysize; - } -} -#endif /* YYERROR_VERBOSE */ - - -/*-----------------------------------------------. -| Release the memory associated to this symbol. | -`-----------------------------------------------*/ - -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) -#else -static void -yydestruct (yymsg, yytype, yyvaluep) - const char *yymsg; - int yytype; - YYSTYPE *yyvaluep; -#endif -{ - YYUSE (yyvaluep); - - if (!yymsg) - yymsg = "Deleting"; - YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); - - switch (yytype) - { - - default: - break; - } -} - - -/* Prevent warnings from -Wmissing-prototypes. */ - -#ifdef YYPARSE_PARAM -#if defined __STDC__ || defined __cplusplus -int yyparse (void *YYPARSE_PARAM); -#else -int yyparse (); -#endif -#else /* ! YYPARSE_PARAM */ -#if defined __STDC__ || defined __cplusplus -int yyparse (void); -#else -int yyparse (); -#endif -#endif /* ! YYPARSE_PARAM */ - - - -/* The look-ahead symbol. */ -int yychar; - -/* The semantic value of the look-ahead symbol. */ -YYSTYPE yylval; - -/* Number of syntax errors so far. */ -int yynerrs; - - - -/*----------. -| yyparse. | -`----------*/ - -#ifdef YYPARSE_PARAM -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void *YYPARSE_PARAM) -#else -int -yyparse (YYPARSE_PARAM) - void *YYPARSE_PARAM; -#endif -#else /* ! YYPARSE_PARAM */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void) -#else -int -yyparse () - -#endif -#endif -{ - - int yystate; - int yyn; - int yyresult; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; - /* Look-ahead token as an internal (translated) token number. */ - int yytoken = 0; -#if YYERROR_VERBOSE - /* Buffer for error messages, and its allocated size. */ - char yymsgbuf[128]; - char *yymsg = yymsgbuf; - YYSIZE_T yymsg_alloc = sizeof yymsgbuf; -#endif - - /* Three stacks and their tools: - `yyss': related to states, - `yyvs': related to semantic values, - `yyls': related to locations. - - Refer to the stacks thru separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ - - /* The state stack. */ - yytype_int16 yyssa[YYINITDEPTH]; - yytype_int16 *yyss = yyssa; - yytype_int16 *yyssp; - - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs = yyvsa; - YYSTYPE *yyvsp; - - - -#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) - - YYSIZE_T yystacksize = YYINITDEPTH; - - /* The variables used to return semantic value and location from the - action routines. */ - YYSTYPE yyval; - - - /* The number of symbols on the RHS of the reduced rule. - Keep to zero when no symbol should be popped. */ - int yylen = 0; - - YYDPRINTF ((stderr, "Starting parse\n")); - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - - yyssp = yyss; - yyvsp = yyvs; - - goto yysetstate; - -/*------------------------------------------------------------. -| yynewstate -- Push a new state, which is found in yystate. | -`------------------------------------------------------------*/ - yynewstate: - /* In all cases, when you get here, the value and location stacks - have just been pushed. So pushing a state here evens the stacks. */ - yyssp++; - - yysetstate: - *yyssp = yystate; - - if (yyss + yystacksize - 1 <= yyssp) - { - /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize = yyssp - yyss + 1; - -#ifdef yyoverflow - { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - yytype_int16 *yyss1 = yyss; - - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - - &yystacksize); - - yyss = yyss1; - yyvs = yyvs1; - } -#else /* no yyoverflow */ -# ifndef YYSTACK_RELOCATE - goto yyexhaustedlab; -# else - /* Extend the stack our own way. */ - if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; - yystacksize *= 2; - if (YYMAXDEPTH < yystacksize) - yystacksize = YYMAXDEPTH; - - { - yytype_int16 *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss); - YYSTACK_RELOCATE (yyvs); - -# undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); - } -# endif -#endif /* no yyoverflow */ - - yyssp = yyss + yysize - 1; - yyvsp = yyvs + yysize - 1; - - - YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); - - if (yyss + yystacksize - 1 <= yyssp) - YYABORT; - } - - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); - - goto yybackup; - -/*-----------. -| yybackup. | -`-----------*/ -yybackup: - - /* Do appropriate processing given the current state. Read a - look-ahead token if we need one and don't already have one. */ - - /* First try to decide what to do without reference to look-ahead token. */ - yyn = yypact[yystate]; - if (yyn == YYPACT_NINF) - goto yydefault; - - /* Not known => get a look-ahead token if don't already have one. */ - - /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ - if (yychar == YYEMPTY) - { - YYDPRINTF ((stderr, "Reading a token: ")); - yychar = YYLEX; - } - - if (yychar <= YYEOF) - { - yychar = yytoken = YYEOF; - YYDPRINTF ((stderr, "Now at end of input.\n")); - } - else - { - yytoken = YYTRANSLATE (yychar); - YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); - } - - /* If the proper action on seeing token YYTOKEN is to reduce or to - detect an error, take that action. */ - yyn += yytoken; - if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) - goto yydefault; - yyn = yytable[yyn]; - if (yyn <= 0) - { - if (yyn == 0 || yyn == YYTABLE_NINF) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - - if (yyn == YYFINAL) - YYACCEPT; - - /* Count tokens shifted since error; after three, turn off error - status. */ - if (yyerrstatus) - yyerrstatus--; - - /* Shift the look-ahead token. */ - YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); - - /* Discard the shifted token unless it is eof. */ - if (yychar != YYEOF) - yychar = YYEMPTY; - - yystate = yyn; - *++yyvsp = yylval; - - goto yynewstate; - - -/*-----------------------------------------------------------. -| yydefault -- do the default action for the current state. | -`-----------------------------------------------------------*/ -yydefault: - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - goto yyreduce; - - -/*-----------------------------. -| yyreduce -- Do a reduction. | -`-----------------------------*/ -yyreduce: - /* yyn is the number of a rule to reduce with. */ - yylen = yyr2[yyn]; - - /* If YYLEN is nonzero, implement the default value of the action: - `$$ = $1'. - - Otherwise, the following line sets YYVAL to garbage. - This behavior is undocumented and Bison - users should not rely upon it. Assigning to YYVAL - unconditionally makes the parser a bit smaller, and it avoids a - GCC warning that YYVAL may be used uninitialized. */ - yyval = yyvsp[1-yylen]; - - - YY_REDUCE_PRINT (yyn); - switch (yyn) - { - case 3: -#line 340 "../../../gbagnu/gcc/cp/parse.y" - { finish_translation_unit (); ;} - break; - - case 4: -#line 348 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = NULL_TREE; ;} - break; - - case 5: -#line 350 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = NULL_TREE; ;} - break; - - case 6: -#line 352 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = NULL_TREE; ;} - break; - - case 9: -#line 361 "../../../gbagnu/gcc/cp/parse.y" - { have_extern_spec = 1; - used_extern_spec = 0; - (yyval.ttype) = NULL_TREE; ;} - break; - - case 10: -#line 366 "../../../gbagnu/gcc/cp/parse.y" - { have_extern_spec = 0; ;} - break; - - case 11: -#line 371 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.itype) = pedantic; - pedantic = 0; ;} - break; - - case 13: -#line 380 "../../../gbagnu/gcc/cp/parse.y" - { if (pending_lang_change) do_pending_lang_change(); ;} - break; - - case 14: -#line 382 "../../../gbagnu/gcc/cp/parse.y" - { if (! toplevel_bindings_p () && ! pseudo_global_level_p()) - pop_everything (); ;} - break; - - case 15: -#line 388 "../../../gbagnu/gcc/cp/parse.y" - { if (pending_inlines) do_pending_inlines (); ;} - break; - - case 16: -#line 390 "../../../gbagnu/gcc/cp/parse.y" - { if (pending_inlines) do_pending_inlines (); ;} - break; - - case 17: -#line 392 "../../../gbagnu/gcc/cp/parse.y" - { if (pending_inlines) do_pending_inlines (); ;} - break; - - case 18: -#line 394 "../../../gbagnu/gcc/cp/parse.y" - { if (TREE_CHAIN ((yyvsp[(3) - (5)].ttype))) (yyvsp[(3) - (5)].ttype) = combine_strings ((yyvsp[(3) - (5)].ttype)); - assemble_asm ((yyvsp[(3) - (5)].ttype)); ;} - break; - - case 19: -#line 397 "../../../gbagnu/gcc/cp/parse.y" - { pop_lang_context (); ;} - break; - - case 20: -#line 399 "../../../gbagnu/gcc/cp/parse.y" - { if (pending_inlines) do_pending_inlines (); - pop_lang_context (); ;} - break; - - case 21: -#line 402 "../../../gbagnu/gcc/cp/parse.y" - { if (pending_inlines) do_pending_inlines (); - pop_lang_context (); ;} - break; - - case 22: -#line 405 "../../../gbagnu/gcc/cp/parse.y" - { push_namespace ((yyvsp[(2) - (3)].ttype)); ;} - break; - - case 23: -#line 407 "../../../gbagnu/gcc/cp/parse.y" - { pop_namespace (); ;} - break; - - case 24: -#line 409 "../../../gbagnu/gcc/cp/parse.y" - { push_namespace (NULL_TREE); ;} - break; - - case 25: -#line 411 "../../../gbagnu/gcc/cp/parse.y" - { pop_namespace (); ;} - break; - - case 27: -#line 414 "../../../gbagnu/gcc/cp/parse.y" - { do_toplevel_using_decl ((yyvsp[(1) - (2)].ttype)); ;} - break; - - case 29: -#line 417 "../../../gbagnu/gcc/cp/parse.y" - { pedantic = (yyvsp[(1) - (2)].itype); ;} - break; - - case 30: -#line 422 "../../../gbagnu/gcc/cp/parse.y" - { begin_only_namespace_names (); ;} - break; - - case 31: -#line 424 "../../../gbagnu/gcc/cp/parse.y" - { - end_only_namespace_names (); - if (lastiddecl) - (yyvsp[(5) - (6)].ttype) = lastiddecl; - do_namespace_alias ((yyvsp[(2) - (6)].ttype), (yyvsp[(5) - (6)].ttype)); - ;} - break; - - case 32: -#line 434 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(2) - (2)].ttype); ;} - break; - - case 33: -#line 436 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(3) - (3)].ttype); ;} - break; - - case 34: -#line 438 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(3) - (3)].ttype); ;} - break; - - case 35: -#line 443 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_parse_node (SCOPE_REF, (yyvsp[(2) - (3)].ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 36: -#line 445 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_parse_node (SCOPE_REF, global_namespace, (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 37: -#line 447 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_parse_node (SCOPE_REF, (yyvsp[(3) - (4)].ttype), (yyvsp[(4) - (4)].ttype)); ;} - break; - - case 38: -#line 452 "../../../gbagnu/gcc/cp/parse.y" - { begin_only_namespace_names (); ;} - break; - - case 39: -#line 454 "../../../gbagnu/gcc/cp/parse.y" - { - end_only_namespace_names (); - /* If no declaration was found, the using-directive is - invalid. Since that was not reported, we need the - identifier for the error message. */ - if (TREE_CODE ((yyvsp[(4) - (5)].ttype)) == IDENTIFIER_NODE && lastiddecl) - (yyvsp[(4) - (5)].ttype) = lastiddecl; - do_using_directive ((yyvsp[(4) - (5)].ttype)); - ;} - break; - - case 40: -#line 467 "../../../gbagnu/gcc/cp/parse.y" - { - if (TREE_CODE ((yyval.ttype)) == IDENTIFIER_NODE) - (yyval.ttype) = lastiddecl; - got_scope = (yyval.ttype); - ;} - break; - - case 41: -#line 473 "../../../gbagnu/gcc/cp/parse.y" - { - (yyval.ttype) = (yyvsp[(2) - (3)].ttype); - if (TREE_CODE ((yyval.ttype)) == IDENTIFIER_NODE) - (yyval.ttype) = lastiddecl; - got_scope = (yyval.ttype); - ;} - break; - - case 44: -#line 484 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(2) - (2)].ttype); ;} - break; - - case 45: -#line 486 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(2) - (2)].ttype); ;} - break; - - case 46: -#line 491 "../../../gbagnu/gcc/cp/parse.y" - { push_lang_context ((yyvsp[(1) - (1)].ttype)); ;} - break; - - case 47: -#line 493 "../../../gbagnu/gcc/cp/parse.y" - { if (current_lang_name != (yyvsp[(2) - (2)].ttype)) - cp_error ("use of linkage spec `%D' is different from previous spec `%D'", (yyvsp[(2) - (2)].ttype), current_lang_name); - pop_lang_context (); push_lang_context ((yyvsp[(2) - (2)].ttype)); ;} - break; - - case 48: -#line 500 "../../../gbagnu/gcc/cp/parse.y" - { begin_template_parm_list (); ;} - break; - - case 49: -#line 502 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = end_template_parm_list ((yyvsp[(4) - (5)].ttype)); ;} - break; - - case 50: -#line 504 "../../../gbagnu/gcc/cp/parse.y" - { begin_specialization(); - (yyval.ttype) = NULL_TREE; ;} - break; - - case 51: -#line 510 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = process_template_parm (NULL_TREE, (yyvsp[(1) - (1)].ttype)); ;} - break; - - case 52: -#line 512 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = process_template_parm ((yyvsp[(1) - (3)].ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 53: -#line 517 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(1) - (1)].ttype); ;} - break; - - case 54: -#line 519 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = NULL_TREE; ;} - break; - - case 55: -#line 523 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_template_type_parm ((yyvsp[(1) - (2)].ttype), (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 56: -#line 525 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_template_type_parm (class_type_node, (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 57: -#line 530 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_template_template_parm ((yyvsp[(2) - (3)].ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 58: -#line 542 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_tree_list (NULL_TREE, (yyvsp[(1) - (1)].ttype)); ;} - break; - - case 59: -#line 544 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_tree_list (groktypename ((yyvsp[(3) - (3)].ftype).t), (yyvsp[(1) - (3)].ttype)); ;} - break; - - case 60: -#line 546 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_tree_list (NULL_TREE, (yyvsp[(1) - (1)].ftype).t); ;} - break; - - case 61: -#line 548 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_tree_list ((yyvsp[(3) - (3)].ttype), (yyvsp[(1) - (3)].ftype).t); ;} - break; - - case 62: -#line 550 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_tree_list (NULL_TREE, (yyvsp[(1) - (1)].ttype)); ;} - break; - - case 63: -#line 552 "../../../gbagnu/gcc/cp/parse.y" - { - if (TREE_CODE ((yyvsp[(3) - (3)].ttype)) != TEMPLATE_DECL - && TREE_CODE ((yyvsp[(3) - (3)].ttype)) != TEMPLATE_TEMPLATE_PARM - && TREE_CODE ((yyvsp[(3) - (3)].ttype)) != TYPE_DECL) - { - error ("invalid default template argument"); - (yyvsp[(3) - (3)].ttype) = error_mark_node; - } - (yyval.ttype) = build_tree_list ((yyvsp[(3) - (3)].ttype), (yyvsp[(1) - (3)].ttype)); - ;} - break; - - case 64: -#line 566 "../../../gbagnu/gcc/cp/parse.y" - { finish_template_decl ((yyvsp[(1) - (2)].ttype)); ;} - break; - - case 65: -#line 568 "../../../gbagnu/gcc/cp/parse.y" - { finish_template_decl ((yyvsp[(1) - (2)].ttype)); ;} - break; - - case 66: -#line 573 "../../../gbagnu/gcc/cp/parse.y" - { if (pending_inlines) do_pending_inlines (); ;} - break; - - case 67: -#line 575 "../../../gbagnu/gcc/cp/parse.y" - { if (pending_inlines) do_pending_inlines (); ;} - break; - - case 68: -#line 577 "../../../gbagnu/gcc/cp/parse.y" - { if (pending_inlines) do_pending_inlines (); ;} - break; - - case 69: -#line 579 "../../../gbagnu/gcc/cp/parse.y" - { if (pending_inlines) do_pending_inlines (); - pop_lang_context (); ;} - break; - - case 70: -#line 582 "../../../gbagnu/gcc/cp/parse.y" - { if (pending_inlines) do_pending_inlines (); - pop_lang_context (); ;} - break; - - case 71: -#line 585 "../../../gbagnu/gcc/cp/parse.y" - { pedantic = (yyvsp[(1) - (2)].itype); ;} - break; - - case 73: -#line 591 "../../../gbagnu/gcc/cp/parse.y" - {;} - break; - - case 74: -#line 593 "../../../gbagnu/gcc/cp/parse.y" - { note_list_got_semicolon ((yyvsp[(1) - (3)].ftype).t); ;} - break; - - case 75: -#line 595 "../../../gbagnu/gcc/cp/parse.y" - { maybe_process_partial_specialization ((yyvsp[(1) - (2)].ftype).t); - note_got_semicolon ((yyvsp[(1) - (2)].ftype).t); ;} - break; - - case 77: -#line 602 "../../../gbagnu/gcc/cp/parse.y" - {;} - break; - - case 78: -#line 604 "../../../gbagnu/gcc/cp/parse.y" - { note_list_got_semicolon ((yyvsp[(1) - (3)].ftype).t); ;} - break; - - case 79: -#line 606 "../../../gbagnu/gcc/cp/parse.y" - { pedwarn ("empty declaration"); ;} - break; - - case 81: -#line 609 "../../../gbagnu/gcc/cp/parse.y" - { - tree t, attrs; - split_specs_attrs ((yyvsp[(1) - (2)].ftype).t, &t, &attrs); - shadow_tag (t); - note_list_got_semicolon ((yyvsp[(1) - (2)].ftype).t); - ;} - break; - - case 85: -#line 622 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.itype) = 0; ;} - break; - - case 86: -#line 624 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.itype) = 1; ;} - break; - - case 92: -#line 640 "../../../gbagnu/gcc/cp/parse.y" - { finish_function (lineno, (int)(yyvsp[(3) - (4)].itype), 0); ;} - break; - - case 93: -#line 642 "../../../gbagnu/gcc/cp/parse.y" - { - int nested = (hack_decl_function_context - (current_function_decl) != NULL_TREE); - finish_function (lineno, (int)(yyvsp[(3) - (3)].itype), nested); - ;} - break; - - case 94: -#line 648 "../../../gbagnu/gcc/cp/parse.y" - { ;} - break; - - case 95: -#line 653 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = begin_constructor_declarator ((yyvsp[(1) - (3)].ttype), (yyvsp[(2) - (3)].ttype)); ;} - break; - - case 96: -#line 655 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_call_declarator ((yyvsp[(4) - (8)].ttype), (yyvsp[(5) - (8)].ttype), (yyvsp[(7) - (8)].ttype), (yyvsp[(8) - (8)].ttype)); ;} - break; - - case 97: -#line 657 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = begin_constructor_declarator ((yyvsp[(1) - (5)].ttype), (yyvsp[(2) - (5)].ttype)); - (yyval.ttype) = make_call_declarator ((yyval.ttype), empty_parms (), (yyvsp[(4) - (5)].ttype), (yyvsp[(5) - (5)].ttype)); - ;} - break; - - case 98: -#line 661 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = begin_constructor_declarator ((yyvsp[(2) - (4)].ttype), (yyvsp[(3) - (4)].ttype)); ;} - break; - - case 99: -#line 663 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_call_declarator ((yyvsp[(5) - (9)].ttype), (yyvsp[(6) - (9)].ttype), (yyvsp[(8) - (9)].ttype), (yyvsp[(9) - (9)].ttype)); ;} - break; - - case 100: -#line 665 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = begin_constructor_declarator ((yyvsp[(2) - (6)].ttype), (yyvsp[(3) - (6)].ttype)); - (yyval.ttype) = make_call_declarator ((yyval.ttype), empty_parms (), (yyvsp[(5) - (6)].ttype), (yyvsp[(6) - (6)].ttype)); - ;} - break; - - case 101: -#line 669 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = begin_constructor_declarator ((yyvsp[(1) - (3)].ttype), (yyvsp[(2) - (3)].ttype)); ;} - break; - - case 102: -#line 671 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_call_declarator ((yyvsp[(4) - (8)].ttype), (yyvsp[(5) - (8)].ttype), (yyvsp[(7) - (8)].ttype), (yyvsp[(8) - (8)].ttype)); ;} - break; - - case 103: -#line 673 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = begin_constructor_declarator ((yyvsp[(1) - (5)].ttype), (yyvsp[(2) - (5)].ttype)); - (yyval.ttype) = make_call_declarator ((yyval.ttype), empty_parms (), (yyvsp[(4) - (5)].ttype), (yyvsp[(5) - (5)].ttype)); - ;} - break; - - case 104: -#line 677 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = begin_constructor_declarator ((yyvsp[(2) - (4)].ttype), (yyvsp[(3) - (4)].ttype)); ;} - break; - - case 105: -#line 679 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_call_declarator ((yyvsp[(5) - (9)].ttype), (yyvsp[(6) - (9)].ttype), (yyvsp[(8) - (9)].ttype), (yyvsp[(9) - (9)].ttype)); ;} - break; - - case 106: -#line 681 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = begin_constructor_declarator ((yyvsp[(2) - (6)].ttype), (yyvsp[(3) - (6)].ttype)); - (yyval.ttype) = make_call_declarator ((yyval.ttype), empty_parms (), (yyvsp[(5) - (6)].ttype), (yyvsp[(6) - (6)].ttype)); - ;} - break; - - case 107: -#line 688 "../../../gbagnu/gcc/cp/parse.y" - { if (!begin_function_definition ((yyvsp[(1) - (2)].ftype).t, (yyvsp[(2) - (2)].ttype))) - YYERROR1; ;} - break; - - case 108: -#line 691 "../../../gbagnu/gcc/cp/parse.y" - { if (!begin_function_definition ((yyvsp[(1) - (2)].ttype), (yyvsp[(2) - (2)].ttype))) - YYERROR1; ;} - break; - - case 109: -#line 694 "../../../gbagnu/gcc/cp/parse.y" - { if (!begin_function_definition (NULL_TREE, (yyvsp[(1) - (1)].ttype))) - YYERROR1; ;} - break; - - case 110: -#line 697 "../../../gbagnu/gcc/cp/parse.y" - { if (!begin_function_definition ((yyvsp[(1) - (2)].ttype), (yyvsp[(2) - (2)].ttype))) - YYERROR1; ;} - break; - - case 111: -#line 700 "../../../gbagnu/gcc/cp/parse.y" - { if (!begin_function_definition (NULL_TREE, (yyvsp[(1) - (1)].ttype))) - YYERROR1; ;} - break; - - case 112: -#line 706 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_call_declarator ((yyvsp[(1) - (6)].ttype), (yyvsp[(3) - (6)].ttype), (yyvsp[(5) - (6)].ttype), (yyvsp[(6) - (6)].ttype)); ;} - break; - - case 113: -#line 708 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_call_declarator ((yyvsp[(1) - (4)].ttype), empty_parms (), (yyvsp[(3) - (4)].ttype), (yyvsp[(4) - (4)].ttype)); ;} - break; - - case 114: -#line 710 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_call_declarator ((yyvsp[(1) - (6)].ttype), (yyvsp[(3) - (6)].ttype), (yyvsp[(5) - (6)].ttype), (yyvsp[(6) - (6)].ttype)); ;} - break; - - case 115: -#line 712 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_call_declarator ((yyvsp[(1) - (4)].ttype), empty_parms (), (yyvsp[(3) - (4)].ttype), (yyvsp[(4) - (4)].ttype)); ;} - break; - - case 116: -#line 719 "../../../gbagnu/gcc/cp/parse.y" - { tree specs, attrs; - split_specs_attrs ((yyvsp[(1) - (2)].ttype), &specs, &attrs); - attrs = build_tree_list (attrs, NULL_TREE); - (yyval.ttype) = start_method (specs, (yyvsp[(2) - (2)].ttype), attrs); - rest_of_mdef: - if (! (yyval.ttype)) - YYERROR1; - if (yychar == YYEMPTY) - yychar = YYLEX; - reinit_parse_for_method (yychar, (yyval.ttype)); ;} - break; - - case 117: -#line 730 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = start_method (NULL_TREE, (yyvsp[(1) - (1)].ttype), NULL_TREE); - goto rest_of_mdef; ;} - break; - - case 118: -#line 733 "../../../gbagnu/gcc/cp/parse.y" - { tree specs, attrs; - split_specs_attrs ((yyvsp[(1) - (2)].ftype).t, &specs, &attrs); - attrs = build_tree_list (attrs, NULL_TREE); - (yyval.ttype) = start_method (specs, (yyvsp[(2) - (2)].ttype), attrs); goto rest_of_mdef; ;} - break; - - case 119: -#line 738 "../../../gbagnu/gcc/cp/parse.y" - { tree specs, attrs; - split_specs_attrs ((yyvsp[(1) - (2)].ttype), &specs, &attrs); - attrs = build_tree_list (attrs, NULL_TREE); - (yyval.ttype) = start_method (specs, (yyvsp[(2) - (2)].ttype), attrs); goto rest_of_mdef; ;} - break; - - case 120: -#line 743 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = start_method (NULL_TREE, (yyval.ttype), NULL_TREE); - goto rest_of_mdef; ;} - break; - - case 121: -#line 746 "../../../gbagnu/gcc/cp/parse.y" - { tree specs, attrs; - split_specs_attrs ((yyvsp[(1) - (2)].ttype), &specs, &attrs); - attrs = build_tree_list (attrs, NULL_TREE); - (yyval.ttype) = start_method (specs, (yyvsp[(2) - (2)].ttype), attrs); goto rest_of_mdef; ;} - break; - - case 122: -#line 751 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = start_method (NULL_TREE, (yyval.ttype), NULL_TREE); - goto rest_of_mdef; ;} - break; - - case 123: -#line 757 "../../../gbagnu/gcc/cp/parse.y" - { - if (! current_function_parms_stored) - store_parm_decls (); - (yyval.ttype) = (yyvsp[(2) - (2)].ttype); - ;} - break; - - case 124: -#line 766 "../../../gbagnu/gcc/cp/parse.y" - { store_return_init ((yyval.ttype), (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 125: -#line 768 "../../../gbagnu/gcc/cp/parse.y" - { store_return_init ((yyval.ttype), (yyvsp[(3) - (4)].ttype)); ;} - break; - - case 126: -#line 770 "../../../gbagnu/gcc/cp/parse.y" - { store_return_init ((yyval.ttype), NULL_TREE); ;} - break; - - case 127: -#line 775 "../../../gbagnu/gcc/cp/parse.y" - { - if ((yyvsp[(3) - (3)].itype) == 0) - error ("no base initializers given following ':'"); - setup_vtbl_ptr (); - /* Always keep the BLOCK node associated with the outermost - pair of curley braces of a function. These are needed - for correct operation of dwarfout.c. */ - keep_next_level (); - ;} - break; - - case 128: -#line 788 "../../../gbagnu/gcc/cp/parse.y" - { - if (! current_function_parms_stored) - store_parm_decls (); - - if (DECL_CONSTRUCTOR_P (current_function_decl)) - { - /* Make a contour for the initializer list. */ - pushlevel (0); - clear_last_expr (); - expand_start_bindings (0); - } - else if (current_class_type == NULL_TREE) - error ("base initializers not allowed for non-member functions"); - else if (! DECL_CONSTRUCTOR_P (current_function_decl)) - error ("only constructors take base initializers"); - ;} - break; - - case 129: -#line 808 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.itype) = 0; ;} - break; - - case 130: -#line 810 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.itype) = 1; ;} - break; - - case 133: -#line 817 "../../../gbagnu/gcc/cp/parse.y" - { - if (current_class_name) - pedwarn ("anachronistic old style base class initializer"); - expand_member_init (current_class_ref, NULL_TREE, (yyvsp[(2) - (3)].ttype)); - ;} - break; - - case 134: -#line 823 "../../../gbagnu/gcc/cp/parse.y" - { - if (current_class_name) - pedwarn ("anachronistic old style base class initializer"); - expand_member_init (current_class_ref, NULL_TREE, void_type_node); - ;} - break; - - case 135: -#line 829 "../../../gbagnu/gcc/cp/parse.y" - { expand_member_init (current_class_ref, (yyvsp[(1) - (4)].ttype), (yyvsp[(3) - (4)].ttype)); ;} - break; - - case 136: -#line 831 "../../../gbagnu/gcc/cp/parse.y" - { expand_member_init (current_class_ref, (yyvsp[(1) - (2)].ttype), void_type_node); ;} - break; - - case 137: -#line 833 "../../../gbagnu/gcc/cp/parse.y" - { expand_member_init (current_class_ref, (yyvsp[(1) - (4)].ttype), (yyvsp[(3) - (4)].ttype)); ;} - break; - - case 138: -#line 835 "../../../gbagnu/gcc/cp/parse.y" - { expand_member_init (current_class_ref, (yyvsp[(1) - (2)].ttype), void_type_node); ;} - break; - - case 139: -#line 837 "../../../gbagnu/gcc/cp/parse.y" - { expand_member_init (current_class_ref, TYPE_MAIN_DECL ((yyvsp[(1) - (4)].ttype)), - (yyvsp[(3) - (4)].ttype)); ;} - break; - - case 140: -#line 840 "../../../gbagnu/gcc/cp/parse.y" - { expand_member_init (current_class_ref, TYPE_MAIN_DECL ((yyvsp[(1) - (2)].ttype)), - void_type_node); ;} - break; - - case 152: -#line 866 "../../../gbagnu/gcc/cp/parse.y" - { do_type_instantiation ((yyvsp[(3) - (4)].ftype).t, NULL_TREE); - yyungetc (';', 1); ;} - break; - - case 154: -#line 870 "../../../gbagnu/gcc/cp/parse.y" - { tree specs = strip_attrs ((yyvsp[(3) - (4)].ftype).t); - do_decl_instantiation (specs, (yyvsp[(4) - (4)].ttype), NULL_TREE); ;} - break; - - case 156: -#line 874 "../../../gbagnu/gcc/cp/parse.y" - { do_decl_instantiation (NULL_TREE, (yyvsp[(3) - (3)].ttype), NULL_TREE); ;} - break; - - case 158: -#line 877 "../../../gbagnu/gcc/cp/parse.y" - { do_decl_instantiation (NULL_TREE, (yyvsp[(3) - (3)].ttype), NULL_TREE); ;} - break; - - case 160: -#line 880 "../../../gbagnu/gcc/cp/parse.y" - { do_type_instantiation ((yyvsp[(4) - (5)].ftype).t, (yyvsp[(1) - (5)].ttype)); - yyungetc (';', 1); ;} - break; - - case 162: -#line 885 "../../../gbagnu/gcc/cp/parse.y" - { tree specs = strip_attrs ((yyvsp[(4) - (5)].ftype).t); - do_decl_instantiation (specs, (yyvsp[(5) - (5)].ttype), (yyvsp[(1) - (5)].ttype)); ;} - break; - - case 164: -#line 889 "../../../gbagnu/gcc/cp/parse.y" - { do_decl_instantiation (NULL_TREE, (yyvsp[(4) - (4)].ttype), (yyvsp[(1) - (4)].ttype)); ;} - break; - - case 166: -#line 892 "../../../gbagnu/gcc/cp/parse.y" - { do_decl_instantiation (NULL_TREE, (yyvsp[(4) - (4)].ttype), (yyvsp[(1) - (4)].ttype)); ;} - break; - - case 168: -#line 897 "../../../gbagnu/gcc/cp/parse.y" - { begin_explicit_instantiation(); ;} - break; - - case 169: -#line 900 "../../../gbagnu/gcc/cp/parse.y" - { end_explicit_instantiation(); ;} - break; - - case 170: -#line 909 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(5) - (5)].ttype); ;} - break; - - case 171: -#line 912 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(5) - (5)].ttype); ;} - break; - - case 174: -#line 920 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(5) - (5)].ttype); ;} - break; - - case 175: -#line 925 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(5) - (5)].ttype); ;} - break; - - case 176: -#line 929 "../../../gbagnu/gcc/cp/parse.y" - { - if (yychar == YYEMPTY) - yychar = YYLEX; - - (yyval.ttype) = finish_template_type ((yyvsp[(-3) - (0)].ttype), (yyvsp[(-1) - (0)].ttype), - yychar == SCOPE); - ;} - break; - - case 178: -#line 940 "../../../gbagnu/gcc/cp/parse.y" - { - /* Handle `Class>' without space in the `>>' */ - pedwarn ("`>>' should be `> >' in template class name"); - yyungetc ('>', 1); - ;} - break; - - case 179: -#line 949 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = NULL_TREE; ;} - break; - - case 181: -#line 955 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_tree_list (NULL_TREE, (yyval.ttype)); ;} - break; - - case 182: -#line 957 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = chainon ((yyval.ttype), build_tree_list (NULL_TREE, (yyvsp[(3) - (3)].ttype))); ;} - break; - - case 183: -#line 962 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = groktypename ((yyvsp[(1) - (1)].ftype).t); ;} - break; - - case 184: -#line 964 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = lastiddecl; ;} - break; - - case 186: -#line 970 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.code) = NEGATE_EXPR; ;} - break; - - case 187: -#line 972 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.code) = CONVERT_EXPR; ;} - break; - - case 188: -#line 974 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.code) = PREINCREMENT_EXPR; ;} - break; - - case 189: -#line 976 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.code) = PREDECREMENT_EXPR; ;} - break; - - case 190: -#line 978 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.code) = TRUTH_NOT_EXPR; ;} - break; - - case 191: -#line 983 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_compound_expr ((yyval.ttype)); ;} - break; - - case 193: -#line 989 "../../../gbagnu/gcc/cp/parse.y" - { error ("ANSI C++ forbids an empty condition for `%s'", - cond_stmt_keyword); - (yyval.ttype) = integer_zero_node; ;} - break; - - case 194: -#line 993 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(2) - (3)].ttype); ;} - break; - - case 195: -#line 998 "../../../gbagnu/gcc/cp/parse.y" - { error ("ANSI C++ forbids an empty condition for `%s'", - cond_stmt_keyword); - (yyval.ttype) = integer_zero_node; ;} - break; - - case 196: -#line 1002 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(2) - (3)].ttype); ;} - break; - - case 197: -#line 1007 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = NULL_TREE; ;} - break; - - case 199: -#line 1010 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = NULL_TREE; ;} - break; - - case 200: -#line 1015 "../../../gbagnu/gcc/cp/parse.y" - { { - tree d; - for (d = getdecls (); d; d = TREE_CHAIN (d)) - if (TREE_CODE (d) == TYPE_DECL) { - tree s = TREE_TYPE (d); - if (TREE_CODE (s) == RECORD_TYPE) - cp_error ("definition of class `%T' in condition", s); - else if (TREE_CODE (s) == ENUMERAL_TYPE) - cp_error ("definition of enum `%T' in condition", s); - } - } - current_declspecs = (yyvsp[(1) - (5)].ftype).t; - (yyvsp[(5) - (5)].itype) = suspend_momentary (); - (yyval.ttype) = start_decl ((yyvsp[(2) - (5)].ttype), current_declspecs, 1, - (yyvsp[(4) - (5)].ttype), /*prefix_attributes*/ NULL_TREE); - ;} - break; - - case 201: -#line 1032 "../../../gbagnu/gcc/cp/parse.y" - { - cp_finish_decl ((yyvsp[(6) - (7)].ttype), (yyvsp[(7) - (7)].ttype), (yyvsp[(4) - (7)].ttype), 1, LOOKUP_ONLYCONVERTING); - resume_momentary ((yyvsp[(5) - (7)].itype)); - (yyval.ttype) = convert_from_reference ((yyvsp[(6) - (7)].ttype)); - if (TREE_CODE (TREE_TYPE ((yyval.ttype))) == ARRAY_TYPE) - cp_error ("definition of array `%#D' in condition", (yyval.ttype)); - ;} - break; - - case 207: -#line 1051 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = begin_compound_stmt (1); ;} - break; - - case 208: -#line 1053 "../../../gbagnu/gcc/cp/parse.y" - { finish_compound_stmt (1, (yyvsp[(2) - (3)].ttype)); ;} - break; - - case 210: -#line 1060 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = expr_tree_cons (NULL_TREE, (yyval.ttype), - build_expr_list (NULL_TREE, (yyvsp[(3) - (3)].ttype))); ;} - break; - - case 211: -#line 1063 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = expr_tree_cons (NULL_TREE, (yyval.ttype), - build_expr_list (NULL_TREE, error_mark_node)); ;} - break; - - case 212: -#line 1066 "../../../gbagnu/gcc/cp/parse.y" - { chainon ((yyval.ttype), build_expr_list (NULL_TREE, (yyvsp[(3) - (3)].ttype))); ;} - break; - - case 213: -#line 1068 "../../../gbagnu/gcc/cp/parse.y" - { chainon ((yyval.ttype), build_expr_list (NULL_TREE, error_mark_node)); ;} - break; - - case 214: -#line 1073 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_expr_list (NULL_TREE, (yyval.ttype)); ;} - break; - - case 216: -#line 1079 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(1) - (1)].ttype); ;} - break; - - case 217: -#line 1082 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(2) - (2)].ttype); - pedantic = (yyvsp[(1) - (2)].itype); ;} - break; - - case 218: -#line 1085 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_indirect_ref ((yyvsp[(2) - (2)].ttype), "unary *"); ;} - break; - - case 219: -#line 1087 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_unary_op (ADDR_EXPR, (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 220: -#line 1089 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_unary_op (BIT_NOT_EXPR, (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 221: -#line 1091 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_unary_op_expr ((yyvsp[(1) - (2)].code), (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 222: -#line 1094 "../../../gbagnu/gcc/cp/parse.y" - { if (pedantic) - pedwarn ("ANSI C++ forbids `&&'"); - (yyval.ttype) = finish_label_address_expr ((yyvsp[(2) - (2)].ttype)); ;} - break; - - case 223: -#line 1098 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = expr_sizeof ((yyvsp[(2) - (2)].ttype)); ;} - break; - - case 224: -#line 1100 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = c_sizeof (groktypename ((yyvsp[(3) - (4)].ftype).t)); - check_for_new_type ("sizeof", (yyvsp[(3) - (4)].ftype)); ;} - break; - - case 225: -#line 1103 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = grok_alignof ((yyvsp[(2) - (2)].ttype)); ;} - break; - - case 226: -#line 1105 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = c_alignof (groktypename ((yyvsp[(3) - (4)].ftype).t)); - check_for_new_type ("alignof", (yyvsp[(3) - (4)].ftype)); ;} - break; - - case 227: -#line 1111 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_new (NULL_TREE, (yyvsp[(2) - (2)].ftype).t, NULL_TREE, (yyvsp[(1) - (2)].itype)); - check_for_new_type ("new", (yyvsp[(2) - (2)].ftype)); ;} - break; - - case 228: -#line 1114 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_new (NULL_TREE, (yyvsp[(2) - (3)].ftype).t, (yyvsp[(3) - (3)].ttype), (yyvsp[(1) - (3)].itype)); - check_for_new_type ("new", (yyvsp[(2) - (3)].ftype)); ;} - break; - - case 229: -#line 1117 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_new ((yyvsp[(2) - (3)].ttype), (yyvsp[(3) - (3)].ftype).t, NULL_TREE, (yyvsp[(1) - (3)].itype)); - check_for_new_type ("new", (yyvsp[(3) - (3)].ftype)); ;} - break; - - case 230: -#line 1120 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_new ((yyvsp[(2) - (4)].ttype), (yyvsp[(3) - (4)].ftype).t, (yyvsp[(4) - (4)].ttype), (yyvsp[(1) - (4)].itype)); - check_for_new_type ("new", (yyvsp[(3) - (4)].ftype)); ;} - break; - - case 231: -#line 1133 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_new (NULL_TREE, groktypename((yyvsp[(4) - (5)].ftype).t), - NULL_TREE, (yyvsp[(1) - (5)].itype)); - check_for_new_type ("new", (yyvsp[(4) - (5)].ftype)); ;} - break; - - case 232: -#line 1138 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_new (NULL_TREE, groktypename((yyvsp[(4) - (6)].ftype).t), (yyvsp[(6) - (6)].ttype), (yyvsp[(1) - (6)].itype)); - check_for_new_type ("new", (yyvsp[(4) - (6)].ftype)); ;} - break; - - case 233: -#line 1142 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_new ((yyvsp[(2) - (6)].ttype), groktypename((yyvsp[(5) - (6)].ftype).t), NULL_TREE, (yyvsp[(1) - (6)].itype)); - check_for_new_type ("new", (yyvsp[(5) - (6)].ftype)); ;} - break; - - case 234: -#line 1146 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_new ((yyvsp[(2) - (7)].ttype), groktypename((yyvsp[(5) - (7)].ftype).t), (yyvsp[(7) - (7)].ttype), (yyvsp[(1) - (7)].itype)); - check_for_new_type ("new", (yyvsp[(5) - (7)].ftype)); ;} - break; - - case 235: -#line 1150 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = delete_sanity ((yyvsp[(2) - (2)].ttype), NULL_TREE, 0, (yyvsp[(1) - (2)].itype)); ;} - break; - - case 236: -#line 1152 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = delete_sanity ((yyvsp[(4) - (4)].ttype), NULL_TREE, 1, (yyvsp[(1) - (4)].itype)); - if (yychar == YYEMPTY) - yychar = YYLEX; ;} - break; - - case 237: -#line 1156 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = delete_sanity ((yyvsp[(5) - (5)].ttype), (yyvsp[(3) - (5)].ttype), 2, (yyvsp[(1) - (5)].itype)); - if (yychar == YYEMPTY) - yychar = YYLEX; ;} - break; - - case 238: -#line 1160 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_unary_op (REALPART_EXPR, (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 239: -#line 1162 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_unary_op (IMAGPART_EXPR, (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 240: -#line 1172 "../../../gbagnu/gcc/cp/parse.y" - { finish_new_placement (NULL_TREE, (yyvsp[(-1) - (1)].itype)); ;} - break; - - case 241: -#line 1175 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.itype) = begin_new_placement (); ;} - break; - - case 242: -#line 1179 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_new_placement ((yyvsp[(3) - (4)].ttype), (yyvsp[(2) - (4)].itype)); ;} - break; - - case 243: -#line 1181 "../../../gbagnu/gcc/cp/parse.y" - { cp_pedwarn ("old style placement syntax, use () instead"); - (yyval.ttype) = finish_new_placement ((yyvsp[(3) - (4)].ttype), (yyvsp[(2) - (4)].itype)); ;} - break; - - case 244: -#line 1187 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(2) - (3)].ttype); ;} - break; - - case 245: -#line 1189 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = NULL_TREE; ;} - break; - - case 246: -#line 1191 "../../../gbagnu/gcc/cp/parse.y" - { - cp_error ("`%T' is not a valid expression", (yyvsp[(2) - (3)].ftype).t); - (yyval.ttype) = error_mark_node; - ;} - break; - - case 247: -#line 1199 "../../../gbagnu/gcc/cp/parse.y" - { - if (pedantic) - pedwarn ("ANSI C++ forbids initialization of new expression with `='"); - if (TREE_CODE ((yyvsp[(2) - (2)].ttype)) != TREE_LIST - && TREE_CODE ((yyvsp[(2) - (2)].ttype)) != CONSTRUCTOR) - (yyval.ttype) = build_expr_list (NULL_TREE, (yyvsp[(2) - (2)].ttype)); - else - (yyval.ttype) = (yyvsp[(2) - (2)].ttype); - ;} - break; - - case 248: -#line 1213 "../../../gbagnu/gcc/cp/parse.y" - { (yyvsp[(2) - (3)].ftype).t = finish_parmlist (build_tree_list (NULL_TREE, (yyvsp[(2) - (3)].ftype).t), 0); - (yyval.ttype) = make_call_declarator (NULL_TREE, (yyvsp[(2) - (3)].ftype).t, NULL_TREE, NULL_TREE); - check_for_new_type ("cast", (yyvsp[(2) - (3)].ftype)); ;} - break; - - case 249: -#line 1217 "../../../gbagnu/gcc/cp/parse.y" - { (yyvsp[(3) - (4)].ftype).t = finish_parmlist (build_tree_list (NULL_TREE, (yyvsp[(3) - (4)].ftype).t), 0); - (yyval.ttype) = make_call_declarator ((yyval.ttype), (yyvsp[(3) - (4)].ftype).t, NULL_TREE, NULL_TREE); - check_for_new_type ("cast", (yyvsp[(3) - (4)].ftype)); ;} - break; - - case 251: -#line 1225 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = reparse_absdcl_as_casts ((yyval.ttype), (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 252: -#line 1227 "../../../gbagnu/gcc/cp/parse.y" - { - tree init = build_nt (CONSTRUCTOR, NULL_TREE, - nreverse ((yyvsp[(3) - (5)].ttype))); - if (pedantic) - pedwarn ("ANSI C++ forbids constructor-expressions"); - /* Indicate that this was a GNU C constructor expression. */ - TREE_HAS_CONSTRUCTOR (init) = 1; - - (yyval.ttype) = reparse_absdcl_as_casts ((yyval.ttype), init); - ;} - break; - - case 254: -#line 1243 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_binary_op (MEMBER_REF, (yyval.ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 255: -#line 1245 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_m_component_ref ((yyval.ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 256: -#line 1247 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_binary_op ((yyvsp[(2) - (3)].code), (yyval.ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 257: -#line 1249 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_binary_op ((yyvsp[(2) - (3)].code), (yyval.ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 258: -#line 1251 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_binary_op ((yyvsp[(2) - (3)].code), (yyval.ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 259: -#line 1253 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_binary_op ((yyvsp[(2) - (3)].code), (yyval.ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 260: -#line 1255 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_binary_op ((yyvsp[(2) - (3)].code), (yyval.ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 261: -#line 1257 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_binary_op ((yyvsp[(2) - (3)].code), (yyval.ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 262: -#line 1259 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_binary_op ((yyvsp[(2) - (3)].code), (yyval.ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 263: -#line 1261 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_binary_op ((yyvsp[(2) - (3)].code), (yyval.ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 264: -#line 1263 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_binary_op (LT_EXPR, (yyval.ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 265: -#line 1265 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_binary_op (GT_EXPR, (yyval.ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 266: -#line 1267 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_binary_op ((yyvsp[(2) - (3)].code), (yyval.ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 267: -#line 1269 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_binary_op ((yyvsp[(2) - (3)].code), (yyval.ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 268: -#line 1271 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_binary_op ((yyvsp[(2) - (3)].code), (yyval.ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 269: -#line 1273 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_binary_op ((yyvsp[(2) - (3)].code), (yyval.ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 270: -#line 1275 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_binary_op ((yyvsp[(2) - (3)].code), (yyval.ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 271: -#line 1277 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_binary_op (TRUTH_ANDIF_EXPR, (yyval.ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 272: -#line 1279 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_binary_op (TRUTH_ORIF_EXPR, (yyval.ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 273: -#line 1281 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_conditional_expr ((yyval.ttype), (yyvsp[(3) - (5)].ttype), (yyvsp[(5) - (5)].ttype)); ;} - break; - - case 274: -#line 1283 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_modify_expr ((yyval.ttype), NOP_EXPR, (yyvsp[(3) - (3)].ttype)); - if ((yyval.ttype) != error_mark_node) - C_SET_EXP_ORIGINAL_CODE ((yyval.ttype), MODIFY_EXPR); ;} - break; - - case 275: -#line 1287 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_modify_expr ((yyval.ttype), (yyvsp[(2) - (3)].code), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 276: -#line 1289 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_throw (NULL_TREE); ;} - break; - - case 277: -#line 1291 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_throw ((yyvsp[(2) - (2)].ttype)); ;} - break; - - case 278: -#line 1309 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_parse_node (BIT_NOT_EXPR, (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 279: -#line 1311 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_parse_node (BIT_NOT_EXPR, (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 285: -#line 1320 "../../../gbagnu/gcc/cp/parse.y" - { - /* If lastiddecl is a TREE_LIST, it's a baselink, which - means that we're in an expression like S::f, so - don't do_identifier; we only do that for unqualified - identifiers. */ - if (lastiddecl && TREE_CODE (lastiddecl) != TREE_LIST) - (yyval.ttype) = do_identifier ((yyvsp[(-1) - (0)].ttype), 1, NULL_TREE); - else - (yyval.ttype) = (yyvsp[(-1) - (0)].ttype); - ;} - break; - - case 286: -#line 1333 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = lookup_template_function ((yyvsp[(3) - (5)].ttype), (yyvsp[(4) - (5)].ttype)); ;} - break; - - case 287: -#line 1335 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = lookup_template_function ((yyvsp[(3) - (5)].ttype), (yyvsp[(4) - (5)].ttype)); ;} - break; - - case 288: -#line 1340 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = lookup_template_function ((yyvsp[(2) - (5)].ttype), (yyvsp[(4) - (5)].ttype)); ;} - break; - - case 289: -#line 1342 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = lookup_template_function ((yyvsp[(2) - (5)].ttype), (yyvsp[(4) - (5)].ttype)); ;} - break; - - case 290: -#line 1345 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = lookup_template_function ((yyvsp[(2) - (5)].ttype), (yyvsp[(4) - (5)].ttype)); ;} - break; - - case 295: -#line 1357 "../../../gbagnu/gcc/cp/parse.y" - { - /* Provide support for '(' attributes '*' declarator ')' - etc */ - (yyval.ttype) = decl_tree_cons ((yyvsp[(1) - (2)].ttype), (yyvsp[(2) - (2)].ttype), NULL_TREE); - ;} - break; - - case 297: -#line 1367 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_parse_node (INDIRECT_REF, (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 298: -#line 1369 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_parse_node (ADDR_EXPR, (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 299: -#line 1371 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(2) - (3)].ttype); ;} - break; - - case 300: -#line 1376 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = lookup_template_function ((yyvsp[(1) - (4)].ttype), (yyvsp[(3) - (4)].ttype)); ;} - break; - - case 301: -#line 1378 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = lookup_template_function ((yyvsp[(1) - (4)].ttype), (yyvsp[(3) - (4)].ttype)); ;} - break; - - case 305: -#line 1388 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_decl_parsing ((yyvsp[(2) - (3)].ttype)); ;} - break; - - case 306: -#line 1393 "../../../gbagnu/gcc/cp/parse.y" - { - if (TREE_CODE ((yyvsp[(1) - (1)].ttype)) == BIT_NOT_EXPR) - (yyval.ttype) = build_x_unary_op (BIT_NOT_EXPR, TREE_OPERAND ((yyvsp[(1) - (1)].ttype), 0)); - else - (yyval.ttype) = finish_id_expr ((yyvsp[(1) - (1)].ttype)); - ;} - break; - - case 309: -#line 1402 "../../../gbagnu/gcc/cp/parse.y" - { - if (processing_template_decl) - push_obstacks (&permanent_obstack, &permanent_obstack); - (yyval.ttype) = combine_strings ((yyval.ttype)); - /* combine_strings doesn't set up TYPE_MAIN_VARIANT of - a const array the way we want, so fix it. */ - if (flag_const_strings) - TREE_TYPE ((yyval.ttype)) = build_cplus_array_type - (TREE_TYPE (TREE_TYPE ((yyval.ttype))), - TYPE_DOMAIN (TREE_TYPE ((yyval.ttype)))); - if (processing_template_decl) - pop_obstacks (); - ;} - break; - - case 310: -#line 1416 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_parenthesized_expr ((yyvsp[(2) - (3)].ttype)); ;} - break; - - case 311: -#line 1418 "../../../gbagnu/gcc/cp/parse.y" - { (yyvsp[(2) - (3)].ttype) = reparse_decl_as_expr (NULL_TREE, (yyvsp[(2) - (3)].ttype)); - (yyval.ttype) = finish_parenthesized_expr ((yyvsp[(2) - (3)].ttype)); ;} - break; - - case 312: -#line 1421 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = error_mark_node; ;} - break; - - case 313: -#line 1423 "../../../gbagnu/gcc/cp/parse.y" - { tree scope = current_scope (); - if (!scope || TREE_CODE (scope) != FUNCTION_DECL) - { - error ("braced-group within expression allowed only inside a function"); - YYERROR; - } - if (pedantic) - pedwarn ("ANSI C++ forbids braced-groups within expressions"); - (yyval.ttype) = begin_stmt_expr (); - ;} - break; - - case 314: -#line 1434 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_stmt_expr ((yyvsp[(2) - (4)].ttype), (yyvsp[(3) - (4)].ttype)); ;} - break; - - case 315: -#line 1439 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_call_expr ((yyvsp[(1) - (4)].ttype), (yyvsp[(3) - (4)].ttype), 1); ;} - break; - - case 316: -#line 1441 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_call_expr ((yyvsp[(1) - (2)].ttype), NULL_TREE, 1); ;} - break; - - case 317: -#line 1443 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_call_expr ((yyvsp[(1) - (4)].ttype), (yyvsp[(3) - (4)].ttype), 0); ;} - break; - - case 318: -#line 1445 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_call_expr ((yyvsp[(1) - (2)].ttype), NULL_TREE, 0); ;} - break; - - case 319: -#line 1447 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = grok_array_decl ((yyval.ttype), (yyvsp[(3) - (4)].ttype)); ;} - break; - - case 320: -#line 1449 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_increment_expr ((yyvsp[(1) - (2)].ttype), POSTINCREMENT_EXPR); ;} - break; - - case 321: -#line 1451 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_increment_expr ((yyvsp[(1) - (2)].ttype), POSTDECREMENT_EXPR); ;} - break; - - case 322: -#line 1454 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_this_expr (); ;} - break; - - case 323: -#line 1456 "../../../gbagnu/gcc/cp/parse.y" - { - /* This is a C cast in C++'s `functional' notation - using the "implicit int" extension so that: - `const (3)' is equivalent to `const int (3)'. */ - tree type; - - if ((yyvsp[(3) - (4)].ttype) == error_mark_node) - { - (yyval.ttype) = error_mark_node; - break; - } - - type = cp_build_qualified_type (integer_type_node, - cp_type_qual_from_rid ((yyvsp[(1) - (4)].ttype))); - (yyval.ttype) = build_c_cast (type, build_compound_expr ((yyvsp[(3) - (4)].ttype))); - ;} - break; - - case 325: -#line 1474 "../../../gbagnu/gcc/cp/parse.y" - { tree type = groktypename ((yyvsp[(3) - (7)].ftype).t); - check_for_new_type ("dynamic_cast", (yyvsp[(3) - (7)].ftype)); - (yyval.ttype) = build_dynamic_cast (type, (yyvsp[(6) - (7)].ttype)); ;} - break; - - case 326: -#line 1478 "../../../gbagnu/gcc/cp/parse.y" - { tree type = groktypename ((yyvsp[(3) - (7)].ftype).t); - check_for_new_type ("static_cast", (yyvsp[(3) - (7)].ftype)); - (yyval.ttype) = build_static_cast (type, (yyvsp[(6) - (7)].ttype)); ;} - break; - - case 327: -#line 1482 "../../../gbagnu/gcc/cp/parse.y" - { tree type = groktypename ((yyvsp[(3) - (7)].ftype).t); - check_for_new_type ("reinterpret_cast", (yyvsp[(3) - (7)].ftype)); - (yyval.ttype) = build_reinterpret_cast (type, (yyvsp[(6) - (7)].ttype)); ;} - break; - - case 328: -#line 1486 "../../../gbagnu/gcc/cp/parse.y" - { tree type = groktypename ((yyvsp[(3) - (7)].ftype).t); - check_for_new_type ("const_cast", (yyvsp[(3) - (7)].ftype)); - (yyval.ttype) = build_const_cast (type, (yyvsp[(6) - (7)].ttype)); ;} - break; - - case 329: -#line 1490 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_typeid ((yyvsp[(3) - (4)].ttype)); ;} - break; - - case 330: -#line 1492 "../../../gbagnu/gcc/cp/parse.y" - { tree type = groktypename ((yyvsp[(3) - (4)].ftype).t); - check_for_new_type ("typeid", (yyvsp[(3) - (4)].ftype)); - (yyval.ttype) = get_typeid (TYPE_MAIN_VARIANT (type)); ;} - break; - - case 331: -#line 1496 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = do_scoped_id ((yyvsp[(2) - (2)].ttype), 1); ;} - break; - - case 332: -#line 1498 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(2) - (2)].ttype); ;} - break; - - case 333: -#line 1500 "../../../gbagnu/gcc/cp/parse.y" - { - got_scope = NULL_TREE; - if (TREE_CODE ((yyvsp[(2) - (2)].ttype)) == IDENTIFIER_NODE) - (yyval.ttype) = do_scoped_id ((yyvsp[(2) - (2)].ttype), 1); - else - (yyval.ttype) = (yyvsp[(2) - (2)].ttype); - ;} - break; - - case 334: -#line 1508 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_offset_ref (OP0 ((yyval.ttype)), OP1 ((yyval.ttype))); ;} - break; - - case 335: -#line 1510 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_qualified_call_expr ((yyvsp[(1) - (4)].ttype), (yyvsp[(3) - (4)].ttype)); ;} - break; - - case 336: -#line 1512 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_qualified_call_expr ((yyvsp[(1) - (2)].ttype), NULL_TREE); ;} - break; - - case 337: -#line 1514 "../../../gbagnu/gcc/cp/parse.y" - { - (yyval.ttype) = build_x_component_ref ((yyval.ttype), (yyvsp[(2) - (2)].ttype), NULL_TREE, 1); - ;} - break; - - case 338: -#line 1518 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_object_call_expr ((yyvsp[(2) - (5)].ttype), (yyvsp[(1) - (5)].ttype), (yyvsp[(4) - (5)].ttype)); ;} - break; - - case 339: -#line 1520 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_object_call_expr ((yyvsp[(2) - (3)].ttype), (yyvsp[(1) - (3)].ttype), NULL_TREE); ;} - break; - - case 340: -#line 1522 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_x_component_ref ((yyval.ttype), (yyvsp[(2) - (2)].ttype), NULL_TREE, 1); ;} - break; - - case 341: -#line 1524 "../../../gbagnu/gcc/cp/parse.y" - { if (processing_template_decl) - (yyval.ttype) = build_min_nt (COMPONENT_REF, (yyvsp[(1) - (2)].ttype), copy_to_permanent ((yyvsp[(2) - (2)].ttype))); - else - (yyval.ttype) = build_object_ref ((yyval.ttype), OP0 ((yyvsp[(2) - (2)].ttype)), OP1 ((yyvsp[(2) - (2)].ttype))); ;} - break; - - case 342: -#line 1529 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_object_call_expr ((yyvsp[(2) - (5)].ttype), (yyvsp[(1) - (5)].ttype), (yyvsp[(4) - (5)].ttype)); ;} - break; - - case 343: -#line 1531 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_object_call_expr ((yyvsp[(2) - (3)].ttype), (yyvsp[(1) - (3)].ttype), NULL_TREE); ;} - break; - - case 344: -#line 1533 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_qualified_object_call_expr ((yyvsp[(2) - (5)].ttype), (yyvsp[(1) - (5)].ttype), (yyvsp[(4) - (5)].ttype)); ;} - break; - - case 345: -#line 1535 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_qualified_object_call_expr ((yyvsp[(2) - (3)].ttype), (yyvsp[(1) - (3)].ttype), NULL_TREE); ;} - break; - - case 346: -#line 1538 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_pseudo_destructor_call_expr ((yyvsp[(1) - (4)].ttype), NULL_TREE, (yyvsp[(3) - (4)].ttype)); ;} - break; - - case 347: -#line 1540 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_pseudo_destructor_call_expr ((yyvsp[(1) - (6)].ttype), (yyvsp[(2) - (6)].ttype), (yyvsp[(5) - (6)].ttype)); ;} - break; - - case 348: -#line 1542 "../../../gbagnu/gcc/cp/parse.y" - { - (yyval.ttype) = error_mark_node; - ;} - break; - - case 349: -#line 1587 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.itype) = 0; ;} - break; - - case 350: -#line 1589 "../../../gbagnu/gcc/cp/parse.y" - { got_scope = NULL_TREE; (yyval.itype) = 1; ;} - break; - - case 351: -#line 1594 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.itype) = 0; ;} - break; - - case 352: -#line 1596 "../../../gbagnu/gcc/cp/parse.y" - { got_scope = NULL_TREE; (yyval.itype) = 1; ;} - break; - - case 353: -#line 1601 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = boolean_true_node; ;} - break; - - case 354: -#line 1603 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = boolean_false_node; ;} - break; - - case 356: -#line 1610 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = chainon ((yyval.ttype), (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 357: -#line 1615 "../../../gbagnu/gcc/cp/parse.y" - { - if (! current_function_parms_stored) - store_parm_decls (); - setup_vtbl_ptr (); - /* Always keep the BLOCK node associated with the outermost - pair of curley braces of a function. These are needed - for correct operation of dwarfout.c. */ - keep_next_level (); - ;} - break; - - case 358: -#line 1628 "../../../gbagnu/gcc/cp/parse.y" - { got_object = TREE_TYPE ((yyval.ttype)); ;} - break; - - case 359: -#line 1630 "../../../gbagnu/gcc/cp/parse.y" - { - (yyval.ttype) = build_x_arrow ((yyval.ttype)); - got_object = TREE_TYPE ((yyval.ttype)); - ;} - break; - - case 360: -#line 1638 "../../../gbagnu/gcc/cp/parse.y" - { - resume_momentary ((yyvsp[(2) - (3)].itype)); - if ((yyvsp[(1) - (3)].ftype).t && IS_AGGR_TYPE_CODE (TREE_CODE ((yyvsp[(1) - (3)].ftype).t))) - note_got_semicolon ((yyvsp[(1) - (3)].ftype).t); - ;} - break; - - case 361: -#line 1644 "../../../gbagnu/gcc/cp/parse.y" - { - resume_momentary ((yyvsp[(2) - (3)].itype)); - note_list_got_semicolon ((yyvsp[(1) - (3)].ftype).t); - ;} - break; - - case 362: -#line 1649 "../../../gbagnu/gcc/cp/parse.y" - { resume_momentary ((yyvsp[(2) - (3)].itype)); ;} - break; - - case 363: -#line 1651 "../../../gbagnu/gcc/cp/parse.y" - { - shadow_tag ((yyvsp[(1) - (2)].ftype).t); - note_list_got_semicolon ((yyvsp[(1) - (2)].ftype).t); - ;} - break; - - case 364: -#line 1656 "../../../gbagnu/gcc/cp/parse.y" - { warning ("empty declaration"); ;} - break; - - case 365: -#line 1658 "../../../gbagnu/gcc/cp/parse.y" - { pedantic = (yyvsp[(1) - (2)].itype); ;} - break; - - case 368: -#line 1672 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_call_declarator (NULL_TREE, empty_parms (), - NULL_TREE, NULL_TREE); ;} - break; - - case 369: -#line 1675 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_call_declarator ((yyval.ttype), empty_parms (), NULL_TREE, - NULL_TREE); ;} - break; - - case 370: -#line 1682 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = build_decl_list ((yyvsp[(1) - (2)].ftype).t, (yyvsp[(2) - (2)].ttype)); - (yyval.ftype).new_type_flag = (yyvsp[(1) - (2)].ftype).new_type_flag; ;} - break; - - case 371: -#line 1685 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = build_decl_list ((yyvsp[(1) - (2)].ftype).t, (yyvsp[(2) - (2)].ttype)); - (yyval.ftype).new_type_flag = (yyvsp[(1) - (2)].ftype).new_type_flag; ;} - break; - - case 372: -#line 1688 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = build_decl_list (get_decl_list ((yyvsp[(1) - (2)].ftype).t), (yyvsp[(2) - (2)].ttype)); - (yyval.ftype).new_type_flag = (yyvsp[(1) - (2)].ftype).new_type_flag; ;} - break; - - case 373: -#line 1691 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = build_decl_list ((yyvsp[(1) - (1)].ftype).t, NULL_TREE); - (yyval.ftype).new_type_flag = (yyvsp[(1) - (1)].ftype).new_type_flag; ;} - break; - - case 374: -#line 1694 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = build_decl_list ((yyvsp[(1) - (1)].ftype).t, NULL_TREE); - (yyval.ftype).new_type_flag = (yyvsp[(1) - (1)].ftype).new_type_flag; ;} - break; - - case 377: -#line 1710 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = decl_tree_cons (NULL_TREE, (yyvsp[(2) - (2)].ftype).t, (yyvsp[(1) - (2)].ttype)); - (yyval.ftype).new_type_flag = (yyvsp[(2) - (2)].ftype).new_type_flag; ;} - break; - - case 378: -#line 1713 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = decl_tree_cons (NULL_TREE, (yyvsp[(1) - (2)].ftype).t, (yyvsp[(2) - (2)].ttype)); - (yyval.ftype).new_type_flag = (yyvsp[(1) - (2)].ftype).new_type_flag; ;} - break; - - case 379: -#line 1716 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = decl_tree_cons (NULL_TREE, (yyvsp[(1) - (3)].ftype).t, chainon ((yyvsp[(2) - (3)].ttype), (yyvsp[(3) - (3)].ttype))); - (yyval.ftype).new_type_flag = (yyvsp[(1) - (3)].ftype).new_type_flag; ;} - break; - - case 380: -#line 1719 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = decl_tree_cons (NULL_TREE, (yyvsp[(2) - (3)].ftype).t, chainon ((yyvsp[(3) - (3)].ttype), (yyvsp[(1) - (3)].ttype))); - (yyval.ftype).new_type_flag = (yyvsp[(2) - (3)].ftype).new_type_flag; ;} - break; - - case 381: -#line 1722 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = decl_tree_cons (NULL_TREE, (yyvsp[(2) - (3)].ftype).t, chainon ((yyvsp[(3) - (3)].ttype), (yyvsp[(1) - (3)].ttype))); - (yyval.ftype).new_type_flag = (yyvsp[(2) - (3)].ftype).new_type_flag; ;} - break; - - case 382: -#line 1725 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = decl_tree_cons (NULL_TREE, (yyvsp[(2) - (4)].ftype).t, - chainon ((yyvsp[(3) - (4)].ttype), chainon ((yyvsp[(4) - (4)].ttype), (yyvsp[(1) - (4)].ttype)))); - (yyval.ftype).new_type_flag = (yyvsp[(2) - (4)].ftype).new_type_flag; ;} - break; - - case 383: -#line 1732 "../../../gbagnu/gcc/cp/parse.y" - { if (extra_warnings) - warning ("`%s' is not at beginning of declaration", - IDENTIFIER_POINTER ((yyval.ttype))); - (yyval.ttype) = build_decl_list (NULL_TREE, (yyval.ttype)); ;} - break; - - case 384: -#line 1737 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = decl_tree_cons (NULL_TREE, (yyvsp[(2) - (2)].ftype).t, (yyval.ttype)); ;} - break; - - case 385: -#line 1739 "../../../gbagnu/gcc/cp/parse.y" - { if (extra_warnings) - warning ("`%s' is not at beginning of declaration", - IDENTIFIER_POINTER ((yyvsp[(2) - (2)].ttype))); - (yyval.ttype) = decl_tree_cons (NULL_TREE, (yyvsp[(2) - (2)].ttype), (yyval.ttype)); ;} - break; - - case 386: -#line 1744 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = decl_tree_cons ((yyvsp[(2) - (2)].ttype), NULL_TREE, (yyvsp[(1) - (2)].ttype)); ;} - break; - - case 387: -#line 1746 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = decl_tree_cons ((yyvsp[(1) - (1)].ttype), NULL_TREE, NULL_TREE); ;} - break; - - case 388: -#line 1756 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(1) - (1)].ftype).t; TREE_STATIC ((yyval.ttype)) = 1; ;} - break; - - case 389: -#line 1758 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = IDENTIFIER_AS_LIST ((yyval.ttype)); ;} - break; - - case 390: -#line 1760 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = decl_tree_cons (NULL_TREE, (yyvsp[(2) - (2)].ttype), (yyval.ttype)); - TREE_STATIC ((yyval.ttype)) = 1; ;} - break; - - case 391: -#line 1763 "../../../gbagnu/gcc/cp/parse.y" - { if (extra_warnings && TREE_STATIC ((yyval.ttype))) - warning ("`%s' is not at beginning of declaration", - IDENTIFIER_POINTER ((yyvsp[(2) - (2)].ttype))); - (yyval.ttype) = decl_tree_cons (NULL_TREE, (yyvsp[(2) - (2)].ttype), (yyval.ttype)); - TREE_STATIC ((yyval.ttype)) = TREE_STATIC ((yyvsp[(1) - (2)].ttype)); ;} - break; - - case 392: -#line 1769 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = decl_tree_cons ((yyvsp[(2) - (2)].ttype), NULL_TREE, (yyvsp[(1) - (2)].ttype)); ;} - break; - - case 393: -#line 1771 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = decl_tree_cons ((yyvsp[(1) - (1)].ttype), NULL_TREE, NULL_TREE); ;} - break; - - case 394: -#line 1782 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = get_decl_list ((yyvsp[(1) - (1)].ftype).t); - (yyval.ftype).new_type_flag = (yyvsp[(1) - (1)].ftype).new_type_flag; ;} - break; - - case 395: -#line 1785 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = decl_tree_cons (NULL_TREE, (yyvsp[(2) - (2)].ftype).t, (yyvsp[(1) - (2)].ftype).t); - (yyval.ftype).new_type_flag = (yyvsp[(2) - (2)].ftype).new_type_flag; ;} - break; - - case 396: -#line 1788 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = decl_tree_cons (NULL_TREE, (yyvsp[(1) - (2)].ftype).t, (yyvsp[(2) - (2)].ttype)); - (yyval.ftype).new_type_flag = (yyvsp[(1) - (2)].ftype).new_type_flag; ;} - break; - - case 397: -#line 1791 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = decl_tree_cons (NULL_TREE, (yyvsp[(2) - (3)].ftype).t, chainon ((yyvsp[(3) - (3)].ttype), (yyvsp[(1) - (3)].ftype).t)); - (yyval.ftype).new_type_flag = (yyvsp[(1) - (3)].ftype).new_type_flag; ;} - break; - - case 398: -#line 1797 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_decl_list (NULL_TREE, (yyvsp[(1) - (1)].ftype).t); ;} - break; - - case 399: -#line 1799 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = decl_tree_cons (NULL_TREE, (yyvsp[(2) - (2)].ftype).t, (yyvsp[(1) - (2)].ttype)); ;} - break; - - case 401: -#line 1809 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = (yyvsp[(1) - (1)].ttype); (yyval.ftype).new_type_flag = 0; ;} - break; - - case 402: -#line 1811 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = (yyvsp[(1) - (1)].ttype); (yyval.ftype).new_type_flag = 0; ;} - break; - - case 403: -#line 1813 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = finish_typeof ((yyvsp[(3) - (4)].ttype)); - (yyval.ftype).new_type_flag = 0; ;} - break; - - case 404: -#line 1816 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = groktypename ((yyvsp[(3) - (4)].ftype).t); - (yyval.ftype).new_type_flag = 0; ;} - break; - - case 405: -#line 1819 "../../../gbagnu/gcc/cp/parse.y" - { tree type = TREE_TYPE ((yyvsp[(3) - (4)].ttype)); - - (yyval.ftype).new_type_flag = 0; - if (IS_AGGR_TYPE (type)) - { - sorry ("sigof type specifier"); - (yyval.ftype).t = type; - } - else - { - error ("`sigof' applied to non-aggregate expression"); - (yyval.ftype).t = error_mark_node; - } - ;} - break; - - case 406: -#line 1834 "../../../gbagnu/gcc/cp/parse.y" - { tree type = groktypename ((yyvsp[(3) - (4)].ftype).t); - - (yyval.ftype).new_type_flag = 0; - if (IS_AGGR_TYPE (type)) - { - sorry ("sigof type specifier"); - (yyval.ftype).t = type; - } - else - { - error("`sigof' applied to non-aggregate type"); - (yyval.ftype).t = error_mark_node; - } - ;} - break; - - case 407: -#line 1854 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = (yyvsp[(1) - (1)].ttype); (yyval.ftype).new_type_flag = 0; ;} - break; - - case 408: -#line 1856 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = (yyvsp[(1) - (1)].ttype); (yyval.ftype).new_type_flag = 0; ;} - break; - - case 411: -#line 1863 "../../../gbagnu/gcc/cp/parse.y" - { check_multiple_declarators (); ;} - break; - - case 413: -#line 1869 "../../../gbagnu/gcc/cp/parse.y" - { check_multiple_declarators (); ;} - break; - - case 415: -#line 1875 "../../../gbagnu/gcc/cp/parse.y" - { check_multiple_declarators (); ;} - break; - - case 416: -#line 1880 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = NULL_TREE; ;} - break; - - case 417: -#line 1882 "../../../gbagnu/gcc/cp/parse.y" - { if (TREE_CHAIN ((yyvsp[(3) - (4)].ttype))) (yyvsp[(3) - (4)].ttype) = combine_strings ((yyvsp[(3) - (4)].ttype)); (yyval.ttype) = (yyvsp[(3) - (4)].ttype); ;} - break; - - case 418: -#line 1887 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = start_decl ((yyvsp[(1) - (4)].ttype), current_declspecs, 1, - (yyvsp[(3) - (4)].ttype), prefix_attributes); ;} - break; - - case 419: -#line 1891 "../../../gbagnu/gcc/cp/parse.y" - { cp_finish_decl ((yyvsp[(5) - (6)].ttype), (yyvsp[(6) - (6)].ttype), (yyvsp[(2) - (6)].ttype), 1, LOOKUP_ONLYCONVERTING); ;} - break; - - case 420: -#line 1893 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = start_decl ((yyvsp[(1) - (3)].ttype), current_declspecs, 0, - (yyvsp[(3) - (3)].ttype), prefix_attributes); - cp_finish_decl ((yyval.ttype), NULL_TREE, (yyvsp[(2) - (3)].ttype), 1, 0); ;} - break; - - case 421: -#line 1906 "../../../gbagnu/gcc/cp/parse.y" - { (yyvsp[(2) - (2)].itype) = parse_decl ((yyvsp[(-1) - (2)].ttype), (yyvsp[(-2) - (2)].ttype), - (yyvsp[(1) - (2)].ttype), 1, &(yyval.ttype)); ;} - break; - - case 422: -#line 1911 "../../../gbagnu/gcc/cp/parse.y" - { cp_finish_decl ((yyvsp[(3) - (4)].ttype), (yyvsp[(4) - (4)].ttype), (yyvsp[(0) - (4)].ttype), 1, - LOOKUP_ONLYCONVERTING); - (yyval.itype) = (yyvsp[(2) - (4)].itype); ;} - break; - - case 423: -#line 1915 "../../../gbagnu/gcc/cp/parse.y" - { tree d; - (yyval.itype) = parse_decl ((yyvsp[(-1) - (1)].ttype), (yyvsp[(-2) - (1)].ttype), (yyvsp[(1) - (1)].ttype), 0, &d); - cp_finish_decl (d, NULL_TREE, (yyvsp[(0) - (1)].ttype), 1, 0); ;} - break; - - case 424: -#line 1922 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.itype) = (yyvsp[(3) - (3)].itype); ;} - break; - - case 425: -#line 1926 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.itype) = (yyvsp[(3) - (3)].itype); ;} - break; - - case 426: -#line 1931 "../../../gbagnu/gcc/cp/parse.y" - { /* Set things up as initdcl0_innards expects. */ - (yyvsp[(2) - (2)].ttype) = (yyvsp[(1) - (2)].ttype); - (yyvsp[(1) - (2)].ttype) = NULL_TREE; ;} - break; - - case 427: -#line 1935 "../../../gbagnu/gcc/cp/parse.y" - {;} - break; - - case 428: -#line 1937 "../../../gbagnu/gcc/cp/parse.y" - { tree d; - parse_decl((yyvsp[(1) - (3)].ttype), NULL_TREE, (yyvsp[(3) - (3)].ttype), 0, &d); - cp_finish_decl (d, NULL_TREE, (yyvsp[(2) - (3)].ttype), 1, 0); ;} - break; - - case 429: -#line 1946 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = NULL_TREE; ;} - break; - - case 430: -#line 1948 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(1) - (1)].ttype); ;} - break; - - case 431: -#line 1953 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(1) - (1)].ttype); ;} - break; - - case 432: -#line 1955 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = chainon ((yyvsp[(1) - (2)].ttype), (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 433: -#line 1960 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(4) - (6)].ttype); ;} - break; - - case 434: -#line 1965 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(1) - (1)].ttype); ;} - break; - - case 435: -#line 1967 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = chainon ((yyvsp[(1) - (3)].ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 436: -#line 1972 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = NULL_TREE; ;} - break; - - case 437: -#line 1974 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_tree_list ((yyvsp[(1) - (1)].ttype), NULL_TREE); ;} - break; - - case 438: -#line 1976 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_tree_list ((yyvsp[(1) - (4)].ttype), build_tree_list (NULL_TREE, (yyvsp[(3) - (4)].ttype))); ;} - break; - - case 439: -#line 1978 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_tree_list ((yyvsp[(1) - (6)].ttype), tree_cons (NULL_TREE, (yyvsp[(3) - (6)].ttype), (yyvsp[(5) - (6)].ttype))); ;} - break; - - case 440: -#line 1980 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_tree_list ((yyvsp[(1) - (4)].ttype), (yyvsp[(3) - (4)].ttype)); ;} - break; - - case 445: -#line 1996 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_tree_list (NULL_TREE, (yyvsp[(1) - (1)].ttype)); ;} - break; - - case 446: -#line 1998 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = chainon ((yyvsp[(1) - (3)].ttype), build_tree_list (NULL_TREE, (yyvsp[(3) - (3)].ttype))); ;} - break; - - case 447: -#line 2003 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = NULL_TREE; ;} - break; - - case 448: -#line 2005 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(2) - (2)].ttype); ;} - break; - - case 450: -#line 2013 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_nt (CONSTRUCTOR, NULL_TREE, NULL_TREE); - TREE_HAS_CONSTRUCTOR ((yyval.ttype)) = 1; ;} - break; - - case 451: -#line 2016 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_nt (CONSTRUCTOR, NULL_TREE, nreverse ((yyvsp[(2) - (3)].ttype))); - TREE_HAS_CONSTRUCTOR ((yyval.ttype)) = 1; ;} - break; - - case 452: -#line 2019 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_nt (CONSTRUCTOR, NULL_TREE, nreverse ((yyvsp[(2) - (4)].ttype))); - TREE_HAS_CONSTRUCTOR ((yyval.ttype)) = 1; ;} - break; - - case 453: -#line 2022 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = NULL_TREE; ;} - break; - - case 454: -#line 2029 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_tree_list (NULL_TREE, (yyval.ttype)); ;} - break; - - case 455: -#line 2031 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = expr_tree_cons (NULL_TREE, (yyvsp[(3) - (3)].ttype), (yyval.ttype)); ;} - break; - - case 456: -#line 2034 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_expr_list ((yyvsp[(2) - (4)].ttype), (yyvsp[(4) - (4)].ttype)); ;} - break; - - case 457: -#line 2036 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_expr_list ((yyval.ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 458: -#line 2038 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = expr_tree_cons ((yyvsp[(3) - (5)].ttype), (yyvsp[(5) - (5)].ttype), (yyval.ttype)); ;} - break; - - case 459: -#line 2043 "../../../gbagnu/gcc/cp/parse.y" - { start_function (NULL_TREE, TREE_VALUE ((yyvsp[(1) - (1)].ttype)), - NULL_TREE, 2); - reinit_parse_for_function (); ;} - break; - - case 460: -#line 2049 "../../../gbagnu/gcc/cp/parse.y" - { - int nested = (hack_decl_function_context - (current_function_decl) != NULL_TREE); - finish_function (lineno, (int)(yyvsp[(3) - (4)].itype) | 2, nested); - process_next_inline ((yyvsp[(1) - (4)].ttype)); - ;} - break; - - case 461: -#line 2056 "../../../gbagnu/gcc/cp/parse.y" - { - int nested = (hack_decl_function_context - (current_function_decl) != NULL_TREE); - finish_function (lineno, (int)(yyvsp[(3) - (3)].itype) | 2, nested); - process_next_inline ((yyvsp[(1) - (3)].ttype)); - ;} - break; - - case 462: -#line 2063 "../../../gbagnu/gcc/cp/parse.y" - { process_next_inline ((yyvsp[(1) - (3)].ttype)); ;} - break; - - case 465: -#line 2075 "../../../gbagnu/gcc/cp/parse.y" - { replace_defarg ((yyvsp[(1) - (3)].ttype), (yyvsp[(2) - (3)].ttype)); ;} - break; - - case 466: -#line 2077 "../../../gbagnu/gcc/cp/parse.y" - { replace_defarg ((yyvsp[(1) - (3)].ttype), error_mark_node); ;} - break; - - case 468: -#line 2082 "../../../gbagnu/gcc/cp/parse.y" - { do_pending_defargs (); ;} - break; - - case 469: -#line 2084 "../../../gbagnu/gcc/cp/parse.y" - { do_pending_defargs (); ;} - break; - - case 470: -#line 2089 "../../../gbagnu/gcc/cp/parse.y" - { (yyvsp[(3) - (3)].itype) = suspend_momentary (); - (yyval.ttype) = current_enum_type; - current_enum_type = start_enum ((yyvsp[(2) - (3)].ttype)); ;} - break; - - case 471: -#line 2093 "../../../gbagnu/gcc/cp/parse.y" - { TYPE_VALUES (current_enum_type) = (yyvsp[(5) - (7)].ttype); - (yyval.ftype).t = finish_enum (current_enum_type); - (yyval.ftype).new_type_flag = 1; - current_enum_type = (yyvsp[(4) - (7)].ttype); - resume_momentary ((int) (yyvsp[(3) - (7)].itype)); - check_for_missing_semicolon ((yyval.ftype).t); ;} - break; - - case 472: -#line 2100 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = finish_enum (start_enum ((yyvsp[(2) - (4)].ttype))); - (yyval.ftype).new_type_flag = 1; - check_for_missing_semicolon ((yyval.ftype).t); ;} - break; - - case 473: -#line 2104 "../../../gbagnu/gcc/cp/parse.y" - { (yyvsp[(2) - (2)].itype) = suspend_momentary (); - (yyval.ttype) = current_enum_type; - current_enum_type = start_enum (make_anon_name ()); ;} - break; - - case 474: -#line 2108 "../../../gbagnu/gcc/cp/parse.y" - { TYPE_VALUES (current_enum_type) = (yyvsp[(4) - (6)].ttype); - (yyval.ftype).t = finish_enum (current_enum_type); - (yyval.ftype).new_type_flag = 1; - current_enum_type = (yyvsp[(3) - (6)].ttype); - resume_momentary ((int) (yyvsp[(1) - (6)].itype)); - check_for_missing_semicolon ((yyval.ftype).t); ;} - break; - - case 475: -#line 2115 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = finish_enum (start_enum (make_anon_name())); - (yyval.ftype).new_type_flag = 1; - check_for_missing_semicolon ((yyval.ftype).t); ;} - break; - - case 476: -#line 2119 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = xref_tag (enum_type_node, (yyvsp[(2) - (2)].ttype), 1); - (yyval.ftype).new_type_flag = 0; ;} - break; - - case 477: -#line 2122 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = xref_tag (enum_type_node, (yyvsp[(2) - (2)].ttype), 1); - (yyval.ftype).new_type_flag = 0; ;} - break; - - case 478: -#line 2125 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = (yyvsp[(2) - (2)].ttype); - (yyval.ftype).new_type_flag = 0; - if (!processing_template_decl) - cp_pedwarn ("using `typename' outside of template"); ;} - break; - - case 479: -#line 2132 "../../../gbagnu/gcc/cp/parse.y" - { - int semi; - - if (yychar == YYEMPTY) - yychar = YYLEX; - semi = yychar == ';'; - - (yyval.ttype) = finish_class_definition ((yyvsp[(1) - (5)].ttype), (yyvsp[(5) - (5)].ttype), semi); - ;} - break; - - case 480: -#line 2142 "../../../gbagnu/gcc/cp/parse.y" - { finish_default_args (); ;} - break; - - case 481: -#line 2144 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = (yyvsp[(6) - (9)].ttype); - (yyval.ftype).new_type_flag = 1; - begin_inline_definitions (); ;} - break; - - case 482: -#line 2148 "../../../gbagnu/gcc/cp/parse.y" - { - (yyval.ftype).new_type_flag = 0; - if (TYPE_BINFO ((yyvsp[(1) - (1)].ttype)) == NULL_TREE) - { - cp_error ("%T is not a class type", (yyvsp[(1) - (1)].ttype)); - (yyval.ftype).t = error_mark_node; - } - else - { - (yyval.ftype).t = (yyvsp[(1) - (1)].ttype); - /* struct B: public A; is not accepted by the WP grammar. */ - if (TYPE_BINFO_BASETYPES ((yyval.ftype).t) && !TYPE_SIZE ((yyval.ftype).t) - && ! TYPE_BEING_DEFINED ((yyval.ftype).t)) - cp_error ("base clause without member specification for `%#T'", - (yyval.ftype).t); - } - ;} - break; - - case 486: -#line 2175 "../../../gbagnu/gcc/cp/parse.y" - { if (pedantic && !in_system_header) - pedwarn ("comma at end of enumerator list"); ;} - break; - - case 488: -#line 2182 "../../../gbagnu/gcc/cp/parse.y" - { error ("storage class specifier `%s' not allowed after struct or class", IDENTIFIER_POINTER ((yyvsp[(2) - (2)].ttype))); ;} - break; - - case 489: -#line 2184 "../../../gbagnu/gcc/cp/parse.y" - { error ("type specifier `%s' not allowed after struct or class", IDENTIFIER_POINTER ((yyvsp[(2) - (2)].ttype))); ;} - break; - - case 490: -#line 2186 "../../../gbagnu/gcc/cp/parse.y" - { error ("type qualifier `%s' not allowed after struct or class", IDENTIFIER_POINTER ((yyvsp[(2) - (2)].ttype))); ;} - break; - - case 491: -#line 2188 "../../../gbagnu/gcc/cp/parse.y" - { error ("no body nor ';' separates two class, struct or union declarations"); ;} - break; - - case 492: -#line 2190 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_decl_list ((yyvsp[(2) - (2)].ttype), (yyvsp[(1) - (2)].ttype)); ;} - break; - - case 493: -#line 2195 "../../../gbagnu/gcc/cp/parse.y" - { - current_aggr = (yyvsp[(1) - (2)].ttype); - (yyval.ttype) = (yyvsp[(2) - (2)].ttype); - ;} - break; - - case 494: -#line 2203 "../../../gbagnu/gcc/cp/parse.y" - { current_aggr = (yyval.ttype); (yyval.ttype) = (yyvsp[(2) - (2)].ttype); ;} - break; - - case 495: -#line 2205 "../../../gbagnu/gcc/cp/parse.y" - { yyungetc ('{', 1); ;} - break; - - case 496: -#line 2207 "../../../gbagnu/gcc/cp/parse.y" - { yyungetc (':', 1); ;} - break; - - case 497: -#line 2212 "../../../gbagnu/gcc/cp/parse.y" - { - current_aggr = (yyvsp[(1) - (3)].ttype); - (yyval.ttype) = handle_class_head ((yyvsp[(1) - (3)].ttype), (yyvsp[(2) - (3)].ttype), (yyvsp[(3) - (3)].ttype)); - ;} - break; - - case 498: -#line 2217 "../../../gbagnu/gcc/cp/parse.y" - { - current_aggr = (yyvsp[(1) - (4)].ttype); - (yyval.ttype) = handle_class_head ((yyvsp[(1) - (4)].ttype), (yyvsp[(3) - (4)].ttype), (yyvsp[(4) - (4)].ttype)); - ;} - break; - - case 499: -#line 2222 "../../../gbagnu/gcc/cp/parse.y" - { - current_aggr = (yyvsp[(1) - (3)].ttype); - (yyval.ttype) = handle_class_head ((yyvsp[(1) - (3)].ttype), NULL_TREE, (yyvsp[(3) - (3)].ttype)); - ;} - break; - - case 500: -#line 2227 "../../../gbagnu/gcc/cp/parse.y" - { current_aggr = (yyval.ttype); (yyval.ttype) = (yyvsp[(2) - (2)].ttype); ;} - break; - - case 501: -#line 2229 "../../../gbagnu/gcc/cp/parse.y" - { current_aggr = (yyval.ttype); (yyval.ttype) = (yyvsp[(3) - (3)].ttype); ;} - break; - - case 502: -#line 2234 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = xref_tag (current_aggr, (yyvsp[(1) - (1)].ttype), 1); ;} - break; - - case 503: -#line 2236 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = xref_tag (current_aggr, (yyvsp[(1) - (1)].ttype), 0); ;} - break; - - case 504: -#line 2240 "../../../gbagnu/gcc/cp/parse.y" - { - (yyval.ttype) = (yyvsp[(2) - (3)].ttype); - if ((yyvsp[(3) - (3)].ttype)) - xref_basetypes (current_aggr, (yyvsp[(1) - (3)].ttype), (yyvsp[(2) - (3)].ttype), (yyvsp[(3) - (3)].ttype)); - ;} - break; - - case 505: -#line 2246 "../../../gbagnu/gcc/cp/parse.y" - { push_scope (CP_DECL_CONTEXT ((yyvsp[(1) - (1)].ttype))); ;} - break; - - case 506: -#line 2248 "../../../gbagnu/gcc/cp/parse.y" - { - pop_scope (CP_DECL_CONTEXT ((yyvsp[(1) - (3)].ttype))); - (yyval.ttype) = TREE_TYPE ((yyvsp[(1) - (3)].ttype)); - if (current_aggr == union_type_node - && TREE_CODE ((yyval.ttype)) != UNION_TYPE) - cp_pedwarn ("`union' tag used in declaring `%#T'", (yyval.ttype)); - else if (TREE_CODE ((yyval.ttype)) == UNION_TYPE - && current_aggr != union_type_node) - cp_pedwarn ("non-`union' tag used in declaring `%#T'", (yyval.ttype)); - else if (TREE_CODE ((yyval.ttype)) == RECORD_TYPE) - /* We might be specializing a template with a different - class-key; deal. */ - CLASSTYPE_DECLARED_CLASS ((yyval.ttype)) = (current_aggr - == class_type_node); - if ((yyvsp[(3) - (3)].ttype)) - { - maybe_process_partial_specialization ((yyval.ttype)); - xref_basetypes (current_aggr, (yyvsp[(1) - (3)].ttype), (yyval.ttype), (yyvsp[(3) - (3)].ttype)); - } - ;} - break; - - case 507: -#line 2272 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = xref_tag ((yyval.ttype), make_anon_name (), 0); - yyungetc ('{', 1); ;} - break; - - case 510: -#line 2283 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = NULL_TREE; ;} - break; - - case 511: -#line 2285 "../../../gbagnu/gcc/cp/parse.y" - { yyungetc(':', 1); (yyval.ttype) = NULL_TREE; ;} - break; - - case 512: -#line 2287 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(3) - (3)].ttype); ;} - break; - - case 514: -#line 2293 "../../../gbagnu/gcc/cp/parse.y" - { /* CYGNUS LOCAL Embedded C++ */ - if (flag_embedded_cxx) - pedwarn ("Embedded C++ prohibits multiple inheritance"); - /* END CYGNUS LOCAL Embedded C++ */ - (yyval.ttype) = chainon ((yyval.ttype), (yyvsp[(4) - (4)].ttype)); ;} - break; - - case 515: -#line 2302 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_base_specifier (access_default_node, (yyvsp[(1) - (1)].ttype), - current_aggr - == signature_type_node); ;} - break; - - case 516: -#line 2306 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_base_specifier ((yyvsp[(1) - (3)].ttype), (yyvsp[(3) - (3)].ttype), - current_aggr - == signature_type_node); ;} - break; - - case 517: -#line 2313 "../../../gbagnu/gcc/cp/parse.y" - { if ((yyval.ttype) != error_mark_node) (yyval.ttype) = TYPE_MAIN_DECL ((yyvsp[(1) - (1)].ttype)); ;} - break; - - case 519: -#line 2316 "../../../gbagnu/gcc/cp/parse.y" - { - if (current_aggr == signature_type_node) - { - if (IS_AGGR_TYPE (TREE_TYPE ((yyvsp[(3) - (4)].ttype)))) - { - sorry ("`sigof' as base signature specifier"); - (yyval.ttype) = TREE_TYPE ((yyvsp[(3) - (4)].ttype)); - } - else - { - error ("`sigof' applied to non-aggregate expression"); - (yyval.ttype) = error_mark_node; - } - } - else - { - error ("`sigof' in struct or class declaration"); - (yyval.ttype) = error_mark_node; - } - ;} - break; - - case 520: -#line 2337 "../../../gbagnu/gcc/cp/parse.y" - { - if (current_aggr == signature_type_node) - { - if (IS_AGGR_TYPE (groktypename ((yyvsp[(3) - (4)].ftype).t))) - { - sorry ("`sigof' as base signature specifier"); - (yyval.ttype) = groktypename ((yyvsp[(3) - (4)].ftype).t); - } - else - { - error ("`sigof' applied to non-aggregate expression"); - (yyval.ttype) = error_mark_node; - } - } - else - { - error ("`sigof' in struct or class declaration"); - (yyval.ttype) = error_mark_node; - } - ;} - break; - - case 522: -#line 2362 "../../../gbagnu/gcc/cp/parse.y" - { if ((yyvsp[(1) - (2)].ttype) != ridpointers[(int)RID_VIRTUAL]) - cp_error ("`%D' access", (yyvsp[(1) - (2)].ttype)); - (yyval.ttype) = access_default_virtual_node; ;} - break; - - case 523: -#line 2366 "../../../gbagnu/gcc/cp/parse.y" - { - if ((yyvsp[(1) - (3)].ttype) != access_default_virtual_node) - error ("multiple access specifiers"); - else if ((yyvsp[(2) - (3)].ttype) == access_public_node) - (yyval.ttype) = access_public_virtual_node; - else if ((yyvsp[(2) - (3)].ttype) == access_protected_node) - (yyval.ttype) = access_protected_virtual_node; - else /* $2 == access_private_node */ - (yyval.ttype) = access_private_virtual_node; - ;} - break; - - case 524: -#line 2377 "../../../gbagnu/gcc/cp/parse.y" - { if ((yyvsp[(2) - (3)].ttype) != ridpointers[(int)RID_VIRTUAL]) - cp_error ("`%D' access", (yyvsp[(2) - (3)].ttype)); - else if ((yyval.ttype) == access_public_node) - (yyval.ttype) = access_public_virtual_node; - else if ((yyval.ttype) == access_protected_node) - (yyval.ttype) = access_protected_virtual_node; - else if ((yyval.ttype) == access_private_node) - (yyval.ttype) = access_private_virtual_node; - else - error ("multiple `virtual' specifiers"); - ;} - break; - - case 525: -#line 2392 "../../../gbagnu/gcc/cp/parse.y" - { (yyvsp[(0) - (1)].ttype) = begin_class_definition ((yyvsp[(0) - (1)].ttype)); ;} - break; - - case 526: -#line 2397 "../../../gbagnu/gcc/cp/parse.y" - { - finish_member_declaration (build_self_reference ()); - ;} - break; - - case 531: -#line 2411 "../../../gbagnu/gcc/cp/parse.y" - { - if (current_aggr == signature_type_node) - { - error ("access specifier not allowed in signature"); - (yyvsp[(1) - (2)].ttype) = access_public_node; - } - - current_access_specifier = (yyvsp[(1) - (2)].ttype); - ;} - break; - - case 532: -#line 2426 "../../../gbagnu/gcc/cp/parse.y" - { - finish_member_declaration ((yyvsp[(1) - (1)].ttype)); - ;} - break; - - case 533: -#line 2430 "../../../gbagnu/gcc/cp/parse.y" - { - finish_member_declaration ((yyvsp[(2) - (2)].ttype)); - ;} - break; - - case 535: -#line 2438 "../../../gbagnu/gcc/cp/parse.y" - { error ("missing ';' before right brace"); - yyungetc ('}', 0); ;} - break; - - case 536: -#line 2443 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_method ((yyval.ttype)); ;} - break; - - case 537: -#line 2445 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_method ((yyval.ttype)); ;} - break; - - case 538: -#line 2447 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_method ((yyval.ttype)); ;} - break; - - case 539: -#line 2449 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_method ((yyval.ttype)); ;} - break; - - case 540: -#line 2451 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = NULL_TREE; ;} - break; - - case 541: -#line 2453 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(2) - (2)].ttype); - pedantic = (yyvsp[(1) - (2)].itype); ;} - break; - - case 542: -#line 2456 "../../../gbagnu/gcc/cp/parse.y" - { - if ((yyvsp[(2) - (2)].ttype)) - (yyval.ttype) = finish_member_template_decl ((yyvsp[(2) - (2)].ttype)); - else - /* The component was already processed. */ - (yyval.ttype) = NULL_TREE; - - finish_template_decl ((yyvsp[(1) - (2)].ttype)); - ;} - break; - - case 543: -#line 2466 "../../../gbagnu/gcc/cp/parse.y" - { - (yyval.ttype) = finish_member_class_template ((yyvsp[(2) - (3)].ftype).t); - finish_template_decl ((yyvsp[(1) - (3)].ttype)); - ;} - break; - - case 544: -#line 2477 "../../../gbagnu/gcc/cp/parse.y" - { - /* Most of the productions for component_decl only - allow the creation of one new member, so we call - finish_member_declaration in component_decl_list. - For this rule and the next, however, there can be - more than one member, e.g.: - - int i, j; - - and we need the first member to be fully - registered before the second is processed. - Therefore, the rules for components take care of - this processing. To avoid registering the - components more than once, we send NULL_TREE up - here; that lets finish_member_declaration now - that there is nothing to do. */ - if (!(yyvsp[(2) - (2)].itype)) - grok_x_components ((yyvsp[(1) - (2)].ftype).t); - (yyval.ttype) = NULL_TREE; - ;} - break; - - case 545: -#line 2498 "../../../gbagnu/gcc/cp/parse.y" - { - if (!(yyvsp[(2) - (2)].itype)) - grok_x_components ((yyvsp[(1) - (2)].ttype)); - (yyval.ttype) = NULL_TREE; - ;} - break; - - case 546: -#line 2504 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = grokfield ((yyval.ttype), NULL_TREE, (yyvsp[(4) - (4)].ttype), (yyvsp[(2) - (4)].ttype), - build_tree_list ((yyvsp[(3) - (4)].ttype), NULL_TREE)); ;} - break; - - case 547: -#line 2507 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = grokfield ((yyval.ttype), NULL_TREE, (yyvsp[(4) - (4)].ttype), (yyvsp[(2) - (4)].ttype), - build_tree_list ((yyvsp[(3) - (4)].ttype), NULL_TREE)); ;} - break; - - case 548: -#line 2510 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = grokbitfield (NULL_TREE, NULL_TREE, (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 549: -#line 2512 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = NULL_TREE; ;} - break; - - case 550: -#line 2523 "../../../gbagnu/gcc/cp/parse.y" - { tree specs, attrs; - split_specs_attrs ((yyvsp[(1) - (5)].ttype), &specs, &attrs); - (yyval.ttype) = grokfield ((yyvsp[(2) - (5)].ttype), specs, (yyvsp[(5) - (5)].ttype), (yyvsp[(3) - (5)].ttype), - build_tree_list ((yyvsp[(4) - (5)].ttype), attrs)); ;} - break; - - case 551: -#line 2528 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = grokfield ((yyval.ttype), NULL_TREE, (yyvsp[(4) - (4)].ttype), (yyvsp[(2) - (4)].ttype), - build_tree_list ((yyvsp[(3) - (4)].ttype), NULL_TREE)); ;} - break; - - case 552: -#line 2531 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = do_class_using_decl ((yyvsp[(1) - (1)].ttype)); ;} - break; - - case 553: -#line 2537 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.itype) = 0; ;} - break; - - case 554: -#line 2539 "../../../gbagnu/gcc/cp/parse.y" - { - if (PROCESSING_REAL_TEMPLATE_DECL_P ()) - (yyvsp[(1) - (1)].ttype) = finish_member_template_decl ((yyvsp[(1) - (1)].ttype)); - finish_member_declaration ((yyvsp[(1) - (1)].ttype)); - (yyval.itype) = 1; - ;} - break; - - case 555: -#line 2546 "../../../gbagnu/gcc/cp/parse.y" - { - check_multiple_declarators (); - if (PROCESSING_REAL_TEMPLATE_DECL_P ()) - (yyvsp[(3) - (3)].ttype) = finish_member_template_decl ((yyvsp[(3) - (3)].ttype)); - finish_member_declaration ((yyvsp[(3) - (3)].ttype)); - (yyval.itype) = 2; - ;} - break; - - case 556: -#line 2557 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.itype) = 0; ;} - break; - - case 557: -#line 2559 "../../../gbagnu/gcc/cp/parse.y" - { - if (PROCESSING_REAL_TEMPLATE_DECL_P ()) - (yyvsp[(1) - (1)].ttype) = finish_member_template_decl ((yyvsp[(1) - (1)].ttype)); - finish_member_declaration ((yyvsp[(1) - (1)].ttype)); - (yyval.itype) = 1; - ;} - break; - - case 558: -#line 2566 "../../../gbagnu/gcc/cp/parse.y" - { - check_multiple_declarators (); - if (PROCESSING_REAL_TEMPLATE_DECL_P ()) - (yyvsp[(3) - (3)].ttype) = finish_member_template_decl ((yyvsp[(3) - (3)].ttype)); - finish_member_declaration ((yyvsp[(3) - (3)].ttype)); - (yyval.itype) = 2; - ;} - break; - - case 563: -#line 2587 "../../../gbagnu/gcc/cp/parse.y" - { split_specs_attrs ((yyvsp[(0) - (4)].ttype), ¤t_declspecs, - &prefix_attributes); - (yyvsp[(0) - (4)].ttype) = current_declspecs; - (yyval.ttype) = grokfield ((yyval.ttype), current_declspecs, (yyvsp[(4) - (4)].ttype), (yyvsp[(2) - (4)].ttype), - build_tree_list ((yyvsp[(3) - (4)].ttype), prefix_attributes)); ;} - break; - - case 564: -#line 2593 "../../../gbagnu/gcc/cp/parse.y" - { split_specs_attrs ((yyvsp[(0) - (4)].ttype), ¤t_declspecs, - &prefix_attributes); - (yyvsp[(0) - (4)].ttype) = current_declspecs; - (yyval.ttype) = grokbitfield ((yyval.ttype), current_declspecs, (yyvsp[(3) - (4)].ttype)); - cplus_decl_attributes ((yyval.ttype), (yyvsp[(4) - (4)].ttype), prefix_attributes); ;} - break; - - case 565: -#line 2602 "../../../gbagnu/gcc/cp/parse.y" - { split_specs_attrs ((yyvsp[(0) - (4)].ttype), ¤t_declspecs, - &prefix_attributes); - (yyvsp[(0) - (4)].ttype) = current_declspecs; - (yyval.ttype) = grokfield ((yyval.ttype), current_declspecs, (yyvsp[(4) - (4)].ttype), (yyvsp[(2) - (4)].ttype), - build_tree_list ((yyvsp[(3) - (4)].ttype), prefix_attributes)); ;} - break; - - case 566: -#line 2608 "../../../gbagnu/gcc/cp/parse.y" - { split_specs_attrs ((yyvsp[(0) - (4)].ttype), ¤t_declspecs, - &prefix_attributes); - (yyvsp[(0) - (4)].ttype) = current_declspecs; - (yyval.ttype) = grokfield ((yyval.ttype), current_declspecs, (yyvsp[(4) - (4)].ttype), (yyvsp[(2) - (4)].ttype), - build_tree_list ((yyvsp[(3) - (4)].ttype), prefix_attributes)); ;} - break; - - case 567: -#line 2614 "../../../gbagnu/gcc/cp/parse.y" - { split_specs_attrs ((yyvsp[(0) - (4)].ttype), ¤t_declspecs, - &prefix_attributes); - (yyvsp[(0) - (4)].ttype) = current_declspecs; - (yyval.ttype) = grokbitfield ((yyval.ttype), current_declspecs, (yyvsp[(3) - (4)].ttype)); - cplus_decl_attributes ((yyval.ttype), (yyvsp[(4) - (4)].ttype), prefix_attributes); ;} - break; - - case 568: -#line 2620 "../../../gbagnu/gcc/cp/parse.y" - { split_specs_attrs ((yyvsp[(0) - (3)].ttype), ¤t_declspecs, - &prefix_attributes); - (yyvsp[(0) - (3)].ttype) = current_declspecs; - (yyval.ttype) = grokbitfield (NULL_TREE, current_declspecs, (yyvsp[(2) - (3)].ttype)); - cplus_decl_attributes ((yyval.ttype), (yyvsp[(3) - (3)].ttype), prefix_attributes); ;} - break; - - case 569: -#line 2629 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = grokfield ((yyval.ttype), current_declspecs, (yyvsp[(4) - (4)].ttype), (yyvsp[(2) - (4)].ttype), - build_tree_list ((yyvsp[(3) - (4)].ttype), prefix_attributes)); ;} - break; - - case 570: -#line 2632 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = grokbitfield ((yyval.ttype), current_declspecs, (yyvsp[(3) - (4)].ttype)); - cplus_decl_attributes ((yyval.ttype), (yyvsp[(4) - (4)].ttype), prefix_attributes); ;} - break; - - case 571: -#line 2638 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = grokfield ((yyval.ttype), current_declspecs, (yyvsp[(4) - (4)].ttype), (yyvsp[(2) - (4)].ttype), - build_tree_list ((yyvsp[(3) - (4)].ttype), prefix_attributes)); ;} - break; - - case 572: -#line 2641 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = grokbitfield ((yyval.ttype), current_declspecs, (yyvsp[(3) - (4)].ttype)); - cplus_decl_attributes ((yyval.ttype), (yyvsp[(4) - (4)].ttype), prefix_attributes); ;} - break; - - case 573: -#line 2644 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = grokbitfield (NULL_TREE, current_declspecs, (yyvsp[(2) - (3)].ttype)); - cplus_decl_attributes ((yyval.ttype), (yyvsp[(3) - (3)].ttype), prefix_attributes); ;} - break; - - case 575: -#line 2655 "../../../gbagnu/gcc/cp/parse.y" - { TREE_CHAIN ((yyvsp[(3) - (3)].ttype)) = (yyval.ttype); (yyval.ttype) = (yyvsp[(3) - (3)].ttype); ;} - break; - - case 576: -#line 2660 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_enumerator ((yyval.ttype), NULL_TREE, current_enum_type); ;} - break; - - case 577: -#line 2662 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_enumerator ((yyval.ttype), (yyvsp[(3) - (3)].ttype), current_enum_type); ;} - break; - - case 578: -#line 2668 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = build_decl_list ((yyvsp[(1) - (2)].ftype).t, (yyvsp[(2) - (2)].ttype)); - (yyval.ftype).new_type_flag = (yyvsp[(1) - (2)].ftype).new_type_flag; ;} - break; - - case 579: -#line 2671 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = build_decl_list ((yyvsp[(1) - (1)].ftype).t, NULL_TREE); - (yyval.ftype).new_type_flag = (yyvsp[(1) - (1)].ftype).new_type_flag; ;} - break; - - case 580: -#line 2678 "../../../gbagnu/gcc/cp/parse.y" - { - if (pedantic) - pedwarn ("ANSI C++ forbids array dimensions with parenthesized type in new"); - (yyval.ftype).t = build_parse_node (ARRAY_REF, TREE_VALUE ((yyvsp[(3) - (7)].ftype).t), (yyvsp[(6) - (7)].ttype)); - (yyval.ftype).t = build_decl_list (TREE_PURPOSE ((yyvsp[(3) - (7)].ftype).t), (yyval.ftype).t); - (yyval.ftype).new_type_flag = (yyvsp[(3) - (7)].ftype).new_type_flag; - ;} - break; - - case 581: -#line 2689 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = NULL_TREE; ;} - break; - - case 582: -#line 2691 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = decl_tree_cons (NULL_TREE, (yyvsp[(2) - (2)].ttype), (yyval.ttype)); ;} - break; - - case 583: -#line 2696 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = IDENTIFIER_AS_LIST ((yyvsp[(1) - (1)].ttype)); - (yyval.ftype).new_type_flag = 0; ;} - break; - - case 584: -#line 2699 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = decl_tree_cons (NULL_TREE, (yyvsp[(2) - (2)].ttype), (yyvsp[(1) - (2)].ftype).t); - (yyval.ftype).new_type_flag = (yyvsp[(1) - (2)].ftype).new_type_flag; ;} - break; - - case 585: -#line 2708 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.itype) = suspend_momentary (); ;} - break; - - case 586: -#line 2713 "../../../gbagnu/gcc/cp/parse.y" - { resume_momentary ((int) (yyvsp[(1) - (2)].itype)); (yyval.ttype) = (yyvsp[(2) - (2)].ttype); ;} - break; - - case 587: -#line 2719 "../../../gbagnu/gcc/cp/parse.y" - { resume_momentary ((int) (yyvsp[(1) - (4)].itype)); (yyval.ttype) = (yyvsp[(3) - (4)].ttype); ;} - break; - - case 588: -#line 2721 "../../../gbagnu/gcc/cp/parse.y" - { resume_momentary ((int) (yyvsp[(1) - (4)].itype)); (yyval.ttype) = (yyvsp[(3) - (4)].ttype); ;} - break; - - case 589: -#line 2723 "../../../gbagnu/gcc/cp/parse.y" - { resume_momentary ((int) (yyvsp[(1) - (2)].itype)); (yyval.ttype) = empty_parms (); ;} - break; - - case 590: -#line 2725 "../../../gbagnu/gcc/cp/parse.y" - { resume_momentary ((int) (yyvsp[(1) - (4)].itype)); (yyval.ttype) = NULL_TREE; ;} - break; - - case 591: -#line 2732 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_pointer_declarator ((yyvsp[(2) - (3)].ftype).t, (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 592: -#line 2734 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_reference_declarator ((yyvsp[(2) - (3)].ftype).t, (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 593: -#line 2736 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_pointer_declarator (NULL_TREE, (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 594: -#line 2738 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_reference_declarator (NULL_TREE, (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 595: -#line 2740 "../../../gbagnu/gcc/cp/parse.y" - { tree arg = make_pointer_declarator ((yyvsp[(2) - (3)].ttype), (yyvsp[(3) - (3)].ttype)); - (yyval.ttype) = build_parse_node (SCOPE_REF, (yyvsp[(1) - (3)].ttype), arg); - ;} - break; - - case 597: -#line 2748 "../../../gbagnu/gcc/cp/parse.y" - { - if (TREE_CODE ((yyvsp[(1) - (1)].ttype)) == IDENTIFIER_NODE) - { - (yyval.ttype) = lookup_name ((yyvsp[(1) - (1)].ttype), 1); - if (current_class_type - && TYPE_BEING_DEFINED (current_class_type) - && ! IDENTIFIER_CLASS_VALUE ((yyvsp[(1) - (1)].ttype))) - { - /* Remember that this name has been used in the class - definition, as per [class.scope0] */ - pushdecl_class_level ((yyval.ttype)); - } - } - else - (yyval.ttype) = (yyvsp[(1) - (1)].ttype); - ;} - break; - - case 598: -#line 2765 "../../../gbagnu/gcc/cp/parse.y" - { - if (TREE_CODE ((yyvsp[(2) - (2)].ttype)) == IDENTIFIER_NODE) - (yyval.ttype) = IDENTIFIER_GLOBAL_VALUE ((yyvsp[(2) - (2)].ttype)); - else - (yyval.ttype) = (yyvsp[(2) - (2)].ttype); - got_scope = NULL_TREE; - ;} - break; - - case 601: -#line 2778 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(2) - (2)].ttype); ;} - break; - - case 602: -#line 2783 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = get_type_decl ((yyvsp[(2) - (2)].ttype)); ;} - break; - - case 603: -#line 2788 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_call_declarator ((yyval.ttype), (yyvsp[(2) - (4)].ttype), (yyvsp[(3) - (4)].ttype), (yyvsp[(4) - (4)].ttype)); ;} - break; - - case 604: -#line 2790 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_parse_node (ARRAY_REF, (yyval.ttype), (yyvsp[(3) - (4)].ttype)); ;} - break; - - case 605: -#line 2792 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_parse_node (ARRAY_REF, (yyval.ttype), NULL_TREE); ;} - break; - - case 606: -#line 2794 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(2) - (3)].ttype); ;} - break; - - case 607: -#line 2796 "../../../gbagnu/gcc/cp/parse.y" - { push_nested_class ((yyvsp[(1) - (2)].ttype), 3); - (yyval.ttype) = build_parse_node (SCOPE_REF, (yyval.ttype), (yyvsp[(2) - (2)].ttype)); - TREE_COMPLEXITY ((yyval.ttype)) = current_class_depth; ;} - break; - - case 610: -#line 2808 "../../../gbagnu/gcc/cp/parse.y" - { - /* Provide support for '(' attributes '*' declarator ')' - etc */ - (yyval.ttype) = decl_tree_cons ((yyvsp[(1) - (2)].ttype), (yyvsp[(2) - (2)].ttype), NULL_TREE); - ;} - break; - - case 611: -#line 2817 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_pointer_declarator ((yyvsp[(2) - (3)].ftype).t, (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 612: -#line 2819 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_reference_declarator ((yyvsp[(2) - (3)].ftype).t, (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 613: -#line 2821 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_pointer_declarator (NULL_TREE, (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 614: -#line 2823 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_reference_declarator (NULL_TREE, (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 615: -#line 2825 "../../../gbagnu/gcc/cp/parse.y" - { tree arg = make_pointer_declarator ((yyvsp[(2) - (3)].ttype), (yyvsp[(3) - (3)].ttype)); - (yyval.ttype) = build_parse_node (SCOPE_REF, (yyvsp[(1) - (3)].ttype), arg); - ;} - break; - - case 617: -#line 2833 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_pointer_declarator ((yyvsp[(2) - (3)].ftype).t, (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 618: -#line 2835 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_reference_declarator ((yyvsp[(2) - (3)].ftype).t, (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 619: -#line 2837 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_pointer_declarator (NULL_TREE, (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 620: -#line 2839 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_reference_declarator (NULL_TREE, (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 621: -#line 2841 "../../../gbagnu/gcc/cp/parse.y" - { tree arg = make_pointer_declarator ((yyvsp[(2) - (3)].ttype), (yyvsp[(3) - (3)].ttype)); - (yyval.ttype) = build_parse_node (SCOPE_REF, (yyvsp[(1) - (3)].ttype), arg); - ;} - break; - - case 623: -#line 2849 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_call_declarator ((yyval.ttype), (yyvsp[(2) - (4)].ttype), (yyvsp[(3) - (4)].ttype), (yyvsp[(4) - (4)].ttype)); ;} - break; - - case 624: -#line 2851 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(2) - (3)].ttype); ;} - break; - - case 625: -#line 2853 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_parse_node (ARRAY_REF, (yyval.ttype), (yyvsp[(3) - (4)].ttype)); ;} - break; - - case 626: -#line 2855 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_parse_node (ARRAY_REF, (yyval.ttype), NULL_TREE); ;} - break; - - case 627: -#line 2857 "../../../gbagnu/gcc/cp/parse.y" - { enter_scope_of ((yyvsp[(1) - (1)].ttype)); ;} - break; - - case 628: -#line 2859 "../../../gbagnu/gcc/cp/parse.y" - { got_scope = NULL_TREE; - (yyval.ttype) = build_parse_node (SCOPE_REF, (yyvsp[(1) - (2)].ttype), (yyvsp[(2) - (2)].ttype)); - enter_scope_of ((yyval.ttype)); - ;} - break; - - case 629: -#line 2867 "../../../gbagnu/gcc/cp/parse.y" - { got_scope = NULL_TREE; - (yyval.ttype) = build_parse_node (SCOPE_REF, (yyval.ttype), (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 630: -#line 2870 "../../../gbagnu/gcc/cp/parse.y" - { got_scope = NULL_TREE; - (yyval.ttype) = build_parse_node (SCOPE_REF, (yyvsp[(1) - (2)].ttype), (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 631: -#line 2876 "../../../gbagnu/gcc/cp/parse.y" - { got_scope = NULL_TREE; - (yyval.ttype) = build_parse_node (SCOPE_REF, (yyval.ttype), (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 632: -#line 2879 "../../../gbagnu/gcc/cp/parse.y" - { got_scope = NULL_TREE; - (yyval.ttype) = build_parse_node (SCOPE_REF, (yyvsp[(1) - (2)].ttype), (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 634: -#line 2886 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(2) - (2)].ttype); ;} - break; - - case 635: -#line 2891 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_functional_cast ((yyvsp[(1) - (4)].ftype).t, (yyvsp[(3) - (4)].ttype)); ;} - break; - - case 636: -#line 2893 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = reparse_decl_as_expr ((yyvsp[(1) - (4)].ftype).t, (yyvsp[(3) - (4)].ttype)); ;} - break; - - case 637: -#line 2895 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = reparse_absdcl_as_expr ((yyvsp[(1) - (2)].ftype).t, (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 642: -#line 2906 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(2) - (2)].ttype); ;} - break; - - case 643: -#line 2908 "../../../gbagnu/gcc/cp/parse.y" - { got_scope = (yyval.ttype) = make_typename_type ((yyvsp[(1) - (4)].ttype), (yyvsp[(3) - (4)].ttype)); ;} - break; - - case 644: -#line 2915 "../../../gbagnu/gcc/cp/parse.y" - { - if (TREE_CODE ((yyvsp[(1) - (2)].ttype)) == IDENTIFIER_NODE) - { - (yyval.ttype) = lastiddecl; - /* Remember that this name has been used in the class - definition, as per [class.scope0] */ - if (current_class_type - && TYPE_BEING_DEFINED (current_class_type) - && ! IDENTIFIER_CLASS_VALUE ((yyvsp[(1) - (2)].ttype))) - pushdecl_class_level ((yyval.ttype)); - } - got_scope = (yyval.ttype) = TYPE_MAIN_VARIANT (TREE_TYPE ((yyval.ttype))); - ;} - break; - - case 645: -#line 2929 "../../../gbagnu/gcc/cp/parse.y" - { - if (TREE_CODE ((yyvsp[(1) - (2)].ttype)) == IDENTIFIER_NODE) - (yyval.ttype) = lastiddecl; - got_scope = (yyval.ttype) = TREE_TYPE ((yyval.ttype)); - ;} - break; - - case 646: -#line 2935 "../../../gbagnu/gcc/cp/parse.y" - { - if (TREE_CODE ((yyval.ttype)) == IDENTIFIER_NODE) - (yyval.ttype) = lastiddecl; - got_scope = (yyval.ttype); - ;} - break; - - case 647: -#line 2941 "../../../gbagnu/gcc/cp/parse.y" - { got_scope = (yyval.ttype) = complete_type (TREE_TYPE ((yyvsp[(1) - (2)].ttype))); ;} - break; - - case 649: -#line 2957 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(2) - (2)].ttype); ;} - break; - - case 650: -#line 2962 "../../../gbagnu/gcc/cp/parse.y" - { - if (TREE_CODE_CLASS (TREE_CODE ((yyvsp[(1) - (2)].ttype))) == 't') - (yyval.ttype) = make_typename_type ((yyvsp[(1) - (2)].ttype), (yyvsp[(2) - (2)].ttype)); - else if (TREE_CODE ((yyvsp[(2) - (2)].ttype)) == IDENTIFIER_NODE) - cp_error ("`%T' is not a class or namespace", (yyvsp[(2) - (2)].ttype)); - else - { - (yyval.ttype) = (yyvsp[(2) - (2)].ttype); - if (TREE_CODE ((yyval.ttype)) == TYPE_DECL) - (yyval.ttype) = TREE_TYPE ((yyval.ttype)); - } - ;} - break; - - case 651: -#line 2975 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = TREE_TYPE ((yyvsp[(2) - (2)].ttype)); ;} - break; - - case 652: -#line 2977 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_typename_type ((yyvsp[(1) - (2)].ttype), (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 653: -#line 2979 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_typename_type ((yyvsp[(1) - (3)].ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 654: -#line 2984 "../../../gbagnu/gcc/cp/parse.y" - { - if (TREE_CODE ((yyvsp[(1) - (1)].ttype)) == IDENTIFIER_NODE) - cp_error ("`%T' is not a class or namespace", (yyvsp[(1) - (1)].ttype)); - ;} - break; - - case 655: -#line 2989 "../../../gbagnu/gcc/cp/parse.y" - { - if (TREE_CODE_CLASS (TREE_CODE ((yyvsp[(1) - (2)].ttype))) == 't') - (yyval.ttype) = make_typename_type ((yyvsp[(1) - (2)].ttype), (yyvsp[(2) - (2)].ttype)); - else if (TREE_CODE ((yyvsp[(2) - (2)].ttype)) == IDENTIFIER_NODE) - cp_error ("`%T' is not a class or namespace", (yyvsp[(2) - (2)].ttype)); - else - { - (yyval.ttype) = (yyvsp[(2) - (2)].ttype); - if (TREE_CODE ((yyval.ttype)) == TYPE_DECL) - (yyval.ttype) = TREE_TYPE ((yyval.ttype)); - } - ;} - break; - - case 656: -#line 3002 "../../../gbagnu/gcc/cp/parse.y" - { got_scope = (yyval.ttype) = make_typename_type ((yyvsp[(1) - (3)].ttype), (yyvsp[(2) - (3)].ttype)); ;} - break; - - case 657: -#line 3004 "../../../gbagnu/gcc/cp/parse.y" - { got_scope = (yyval.ttype) = make_typename_type ((yyvsp[(1) - (4)].ttype), (yyvsp[(3) - (4)].ttype)); ;} - break; - - case 658: -#line 3009 "../../../gbagnu/gcc/cp/parse.y" - { - if (TREE_CODE ((yyvsp[(1) - (2)].ttype)) != IDENTIFIER_NODE) - (yyvsp[(1) - (2)].ttype) = lastiddecl; - - /* Retrieve the type for the identifier, which might involve - some computation. */ - got_scope = (yyval.ttype) = complete_type (IDENTIFIER_TYPE_VALUE ((yyvsp[(1) - (2)].ttype))); - - if ((yyval.ttype) == error_mark_node) - cp_error ("`%T' is not a class or namespace", (yyvsp[(1) - (2)].ttype)); - ;} - break; - - case 659: -#line 3021 "../../../gbagnu/gcc/cp/parse.y" - { - if (TREE_CODE ((yyvsp[(1) - (2)].ttype)) != IDENTIFIER_NODE) - (yyval.ttype) = lastiddecl; - got_scope = (yyval.ttype) = complete_type (TREE_TYPE ((yyval.ttype))); - ;} - break; - - case 660: -#line 3027 "../../../gbagnu/gcc/cp/parse.y" - { got_scope = (yyval.ttype) = complete_type (TREE_TYPE ((yyval.ttype))); ;} - break; - - case 663: -#line 3031 "../../../gbagnu/gcc/cp/parse.y" - { - if (TREE_CODE ((yyval.ttype)) == IDENTIFIER_NODE) - (yyval.ttype) = lastiddecl; - got_scope = (yyval.ttype); - ;} - break; - - case 664: -#line 3040 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_min_nt (TEMPLATE_ID_EXPR, (yyvsp[(1) - (4)].ttype), (yyvsp[(3) - (4)].ttype)); ;} - break; - - case 665: -#line 3045 "../../../gbagnu/gcc/cp/parse.y" - { - if (TREE_CODE ((yyvsp[(2) - (2)].ttype)) == IDENTIFIER_NODE) - (yyval.ttype) = IDENTIFIER_GLOBAL_VALUE ((yyvsp[(2) - (2)].ttype)); - else - (yyval.ttype) = (yyvsp[(2) - (2)].ttype); - got_scope = NULL_TREE; - ;} - break; - - case 667: -#line 3054 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(2) - (2)].ttype); ;} - break; - - case 668: -#line 3059 "../../../gbagnu/gcc/cp/parse.y" - { got_scope = NULL_TREE; ;} - break; - - case 669: -#line 3061 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(2) - (3)].ttype); got_scope = NULL_TREE; ;} - break; - - case 670: -#line 3068 "../../../gbagnu/gcc/cp/parse.y" - { got_scope = void_type_node; ;} - break; - - case 671: -#line 3074 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_pointer_declarator ((yyvsp[(2) - (3)].ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 672: -#line 3076 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_pointer_declarator ((yyvsp[(2) - (2)].ttype), NULL_TREE); ;} - break; - - case 673: -#line 3078 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_reference_declarator ((yyvsp[(2) - (3)].ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 674: -#line 3080 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_reference_declarator ((yyvsp[(2) - (2)].ttype), NULL_TREE); ;} - break; - - case 675: -#line 3082 "../../../gbagnu/gcc/cp/parse.y" - { tree arg = make_pointer_declarator ((yyvsp[(2) - (2)].ttype), NULL_TREE); - (yyval.ttype) = build_parse_node (SCOPE_REF, (yyvsp[(1) - (2)].ttype), arg); - ;} - break; - - case 676: -#line 3086 "../../../gbagnu/gcc/cp/parse.y" - { tree arg = make_pointer_declarator ((yyvsp[(2) - (3)].ttype), (yyvsp[(3) - (3)].ttype)); - (yyval.ttype) = build_parse_node (SCOPE_REF, (yyvsp[(1) - (3)].ttype), arg); - ;} - break; - - case 678: -#line 3095 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_parse_node (ARRAY_REF, NULL_TREE, (yyvsp[(2) - (3)].ttype)); ;} - break; - - case 679: -#line 3097 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_parse_node (ARRAY_REF, (yyval.ttype), (yyvsp[(3) - (4)].ttype)); ;} - break; - - case 680: -#line 3103 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_pointer_declarator ((yyvsp[(2) - (3)].ftype).t, (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 681: -#line 3105 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_pointer_declarator (NULL_TREE, (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 682: -#line 3107 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_pointer_declarator ((yyvsp[(2) - (2)].ftype).t, NULL_TREE); ;} - break; - - case 683: -#line 3109 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_pointer_declarator (NULL_TREE, NULL_TREE); ;} - break; - - case 684: -#line 3111 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_reference_declarator ((yyvsp[(2) - (3)].ftype).t, (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 685: -#line 3113 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_reference_declarator (NULL_TREE, (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 686: -#line 3115 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_reference_declarator ((yyvsp[(2) - (2)].ftype).t, NULL_TREE); ;} - break; - - case 687: -#line 3117 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_reference_declarator (NULL_TREE, NULL_TREE); ;} - break; - - case 688: -#line 3119 "../../../gbagnu/gcc/cp/parse.y" - { tree arg = make_pointer_declarator ((yyvsp[(2) - (2)].ttype), NULL_TREE); - (yyval.ttype) = build_parse_node (SCOPE_REF, (yyvsp[(1) - (2)].ttype), arg); - ;} - break; - - case 689: -#line 3123 "../../../gbagnu/gcc/cp/parse.y" - { tree arg = make_pointer_declarator ((yyvsp[(2) - (3)].ttype), (yyvsp[(3) - (3)].ttype)); - (yyval.ttype) = build_parse_node (SCOPE_REF, (yyvsp[(1) - (3)].ttype), arg); - ;} - break; - - case 691: -#line 3132 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(2) - (3)].ttype); ;} - break; - - case 693: -#line 3136 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_call_declarator ((yyval.ttype), (yyvsp[(3) - (6)].ttype), (yyvsp[(5) - (6)].ttype), (yyvsp[(6) - (6)].ttype)); ;} - break; - - case 694: -#line 3138 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_call_declarator ((yyval.ttype), empty_parms (), (yyvsp[(3) - (4)].ttype), (yyvsp[(4) - (4)].ttype)); ;} - break; - - case 695: -#line 3140 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_parse_node (ARRAY_REF, (yyval.ttype), (yyvsp[(3) - (4)].ttype)); ;} - break; - - case 696: -#line 3142 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_parse_node (ARRAY_REF, (yyval.ttype), NULL_TREE); ;} - break; - - case 697: -#line 3144 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_call_declarator (NULL_TREE, (yyvsp[(2) - (5)].ttype), (yyvsp[(4) - (5)].ttype), (yyvsp[(5) - (5)].ttype)); ;} - break; - - case 698: -#line 3146 "../../../gbagnu/gcc/cp/parse.y" - { set_quals_and_spec ((yyval.ttype), (yyvsp[(2) - (3)].ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 699: -#line 3148 "../../../gbagnu/gcc/cp/parse.y" - { set_quals_and_spec ((yyval.ttype), (yyvsp[(2) - (3)].ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 700: -#line 3150 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_parse_node (ARRAY_REF, NULL_TREE, (yyvsp[(2) - (3)].ttype)); ;} - break; - - case 701: -#line 3152 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_parse_node (ARRAY_REF, NULL_TREE, NULL_TREE); ;} - break; - - case 708: -#line 3175 "../../../gbagnu/gcc/cp/parse.y" - { if (pedantic) - pedwarn ("ANSI C++ forbids label declarations"); ;} - break; - - case 711: -#line 3186 "../../../gbagnu/gcc/cp/parse.y" - { tree link; - for (link = (yyvsp[(2) - (3)].ttype); link; link = TREE_CHAIN (link)) - { - tree label = shadow_label (TREE_VALUE (link)); - C_DECLARED_LABEL_FLAG (label) = 1; - declare_nonlocal_label (label); - } - ;} - break; - - case 712: -#line 3200 "../../../gbagnu/gcc/cp/parse.y" - {;} - break; - - case 714: -#line 3206 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = begin_compound_stmt (0); ;} - break; - - case 715: -#line 3208 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_compound_stmt (0, (yyvsp[(2) - (3)].ttype)); ;} - break; - - case 716: -#line 3213 "../../../gbagnu/gcc/cp/parse.y" - { - (yyval.ttype) = begin_if_stmt (); - cond_stmt_keyword = "if"; - ;} - break; - - case 717: -#line 3218 "../../../gbagnu/gcc/cp/parse.y" - { finish_if_stmt_cond ((yyvsp[(3) - (3)].ttype), (yyvsp[(2) - (3)].ttype)); ;} - break; - - case 718: -#line 3220 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_then_clause ((yyvsp[(2) - (5)].ttype)); ;} - break; - - case 720: -#line 3225 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = begin_compound_stmt (0); ;} - break; - - case 721: -#line 3227 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_compound_stmt (0, (yyvsp[(1) - (2)].ttype)); ;} - break; - - case 722: -#line 3232 "../../../gbagnu/gcc/cp/parse.y" - {;} - break; - - case 724: -#line 3238 "../../../gbagnu/gcc/cp/parse.y" - { finish_stmt (); ;} - break; - - case 725: -#line 3240 "../../../gbagnu/gcc/cp/parse.y" - { finish_expr_stmt ((yyvsp[(1) - (2)].ttype)); ;} - break; - - case 726: -#line 3242 "../../../gbagnu/gcc/cp/parse.y" - { begin_else_clause (); ;} - break; - - case 727: -#line 3244 "../../../gbagnu/gcc/cp/parse.y" - { - finish_else_clause ((yyvsp[(1) - (4)].ttype)); - finish_if_stmt (); - ;} - break; - - case 728: -#line 3249 "../../../gbagnu/gcc/cp/parse.y" - { finish_if_stmt (); ;} - break; - - case 729: -#line 3251 "../../../gbagnu/gcc/cp/parse.y" - { - (yyval.ttype) = begin_while_stmt (); - cond_stmt_keyword = "while"; - ;} - break; - - case 730: -#line 3256 "../../../gbagnu/gcc/cp/parse.y" - { finish_while_stmt_cond ((yyvsp[(3) - (3)].ttype), (yyvsp[(2) - (3)].ttype)); ;} - break; - - case 731: -#line 3258 "../../../gbagnu/gcc/cp/parse.y" - { finish_while_stmt ((yyvsp[(2) - (5)].ttype)); ;} - break; - - case 732: -#line 3260 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = begin_do_stmt (); ;} - break; - - case 733: -#line 3262 "../../../gbagnu/gcc/cp/parse.y" - { - finish_do_body ((yyvsp[(2) - (4)].ttype)); - cond_stmt_keyword = "do"; - ;} - break; - - case 734: -#line 3267 "../../../gbagnu/gcc/cp/parse.y" - { finish_do_stmt ((yyvsp[(6) - (7)].ttype), (yyvsp[(2) - (7)].ttype)); ;} - break; - - case 735: -#line 3269 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = begin_for_stmt (); ;} - break; - - case 736: -#line 3271 "../../../gbagnu/gcc/cp/parse.y" - { finish_for_init_stmt ((yyvsp[(2) - (4)].ttype)); ;} - break; - - case 737: -#line 3273 "../../../gbagnu/gcc/cp/parse.y" - { finish_for_cond ((yyvsp[(6) - (7)].ttype), (yyvsp[(2) - (7)].ttype)); ;} - break; - - case 738: -#line 3275 "../../../gbagnu/gcc/cp/parse.y" - { finish_for_expr ((yyvsp[(9) - (10)].ttype), (yyvsp[(2) - (10)].ttype)); ;} - break; - - case 739: -#line 3277 "../../../gbagnu/gcc/cp/parse.y" - { finish_for_stmt ((yyvsp[(9) - (12)].ttype), (yyvsp[(2) - (12)].ttype)); ;} - break; - - case 740: -#line 3279 "../../../gbagnu/gcc/cp/parse.y" - { begin_switch_stmt (); ;} - break; - - case 741: -#line 3281 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_switch_cond ((yyvsp[(4) - (5)].ttype)); ;} - break; - - case 742: -#line 3283 "../../../gbagnu/gcc/cp/parse.y" - { finish_switch_stmt ((yyvsp[(4) - (7)].ttype), (yyvsp[(6) - (7)].ttype)); ;} - break; - - case 743: -#line 3285 "../../../gbagnu/gcc/cp/parse.y" - { finish_case_label ((yyvsp[(2) - (3)].ttype), NULL_TREE); ;} - break; - - case 745: -#line 3288 "../../../gbagnu/gcc/cp/parse.y" - { finish_case_label ((yyvsp[(2) - (5)].ttype), (yyvsp[(4) - (5)].ttype)); ;} - break; - - case 747: -#line 3291 "../../../gbagnu/gcc/cp/parse.y" - { finish_case_label (NULL_TREE, NULL_TREE); ;} - break; - - case 749: -#line 3294 "../../../gbagnu/gcc/cp/parse.y" - { finish_break_stmt (); ;} - break; - - case 750: -#line 3296 "../../../gbagnu/gcc/cp/parse.y" - { finish_continue_stmt (); ;} - break; - - case 751: -#line 3298 "../../../gbagnu/gcc/cp/parse.y" - { finish_return_stmt (NULL_TREE); ;} - break; - - case 752: -#line 3300 "../../../gbagnu/gcc/cp/parse.y" - { finish_return_stmt ((yyvsp[(2) - (3)].ttype)); ;} - break; - - case 753: -#line 3302 "../../../gbagnu/gcc/cp/parse.y" - { - finish_asm_stmt ((yyvsp[(2) - (6)].ttype), (yyvsp[(4) - (6)].ttype), NULL_TREE, NULL_TREE, - NULL_TREE); - ;} - break; - - case 754: -#line 3308 "../../../gbagnu/gcc/cp/parse.y" - { - finish_asm_stmt ((yyvsp[(2) - (8)].ttype), (yyvsp[(4) - (8)].ttype), (yyvsp[(6) - (8)].ttype), NULL_TREE, - NULL_TREE); - ;} - break; - - case 755: -#line 3314 "../../../gbagnu/gcc/cp/parse.y" - { finish_asm_stmt ((yyvsp[(2) - (10)].ttype), (yyvsp[(4) - (10)].ttype), (yyvsp[(6) - (10)].ttype), (yyvsp[(8) - (10)].ttype), NULL_TREE); ;} - break; - - case 756: -#line 3318 "../../../gbagnu/gcc/cp/parse.y" - { finish_asm_stmt ((yyvsp[(2) - (12)].ttype), (yyvsp[(4) - (12)].ttype), (yyvsp[(6) - (12)].ttype), (yyvsp[(8) - (12)].ttype), (yyvsp[(10) - (12)].ttype)); ;} - break; - - case 757: -#line 3320 "../../../gbagnu/gcc/cp/parse.y" - { - if (pedantic) - pedwarn ("ANSI C++ forbids computed gotos"); - finish_goto_stmt ((yyvsp[(3) - (4)].ttype)); - ;} - break; - - case 758: -#line 3326 "../../../gbagnu/gcc/cp/parse.y" - { finish_goto_stmt ((yyvsp[(2) - (3)].ttype)); ;} - break; - - case 759: -#line 3328 "../../../gbagnu/gcc/cp/parse.y" - { finish_stmt (); ;} - break; - - case 760: -#line 3330 "../../../gbagnu/gcc/cp/parse.y" - { error ("label must be followed by statement"); - yyungetc ('}', 0); - finish_stmt (); ;} - break; - - case 761: -#line 3334 "../../../gbagnu/gcc/cp/parse.y" - { finish_stmt (); ;} - break; - - case 764: -#line 3338 "../../../gbagnu/gcc/cp/parse.y" - { do_local_using_decl ((yyvsp[(1) - (1)].ttype)); ;} - break; - - case 766: -#line 3344 "../../../gbagnu/gcc/cp/parse.y" - { - if (! current_function_parms_stored) - store_parm_decls (); - expand_start_early_try_stmts (); - ;} - break; - - case 767: -#line 3350 "../../../gbagnu/gcc/cp/parse.y" - { - expand_start_all_catch (); - ;} - break; - - case 768: -#line 3354 "../../../gbagnu/gcc/cp/parse.y" - { - expand_end_all_catch (); - (yyval.itype) = (yyvsp[(3) - (6)].itype); - ;} - break; - - case 769: -#line 3362 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = begin_try_block (); ;} - break; - - case 770: -#line 3364 "../../../gbagnu/gcc/cp/parse.y" - { finish_try_block ((yyvsp[(2) - (3)].ttype)); ;} - break; - - case 771: -#line 3366 "../../../gbagnu/gcc/cp/parse.y" - { finish_handler_sequence ((yyvsp[(2) - (5)].ttype)); ;} - break; - - case 774: -#line 3376 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = begin_handler(); ;} - break; - - case 775: -#line 3378 "../../../gbagnu/gcc/cp/parse.y" - { finish_handler_parms ((yyvsp[(2) - (3)].ttype)); ;} - break; - - case 776: -#line 3380 "../../../gbagnu/gcc/cp/parse.y" - { finish_handler ((yyvsp[(2) - (5)].ttype)); ;} - break; - - case 779: -#line 3390 "../../../gbagnu/gcc/cp/parse.y" - { expand_start_catch_block (NULL_TREE, NULL_TREE); ;} - break; - - case 780: -#line 3406 "../../../gbagnu/gcc/cp/parse.y" - { check_for_new_type ("inside exception declarations", (yyvsp[(2) - (3)].ftype)); - expand_start_catch_block (TREE_PURPOSE ((yyvsp[(2) - (3)].ftype).t), - TREE_VALUE ((yyvsp[(2) - (3)].ftype).t)); ;} - break; - - case 781: -#line 3413 "../../../gbagnu/gcc/cp/parse.y" - { tree label; - do_label: - label = define_label (input_filename, lineno, (yyvsp[(1) - (2)].ttype)); - if (label && ! minimal_parse_mode) - expand_label (label); - ;} - break; - - case 782: -#line 3420 "../../../gbagnu/gcc/cp/parse.y" - { goto do_label; ;} - break; - - case 783: -#line 3422 "../../../gbagnu/gcc/cp/parse.y" - { goto do_label; ;} - break; - - case 784: -#line 3424 "../../../gbagnu/gcc/cp/parse.y" - { goto do_label; ;} - break; - - case 785: -#line 3429 "../../../gbagnu/gcc/cp/parse.y" - { if ((yyvsp[(1) - (2)].ttype)) cplus_expand_expr_stmt ((yyvsp[(1) - (2)].ttype)); ;} - break; - - case 787: -#line 3432 "../../../gbagnu/gcc/cp/parse.y" - { if (pedantic) - pedwarn ("ANSI C++ forbids compound statements inside for initializations"); - ;} - break; - - case 788: -#line 3441 "../../../gbagnu/gcc/cp/parse.y" - { emit_line_note (input_filename, lineno); - (yyval.ttype) = NULL_TREE; ;} - break; - - case 789: -#line 3444 "../../../gbagnu/gcc/cp/parse.y" - { emit_line_note (input_filename, lineno); ;} - break; - - case 790: -#line 3449 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = NULL_TREE; ;} - break; - - case 792: -#line 3452 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = NULL_TREE; ;} - break; - - case 793: -#line 3459 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = NULL_TREE; ;} - break; - - case 796: -#line 3466 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = chainon ((yyval.ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 797: -#line 3471 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_tree_list ((yyval.ttype), (yyvsp[(3) - (4)].ttype)); ;} - break; - - case 798: -#line 3476 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = tree_cons (NULL_TREE, (yyval.ttype), NULL_TREE); ;} - break; - - case 799: -#line 3478 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = tree_cons (NULL_TREE, (yyvsp[(3) - (3)].ttype), (yyval.ttype)); ;} - break; - - case 800: -#line 3489 "../../../gbagnu/gcc/cp/parse.y" - { - (yyval.ttype) = empty_parms(); - ;} - break; - - case 802: -#line 3494 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_parmlist (build_tree_list (NULL_TREE, (yyvsp[(1) - (1)].ftype).t), 0); - check_for_new_type ("inside parameter list", (yyvsp[(1) - (1)].ftype)); ;} - break; - - case 803: -#line 3502 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_parmlist ((yyval.ttype), 0); ;} - break; - - case 804: -#line 3504 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_parmlist ((yyvsp[(1) - (2)].ttype), 1); ;} - break; - - case 805: -#line 3507 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_parmlist ((yyvsp[(1) - (2)].ttype), 1); ;} - break; - - case 806: -#line 3509 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_parmlist (build_tree_list (NULL_TREE, - (yyvsp[(1) - (2)].ftype).t), 1); ;} - break; - - case 807: -#line 3512 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = finish_parmlist (NULL_TREE, 1); ;} - break; - - case 808: -#line 3514 "../../../gbagnu/gcc/cp/parse.y" - { - /* This helps us recover from really nasty - parse errors, for example, a missing right - parenthesis. */ - yyerror ("possibly missing ')'"); - (yyval.ttype) = finish_parmlist ((yyvsp[(1) - (2)].ttype), 0); - yyungetc (':', 0); - yychar = ')'; - ;} - break; - - case 809: -#line 3524 "../../../gbagnu/gcc/cp/parse.y" - { - /* This helps us recover from really nasty - parse errors, for example, a missing right - parenthesis. */ - yyerror ("possibly missing ')'"); - (yyval.ttype) = finish_parmlist (build_tree_list (NULL_TREE, - (yyvsp[(1) - (2)].ftype).t), 0); - yyungetc (':', 0); - yychar = ')'; - ;} - break; - - case 810: -#line 3539 "../../../gbagnu/gcc/cp/parse.y" - { maybe_snarf_defarg (); ;} - break; - - case 811: -#line 3541 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(3) - (3)].ttype); ;} - break; - - case 814: -#line 3552 "../../../gbagnu/gcc/cp/parse.y" - { check_for_new_type ("in a parameter list", (yyvsp[(1) - (1)].ftype)); - (yyval.ttype) = build_tree_list (NULL_TREE, (yyvsp[(1) - (1)].ftype).t); ;} - break; - - case 815: -#line 3555 "../../../gbagnu/gcc/cp/parse.y" - { check_for_new_type ("in a parameter list", (yyvsp[(1) - (2)].ftype)); - (yyval.ttype) = build_tree_list ((yyvsp[(2) - (2)].ttype), (yyvsp[(1) - (2)].ftype).t); ;} - break; - - case 816: -#line 3558 "../../../gbagnu/gcc/cp/parse.y" - { check_for_new_type ("in a parameter list", (yyvsp[(2) - (2)].ftype)); - (yyval.ttype) = chainon ((yyval.ttype), (yyvsp[(2) - (2)].ftype).t); ;} - break; - - case 817: -#line 3561 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = chainon ((yyval.ttype), build_tree_list (NULL_TREE, (yyvsp[(2) - (2)].ttype))); ;} - break; - - case 818: -#line 3563 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = chainon ((yyval.ttype), build_tree_list ((yyvsp[(4) - (4)].ttype), (yyvsp[(2) - (4)].ttype))); ;} - break; - - case 820: -#line 3569 "../../../gbagnu/gcc/cp/parse.y" - { check_for_new_type ("in a parameter list", (yyvsp[(1) - (2)].ftype)); - (yyval.ttype) = build_tree_list (NULL_TREE, (yyvsp[(1) - (2)].ftype).t); ;} - break; - - case 821: -#line 3579 "../../../gbagnu/gcc/cp/parse.y" - { tree specs = strip_attrs ((yyvsp[(1) - (2)].ftype).t); - (yyval.ftype).new_type_flag = (yyvsp[(1) - (2)].ftype).new_type_flag; - (yyval.ftype).t = build_tree_list (specs, (yyvsp[(2) - (2)].ttype)); ;} - break; - - case 822: -#line 3583 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = build_tree_list ((yyvsp[(1) - (2)].ftype).t, (yyvsp[(2) - (2)].ttype)); - (yyval.ftype).new_type_flag = (yyvsp[(1) - (2)].ftype).new_type_flag; ;} - break; - - case 823: -#line 3586 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = build_tree_list (get_decl_list ((yyvsp[(1) - (2)].ftype).t), (yyvsp[(2) - (2)].ttype)); - (yyval.ftype).new_type_flag = (yyvsp[(1) - (2)].ftype).new_type_flag; ;} - break; - - case 824: -#line 3589 "../../../gbagnu/gcc/cp/parse.y" - { tree specs = strip_attrs ((yyvsp[(1) - (2)].ftype).t); - (yyval.ftype).t = build_tree_list (specs, (yyvsp[(2) - (2)].ttype)); - (yyval.ftype).new_type_flag = (yyvsp[(1) - (2)].ftype).new_type_flag; ;} - break; - - case 825: -#line 3593 "../../../gbagnu/gcc/cp/parse.y" - { tree specs = strip_attrs ((yyvsp[(1) - (1)].ftype).t); - (yyval.ftype).t = build_tree_list (specs, NULL_TREE); - (yyval.ftype).new_type_flag = (yyvsp[(1) - (1)].ftype).new_type_flag; ;} - break; - - case 826: -#line 3597 "../../../gbagnu/gcc/cp/parse.y" - { tree specs = strip_attrs ((yyvsp[(1) - (2)].ttype)); - (yyval.ftype).t = build_tree_list (specs, (yyvsp[(2) - (2)].ttype)); - (yyval.ftype).new_type_flag = 0; ;} - break; - - case 827: -#line 3604 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = build_tree_list (NULL_TREE, (yyvsp[(1) - (1)].ftype).t); - (yyval.ftype).new_type_flag = (yyvsp[(1) - (1)].ftype).new_type_flag; ;} - break; - - case 828: -#line 3607 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ftype).t = build_tree_list ((yyvsp[(2) - (2)].ttype), (yyvsp[(1) - (2)].ftype).t); - (yyval.ftype).new_type_flag = (yyvsp[(1) - (2)].ftype).new_type_flag; ;} - break; - - case 831: -#line 3618 "../../../gbagnu/gcc/cp/parse.y" - { see_typename (); ;} - break; - - case 832: -#line 3623 "../../../gbagnu/gcc/cp/parse.y" - { - error ("type specifier omitted for parameter"); - (yyval.ttype) = build_tree_list (integer_type_node, NULL_TREE); - ;} - break; - - case 833: -#line 3628 "../../../gbagnu/gcc/cp/parse.y" - { - error ("type specifier omitted for parameter"); - if (TREE_CODE ((yyval.ttype)) == SCOPE_REF - && (TREE_CODE (TREE_OPERAND ((yyval.ttype), 0)) == TEMPLATE_TYPE_PARM - || TREE_CODE (TREE_OPERAND ((yyval.ttype), 0)) == TEMPLATE_TEMPLATE_PARM)) - cp_error (" perhaps you want `typename %E' to make it a type", (yyval.ttype)); - (yyval.ttype) = build_tree_list (integer_type_node, (yyval.ttype)); - ;} - break; - - case 834: -#line 3640 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = NULL_TREE; ;} - break; - - case 835: -#line 3642 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = (yyvsp[(3) - (4)].ttype); ;} - break; - - case 836: -#line 3644 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_decl_list (NULL_TREE, NULL_TREE); ;} - break; - - case 837: -#line 3649 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = build_decl_list (NULL_TREE, groktypename((yyvsp[(1) - (1)].ftype).t)); ;} - break; - - case 839: -#line 3655 "../../../gbagnu/gcc/cp/parse.y" - { - TREE_CHAIN ((yyvsp[(3) - (3)].ttype)) = (yyval.ttype); - (yyval.ttype) = (yyvsp[(3) - (3)].ttype); - ;} - break; - - case 840: -#line 3663 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = NULL_TREE; ;} - break; - - case 841: -#line 3665 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_pointer_declarator ((yyvsp[(2) - (3)].ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 842: -#line 3667 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = make_reference_declarator ((yyvsp[(2) - (3)].ttype), (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 843: -#line 3669 "../../../gbagnu/gcc/cp/parse.y" - { tree arg = make_pointer_declarator ((yyvsp[(2) - (3)].ttype), (yyvsp[(3) - (3)].ttype)); - (yyval.ttype) = build_parse_node (SCOPE_REF, (yyvsp[(1) - (3)].ttype), arg); - ;} - break; - - case 844: -#line 3676 "../../../gbagnu/gcc/cp/parse.y" - { got_scope = NULL_TREE; ;} - break; - - case 845: -#line 3681 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[MULT_EXPR]; ;} - break; - - case 846: -#line 3683 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[TRUNC_DIV_EXPR]; ;} - break; - - case 847: -#line 3685 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[TRUNC_MOD_EXPR]; ;} - break; - - case 848: -#line 3687 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[PLUS_EXPR]; ;} - break; - - case 849: -#line 3689 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[MINUS_EXPR]; ;} - break; - - case 850: -#line 3691 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[BIT_AND_EXPR]; ;} - break; - - case 851: -#line 3693 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[BIT_IOR_EXPR]; ;} - break; - - case 852: -#line 3695 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[BIT_XOR_EXPR]; ;} - break; - - case 853: -#line 3697 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[BIT_NOT_EXPR]; ;} - break; - - case 854: -#line 3699 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[COMPOUND_EXPR]; ;} - break; - - case 855: -#line 3701 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[(yyvsp[(2) - (2)].code)]; ;} - break; - - case 856: -#line 3703 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[LT_EXPR]; ;} - break; - - case 857: -#line 3705 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[GT_EXPR]; ;} - break; - - case 858: -#line 3707 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[(yyvsp[(2) - (2)].code)]; ;} - break; - - case 859: -#line 3709 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_assopname[(yyvsp[(2) - (2)].code)]; ;} - break; - - case 860: -#line 3711 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname [MODIFY_EXPR]; ;} - break; - - case 861: -#line 3713 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[(yyvsp[(2) - (2)].code)]; ;} - break; - - case 862: -#line 3715 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[(yyvsp[(2) - (2)].code)]; ;} - break; - - case 863: -#line 3717 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[POSTINCREMENT_EXPR]; ;} - break; - - case 864: -#line 3719 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[PREDECREMENT_EXPR]; ;} - break; - - case 865: -#line 3721 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[TRUTH_ANDIF_EXPR]; ;} - break; - - case 866: -#line 3723 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[TRUTH_ORIF_EXPR]; ;} - break; - - case 867: -#line 3725 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[TRUTH_NOT_EXPR]; ;} - break; - - case 868: -#line 3727 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[COND_EXPR]; ;} - break; - - case 869: -#line 3729 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[(yyvsp[(2) - (2)].code)]; ;} - break; - - case 870: -#line 3731 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[COMPONENT_REF]; ;} - break; - - case 871: -#line 3733 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[MEMBER_REF]; ;} - break; - - case 872: -#line 3735 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[CALL_EXPR]; ;} - break; - - case 873: -#line 3737 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[ARRAY_REF]; ;} - break; - - case 874: -#line 3739 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[NEW_EXPR]; ;} - break; - - case 875: -#line 3741 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[DELETE_EXPR]; ;} - break; - - case 876: -#line 3743 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[VEC_NEW_EXPR]; ;} - break; - - case 877: -#line 3745 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[VEC_DELETE_EXPR]; ;} - break; - - case 878: -#line 3748 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = grokoptypename ((yyvsp[(2) - (3)].ftype).t, (yyvsp[(3) - (3)].ttype)); ;} - break; - - case 879: -#line 3750 "../../../gbagnu/gcc/cp/parse.y" - { (yyval.ttype) = ansi_opname[ERROR_MARK]; ;} - break; - - -/* Line 1267 of yacc.c. */ -#line 9589 "parse.c" - default: break; - } - YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); - - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - - *++yyvsp = yyval; - - - /* Now `shift' the result of the reduction. Determine what state - that goes to, based on the state we popped back to and the rule - number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; - if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTOKENS]; - - goto yynewstate; - - -/*------------------------------------. -| yyerrlab -- here on detecting error | -`------------------------------------*/ -yyerrlab: - /* If not already recovering from an error, report this error. */ - if (!yyerrstatus) - { - ++yynerrs; -#if ! YYERROR_VERBOSE - yyerror (YY_("syntax error")); -#else - { - YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); - if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) - { - YYSIZE_T yyalloc = 2 * yysize; - if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) - yyalloc = YYSTACK_ALLOC_MAXIMUM; - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); - yymsg = (char *) YYSTACK_ALLOC (yyalloc); - if (yymsg) - yymsg_alloc = yyalloc; - else - { - yymsg = yymsgbuf; - yymsg_alloc = sizeof yymsgbuf; - } - } - - if (0 < yysize && yysize <= yymsg_alloc) - { - (void) yysyntax_error (yymsg, yystate, yychar); - yyerror (yymsg); - } - else - { - yyerror (YY_("syntax error")); - if (yysize != 0) - goto yyexhaustedlab; - } - } -#endif - } - - - - if (yyerrstatus == 3) - { - /* If just tried and failed to reuse look-ahead token after an - error, discard it. */ - - if (yychar <= YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == YYEOF) - YYABORT; - } - else - { - yydestruct ("Error: discarding", - yytoken, &yylval); - yychar = YYEMPTY; - } - } - - /* Else will try to reuse look-ahead token after shifting the error - token. */ - goto yyerrlab1; - - -/*---------------------------------------------------. -| yyerrorlab -- error raised explicitly by YYERROR. | -`---------------------------------------------------*/ -yyerrorlab: - - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ - if (/*CONSTCOND*/ 0) - goto yyerrorlab; - - /* Do not reclaim the symbols of the rule which action triggered - this YYERROR. */ - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - yystate = *yyssp; - goto yyerrlab1; - - -/*-------------------------------------------------------------. -| yyerrlab1 -- common code for both syntax error and YYERROR. | -`-------------------------------------------------------------*/ -yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ - - for (;;) - { - yyn = yypact[yystate]; - if (yyn != YYPACT_NINF) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } - - /* Pop the current state because it cannot handle the error token. */ - if (yyssp == yyss) - YYABORT; - - - yydestruct ("Error: popping", - yystos[yystate], yyvsp); - YYPOPSTACK (1); - yystate = *yyssp; - YY_STACK_PRINT (yyss, yyssp); - } - - if (yyn == YYFINAL) - YYACCEPT; - - *++yyvsp = yylval; - - - /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); - - yystate = yyn; - goto yynewstate; - - -/*-------------------------------------. -| yyacceptlab -- YYACCEPT comes here. | -`-------------------------------------*/ -yyacceptlab: - yyresult = 0; - goto yyreturn; - -/*-----------------------------------. -| yyabortlab -- YYABORT comes here. | -`-----------------------------------*/ -yyabortlab: - yyresult = 1; - goto yyreturn; - -#ifndef yyoverflow -/*-------------------------------------------------. -| yyexhaustedlab -- memory exhaustion comes here. | -`-------------------------------------------------*/ -yyexhaustedlab: - yyerror (YY_("memory exhausted")); - yyresult = 2; - /* Fall through. */ -#endif - -yyreturn: - if (yychar != YYEOF && yychar != YYEMPTY) - yydestruct ("Cleanup: discarding lookahead", - yytoken, &yylval); - /* Do not reclaim the symbols of the rule which action triggered - this YYABORT or YYACCEPT. */ - YYPOPSTACK (yylen); - YY_STACK_PRINT (yyss, yyssp); - while (yyssp != yyss) - { - yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp); - YYPOPSTACK (1); - } -#ifndef yyoverflow - if (yyss != yyssa) - YYSTACK_FREE (yyss); -#endif -#if YYERROR_VERBOSE - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); -#endif - /* Make sure YYID is used. */ - return YYID (yyresult); -} - - -#line 3753 "../../../gbagnu/gcc/cp/parse.y" - - -#ifdef SPEW_DEBUG -const char * -debug_yytranslate (value) - int value; -{ - return yytname[YYTRANSLATE (value)]; -} - -#endif - diff --git a/gcc/cp/parse.h b/gcc/cp/parse.h deleted file mode 100644 index c9ade82..0000000 --- a/gcc/cp/parse.h +++ /dev/null @@ -1,140 +0,0 @@ -/* A Bison parser, made by GNU Bison 2.3. */ - -/* Skeleton interface for Bison's Yacc-like parsers in C - - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. - - This program 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. - - This program 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 this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -/* Tokens. */ -#define IDENTIFIER 258 -#define TYPENAME 259 -#define SELFNAME 260 -#define PFUNCNAME 261 -#define SCSPEC 262 -#define TYPESPEC 263 -#define CV_QUALIFIER 264 -#define CONSTANT 265 -#define STRING 266 -#define ELLIPSIS 267 -#define SIZEOF 268 -#define ENUM 269 -#define IF 270 -#define ELSE 271 -#define WHILE 272 -#define DO 273 -#define FOR 274 -#define SWITCH 275 -#define CASE 276 -#define DEFAULT 277 -#define BREAK 278 -#define CONTINUE 279 -#define RETURN 280 -#define GOTO 281 -#define ASM_KEYWORD 282 -#define TYPEOF 283 -#define ALIGNOF 284 -#define SIGOF 285 -#define ATTRIBUTE 286 -#define EXTENSION 287 -#define LABEL 288 -#define REALPART 289 -#define IMAGPART 290 -#define AGGR 291 -#define VISSPEC 292 -#define DELETE 293 -#define NEW 294 -#define THIS 295 -#define OPERATOR 296 -#define CXX_TRUE 297 -#define CXX_FALSE 298 -#define NAMESPACE 299 -#define TYPENAME_KEYWORD 300 -#define USING 301 -#define LEFT_RIGHT 302 -#define TEMPLATE 303 -#define TYPEID 304 -#define DYNAMIC_CAST 305 -#define STATIC_CAST 306 -#define REINTERPRET_CAST 307 -#define CONST_CAST 308 -#define SCOPE 309 -#define EMPTY 310 -#define NSNAME 311 -#define PTYPENAME 312 -#define THROW 313 -#define ASSIGN 314 -#define OROR 315 -#define ANDAND 316 -#define MIN_MAX 317 -#define EQCOMPARE 318 -#define ARITHCOMPARE 319 -#define RSHIFT 320 -#define LSHIFT 321 -#define DOT_STAR 322 -#define POINTSAT_STAR 323 -#define MINUSMINUS 324 -#define PLUSPLUS 325 -#define UNARY 326 -#define HYPERUNARY 327 -#define PAREN_STAR_PAREN 328 -#define POINTSAT 329 -#define CATCH 330 -#define TRY 331 -#define PRE_PARSED_FUNCTION_DECL 332 -#define EXTERN_LANG_STRING 333 -#define ALL 334 -#define PRE_PARSED_CLASS_DECL 335 -#define DEFARG 336 -#define DEFARG_MARKER 337 -#define TYPENAME_DEFN 338 -#define IDENTIFIER_DEFN 339 -#define PTYPENAME_DEFN 340 -#define END_OF_LINE 341 -#define END_OF_SAVED_INPUT 342 - - - - -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE -#line 92 "../../../gbagnu/gcc/cp/parse.y" -{long itype; tree ttype; char *strtype; enum tree_code code; flagged_type_tree ftype; } -/* Line 1489 of yacc.c. */ -#line 225 "parse.h" - YYSTYPE; -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -# define YYSTYPE_IS_TRIVIAL 1 -#endif - -extern YYSTYPE yylval; - -#define YYEMPTY (-2) diff --git a/gcc/cp/parse.y b/gcc/cp/parse.y deleted file mode 100755 index 4970515..0000000 --- a/gcc/cp/parse.y +++ /dev/null @@ -1,3763 +0,0 @@ -/* YACC parser for C++ syntax. - Copyright (C) 1988, 89, 93-97, 1998 Free Software Foundation, Inc. - Hacked by Michael Tiemann (tiemann@cygnus.com) - -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 -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - - -/* This grammar is based on the GNU CC grammar. */ - -/* Note: Bison automatically applies a default action of "$$ = $1" for - all derivations; this is applied before the explicit action, if one - is given. Keep this in mind when reading the actions. */ - -%{ -/* Cause the `yydebug' variable to be defined. */ -#define YYDEBUG 1 - -#include "config.h" - -#include "system.h" - -#include "tree.h" -#include "input.h" -#include "flags.h" -#include "lex.h" -#include "cp-tree.h" -#include "output.h" -#include "except.h" -#include "toplev.h" - -/* Since parsers are distinct for each language, put the language string - definition here. (fnf) */ -char *language_string = "GNU C++"; - -extern tree void_list_node; -extern struct obstack permanent_obstack; - -extern int end_of_file; - -/* Like YYERROR but do call yyerror. */ -#define YYERROR1 { yyerror ("syntax error"); YYERROR; } - -#define OP0(NODE) (TREE_OPERAND (NODE, 0)) -#define OP1(NODE) (TREE_OPERAND (NODE, 1)) - -/* Contains the statement keyword (if/while/do) to include in an - error message if the user supplies an empty conditional expression. */ -static char *cond_stmt_keyword; - -static tree empty_parms PROTO((void)); - -/* Nonzero if we have an `extern "C"' acting as an extern specifier. */ -int have_extern_spec; -int used_extern_spec; - -/* Cons up an empty parameter list. */ -#ifdef __GNUC__ -__inline -#endif -static tree -empty_parms () -{ - tree parms; - - if (strict_prototype - || current_class_type != NULL) - parms = void_list_node; - else - parms = NULL_TREE; - return parms; -} - -%} - -%start program - -%union {long itype; tree ttype; char *strtype; enum tree_code code; flagged_type_tree ftype; } - -/* All identifiers that are not reserved words - and are not declared typedefs in the current block */ -%token IDENTIFIER - -/* All identifiers that are declared typedefs in the current block. - In some contexts, they are treated just like IDENTIFIER, - but they can also serve as typespecs in declarations. */ -%token TYPENAME -%token SELFNAME - -/* A template function. */ -%token PFUNCNAME - -/* Reserved words that specify storage class. - yylval contains an IDENTIFIER_NODE which indicates which one. */ -%token SCSPEC - -/* Reserved words that specify type. - yylval contains an IDENTIFIER_NODE which indicates which one. */ -%token TYPESPEC - -/* Reserved words that qualify type: "const" or "volatile". - yylval contains an IDENTIFIER_NODE which indicates which one. */ -%token CV_QUALIFIER - -/* Character or numeric constants. - yylval is the node for the constant. */ -%token CONSTANT - -/* String constants in raw form. - yylval is a STRING_CST node. */ -%token STRING - -/* "...", used for functions with variable arglists. */ -%token ELLIPSIS - -/* the reserved words */ -/* SCO include files test "ASM", so use something else. */ -%token SIZEOF ENUM /* STRUCT UNION */ IF ELSE WHILE DO FOR SWITCH CASE DEFAULT -%token BREAK CONTINUE RETURN GOTO ASM_KEYWORD TYPEOF ALIGNOF -%token SIGOF -%token ATTRIBUTE EXTENSION LABEL -%token REALPART IMAGPART - -/* the reserved words... C++ extensions */ -%token AGGR -%token VISSPEC -%token DELETE NEW THIS OPERATOR CXX_TRUE CXX_FALSE -%token NAMESPACE TYPENAME_KEYWORD USING -%token LEFT_RIGHT TEMPLATE -%token TYPEID DYNAMIC_CAST STATIC_CAST REINTERPRET_CAST CONST_CAST -%token SCOPE - -/* Define the operator tokens and their precedences. - The value is an integer because, if used, it is the tree code - to use in the expression made from the operator. */ - -%left EMPTY /* used to resolve s/r with epsilon */ - -%left error - -/* Add precedence rules to solve dangling else s/r conflict */ -%nonassoc IF -%nonassoc ELSE - -%left IDENTIFIER PFUNCNAME TYPENAME SELFNAME PTYPENAME SCSPEC TYPESPEC CV_QUALIFIER ENUM AGGR ELLIPSIS TYPEOF SIGOF OPERATOR NSNAME TYPENAME_KEYWORD - -%left '{' ',' ';' - -%nonassoc THROW -%right ':' -%right ASSIGN '=' -%right '?' -%left OROR -%left ANDAND -%left '|' -%left '^' -%left '&' -%left MIN_MAX -%left EQCOMPARE -%left ARITHCOMPARE '<' '>' -%left LSHIFT RSHIFT -%left '+' '-' -%left '*' '/' '%' -%left POINTSAT_STAR DOT_STAR -%right UNARY PLUSPLUS MINUSMINUS '~' -%left HYPERUNARY -%left PAREN_STAR_PAREN LEFT_RIGHT -%left POINTSAT '.' '(' '[' - -%right SCOPE /* C++ extension */ -%nonassoc NEW DELETE TRY CATCH - -%type unop - -%type identifier IDENTIFIER TYPENAME CONSTANT expr nonnull_exprlist -%type PFUNCNAME maybe_identifier -%type paren_expr_or_null nontrivial_exprlist SELFNAME -%type expr_no_commas cast_expr unary_expr primary string STRING -%type reserved_declspecs boolean.literal -%type reserved_typespecquals -%type declmods -%type SCSPEC TYPESPEC CV_QUALIFIER maybe_cv_qualifier -%type initdecls notype_initdecls initdcl /* C++ modification */ -%type init initlist maybeasm maybe_init defarg defarg1 -%type asm_operands nonnull_asm_operands asm_operand asm_clobbers -%type maybe_attribute attributes attribute attribute_list attrib -%type any_word - -%type compstmt implicitly_scoped_stmt - -%type declarator notype_declarator after_type_declarator -%type notype_declarator_intern -%type direct_notype_declarator direct_after_type_declarator -%type components notype_components -%type component_decl component_decl_1 -%type component_declarator component_declarator0 -%type notype_component_declarator notype_component_declarator0 -%type after_type_component_declarator after_type_component_declarator0 -%type enumlist enumerator -%type absdcl cv_qualifiers -%type direct_abstract_declarator conversion_declarator -%type new_declarator direct_new_declarator -%type xexpr parmlist parms bad_parm -%type identifiers_or_typenames -%type fcast_or_absdcl regcast_or_absdcl -%type expr_or_declarator expr_or_declarator_intern -%type complex_notype_declarator -%type notype_unqualified_id unqualified_id qualified_id -%type template_id do_id object_template_id notype_template_declarator -%type overqualified_id notype_qualified_id any_id -%type complex_direct_notype_declarator functional_cast -%type complex_parmlist parms_comma -%type namespace_qualifier namespace_using_decl - -%type type_id new_type_id typed_typespecs typespec typed_declspecs -%type typed_declspecs1 type_specifier_seq nonempty_cv_qualifiers -%type structsp typespecqual_reserved parm named_parm full_parm - -/* C++ extensions */ -%token PTYPENAME -%token PRE_PARSED_FUNCTION_DECL EXTERN_LANG_STRING ALL -%token PRE_PARSED_CLASS_DECL DEFARG DEFARG_MARKER -%type component_constructor_declarator -%type fn.def2 return_id fn.defpen constructor_declarator -%type ctor_initializer_opt function_try_block -%type named_class_head named_class_head_sans_basetype -%type named_complex_class_head_sans_basetype -%type unnamed_class_head -%type class_head base_class_list -%type base_class_access_list -%type base_class maybe_base_class_list base_class.1 -%type exception_specification_opt ansi_raise_identifier ansi_raise_identifiers -%type operator_name -%type object aggr -%type new delete .begin_new_placement -/* %type primary_no_id */ -%type nonmomentary_expr maybe_parmlist -%type initdcl0 notype_initdcl0 member_init_list initdcl0_innards -%type template_header template_parm_list template_parm -%type template_type_parm template_template_parm -%type template_close_bracket -%type apparent_template_type -%type template_type template_arg_list template_arg_list_opt -%type template_arg -%type condition xcond paren_cond_or_null -%type type_name nested_name_specifier nested_type ptr_to_mem -%type complete_type_name notype_identifier nonnested_type -%type complex_type_name nested_name_specifier_1 -%type new_initializer new_placement -%type using_decl -%type typename_sub typename_sub0 typename_sub1 typename_sub2 -%type explicit_template_type -/* in order to recognize aggr tags as defining and thus shadowing. */ -%token TYPENAME_DEFN IDENTIFIER_DEFN PTYPENAME_DEFN -%type named_class_head_sans_basetype_defn -%type identifier_defn IDENTIFIER_DEFN TYPENAME_DEFN PTYPENAME_DEFN - -%type self_template_type .finish_template_type - -%token NSNAME -%type NSNAME - -/* Used in lex.c for parsing pragmas. */ -%token END_OF_LINE - -/* lex.c and pt.c depend on this being the last token. Define - any new tokens before this one! */ -%token END_OF_SAVED_INPUT - -%{ -/* List of types and structure classes of the current declaration. */ -static tree current_declspecs; - -/* List of prefix attributes in effect. - Prefix attributes are parsed by the reserved_declspecs and declmods - rules. They create a list that contains *both* declspecs and attrs. */ -/* ??? It is not clear yet that all cases where an attribute can now appear in - a declspec list have been updated. */ -static tree prefix_attributes; - -/* When defining an aggregate, this is the kind of the most recent one - being defined. (For example, this might be class_type_node.) */ -static tree current_aggr; - -/* When defining an enumeration, this is the type of the enumeration. */ -static tree current_enum_type; - -/* Tell yyparse how to print a token's value, if yydebug is set. */ - -#define YYPRINT(FILE,YYCHAR,YYLVAL) yyprint(FILE,YYCHAR,YYLVAL) -extern void yyprint PROTO((FILE *, int, YYSTYPE)); -extern tree combine_strings PROTO((tree)); - -static int -parse_decl(declarator, specs_attrs, attributes, initialized, decl) - tree declarator; - tree specs_attrs; - tree attributes; - int initialized; - tree* decl; -{ - int sm; - - split_specs_attrs (specs_attrs, ¤t_declspecs, &prefix_attributes); - if (current_declspecs - && TREE_CODE (current_declspecs) != TREE_LIST) - current_declspecs = get_decl_list (current_declspecs); - if (have_extern_spec && !used_extern_spec) - { - current_declspecs = decl_tree_cons (NULL_TREE, - get_identifier ("extern"), - current_declspecs); - used_extern_spec = 1; - } - sm = suspend_momentary (); - *decl = start_decl (declarator, current_declspecs, initialized, - attributes, prefix_attributes); - return sm; -} -%} - -%% -program: - /* empty */ - | extdefs - { finish_translation_unit (); } - ; - -/* the reason for the strange actions in this rule - is so that notype_initdecls when reached via datadef - can find a valid list of type and sc specs in $0. */ - -extdefs: - { $$ = NULL_TREE; } - lang_extdef - { $$ = NULL_TREE; } - | extdefs lang_extdef - { $$ = NULL_TREE; } - ; - -extdefs_opt: - extdefs - | /* empty */ - ; - -.hush_warning: - { have_extern_spec = 1; - used_extern_spec = 0; - $$ = NULL_TREE; } - ; -.warning_ok: - { have_extern_spec = 0; } - ; - -extension: - EXTENSION - { $$ = pedantic; - pedantic = 0; } - ; - -asm_keyword: - ASM_KEYWORD - ; - -lang_extdef: - { if (pending_lang_change) do_pending_lang_change(); } - extdef - { if (! toplevel_bindings_p () && ! pseudo_global_level_p()) - pop_everything (); } - ; - -extdef: - fndef eat_saved_input - { if (pending_inlines) do_pending_inlines (); } - | datadef - { if (pending_inlines) do_pending_inlines (); } - | template_def - { if (pending_inlines) do_pending_inlines (); } - | asm_keyword '(' string ')' ';' - { if (TREE_CHAIN ($3)) $3 = combine_strings ($3); - assemble_asm ($3); } - | extern_lang_string '{' extdefs_opt '}' - { pop_lang_context (); } - | extern_lang_string .hush_warning fndef .warning_ok eat_saved_input - { if (pending_inlines) do_pending_inlines (); - pop_lang_context (); } - | extern_lang_string .hush_warning datadef .warning_ok - { if (pending_inlines) do_pending_inlines (); - pop_lang_context (); } - | NAMESPACE identifier '{' - { push_namespace ($2); } - extdefs_opt '}' - { pop_namespace (); } - | NAMESPACE '{' - { push_namespace (NULL_TREE); } - extdefs_opt '}' - { pop_namespace (); } - | namespace_alias - | using_decl ';' - { do_toplevel_using_decl ($1); } - | using_directive - | extension extdef - { pedantic = $1; } - ; - -namespace_alias: - NAMESPACE identifier '=' - { begin_only_namespace_names (); } - any_id ';' - { - end_only_namespace_names (); - if (lastiddecl) - $5 = lastiddecl; - do_namespace_alias ($2, $5); - } - ; - -using_decl: - USING qualified_id - { $$ = $2; } - | USING global_scope qualified_id - { $$ = $3; } - | USING global_scope unqualified_id - { $$ = $3; } - ; - -namespace_using_decl: - USING namespace_qualifier identifier - { $$ = build_parse_node (SCOPE_REF, $2, $3); } - | USING global_scope identifier - { $$ = build_parse_node (SCOPE_REF, global_namespace, $3); } - | USING global_scope namespace_qualifier identifier - { $$ = build_parse_node (SCOPE_REF, $3, $4); } - ; - -using_directive: - USING NAMESPACE - { begin_only_namespace_names (); } - any_id ';' - { - end_only_namespace_names (); - /* If no declaration was found, the using-directive is - invalid. Since that was not reported, we need the - identifier for the error message. */ - if (TREE_CODE ($4) == IDENTIFIER_NODE && lastiddecl) - $4 = lastiddecl; - do_using_directive ($4); - } - ; - -namespace_qualifier: - NSNAME SCOPE - { - if (TREE_CODE ($$) == IDENTIFIER_NODE) - $$ = lastiddecl; - got_scope = $$; - } - | namespace_qualifier NSNAME SCOPE - { - $$ = $2; - if (TREE_CODE ($$) == IDENTIFIER_NODE) - $$ = lastiddecl; - got_scope = $$; - } - -any_id: - unqualified_id - | qualified_id - | global_scope qualified_id - { $$ = $2; } - | global_scope unqualified_id - { $$ = $2; } - ; - -extern_lang_string: - EXTERN_LANG_STRING - { push_lang_context ($1); } - | extern_lang_string EXTERN_LANG_STRING - { if (current_lang_name != $2) - cp_error ("use of linkage spec `%D' is different from previous spec `%D'", $2, current_lang_name); - pop_lang_context (); push_lang_context ($2); } - ; - -template_header: - TEMPLATE '<' - { begin_template_parm_list (); } - template_parm_list '>' - { $$ = end_template_parm_list ($4); } - | TEMPLATE '<' '>' - { begin_specialization(); - $$ = NULL_TREE; } - ; - -template_parm_list: - template_parm - { $$ = process_template_parm (NULL_TREE, $1); } - | template_parm_list ',' template_parm - { $$ = process_template_parm ($1, $3); } - ; - -maybe_identifier: - identifier - { $$ = $1; } - | /* empty */ - { $$ = NULL_TREE; } - -template_type_parm: - aggr maybe_identifier - { $$ = finish_template_type_parm ($1, $2); } - | TYPENAME_KEYWORD maybe_identifier - { $$ = finish_template_type_parm (class_type_node, $2); } - ; - -template_template_parm: - template_header aggr maybe_identifier - { $$ = finish_template_template_parm ($2, $3); } - ; - -template_parm: - /* The following rules introduce a new reduce/reduce - conflict on the ',' and '>' input tokens: they are valid - prefixes for a `structsp', which means they could match a - nameless parameter. See 14.6, paragraph 3. - By putting them before the `parm' rule, we get - their match before considering them nameless parameter - declarations. */ - template_type_parm - { $$ = build_tree_list (NULL_TREE, $1); } - | template_type_parm '=' type_id - { $$ = build_tree_list (groktypename ($3.t), $1); } - | parm - { $$ = build_tree_list (NULL_TREE, $1.t); } - | parm '=' expr_no_commas %prec ARITHCOMPARE - { $$ = build_tree_list ($3, $1.t); } - | template_template_parm - { $$ = build_tree_list (NULL_TREE, $1); } - | template_template_parm '=' template_arg - { - if (TREE_CODE ($3) != TEMPLATE_DECL - && TREE_CODE ($3) != TEMPLATE_TEMPLATE_PARM - && TREE_CODE ($3) != TYPE_DECL) - { - error ("invalid default template argument"); - $3 = error_mark_node; - } - $$ = build_tree_list ($3, $1); - } - ; - -template_def: - template_header template_extdef - { finish_template_decl ($1); } - | template_header error %prec EMPTY - { finish_template_decl ($1); } - ; - -template_extdef: - fndef eat_saved_input - { if (pending_inlines) do_pending_inlines (); } - | template_datadef - { if (pending_inlines) do_pending_inlines (); } - | template_def - { if (pending_inlines) do_pending_inlines (); } - | extern_lang_string .hush_warning fndef .warning_ok eat_saved_input - { if (pending_inlines) do_pending_inlines (); - pop_lang_context (); } - | extern_lang_string .hush_warning template_datadef .warning_ok - { if (pending_inlines) do_pending_inlines (); - pop_lang_context (); } - | extension template_extdef - { pedantic = $1; } - ; - -template_datadef: - nomods_initdecls ';' - | declmods notype_initdecls ';' - {} - | typed_declspecs initdecls ';' - { note_list_got_semicolon ($1.t); } - | structsp ';' - { maybe_process_partial_specialization ($1.t); - note_got_semicolon ($1.t); } - ; - -datadef: - nomods_initdecls ';' - | declmods notype_initdecls ';' - {} - | typed_declspecs initdecls ';' - { note_list_got_semicolon ($1.t); } - | declmods ';' - { pedwarn ("empty declaration"); } - | explicit_instantiation ';' - | typed_declspecs ';' - { - tree t, attrs; - split_specs_attrs ($1.t, &t, &attrs); - shadow_tag (t); - note_list_got_semicolon ($1.t); - } - | error ';' - | error '}' - | ';' - ; - -ctor_initializer_opt: - nodecls - { $$ = 0; } - | base_init - { $$ = 1; } - ; - -maybe_return_init: - /* empty */ - | return_init - | return_init ';' - ; - -eat_saved_input: - /* empty */ - | END_OF_SAVED_INPUT - ; - -fndef: - fn.def1 maybe_return_init ctor_initializer_opt compstmt_or_error - { finish_function (lineno, (int)$3, 0); } - | fn.def1 maybe_return_init function_try_block - { - int nested = (hack_decl_function_context - (current_function_decl) != NULL_TREE); - finish_function (lineno, (int)$3, nested); - } - | fn.def1 maybe_return_init error - { } - ; - -constructor_declarator: - nested_name_specifier SELFNAME '(' - { $$ = begin_constructor_declarator ($1, $2); } - parmlist ')' cv_qualifiers exception_specification_opt - { $$ = make_call_declarator ($4, $5, $7, $8); } - | nested_name_specifier SELFNAME LEFT_RIGHT cv_qualifiers exception_specification_opt - { $$ = begin_constructor_declarator ($1, $2); - $$ = make_call_declarator ($$, empty_parms (), $4, $5); - } - | global_scope nested_name_specifier SELFNAME '(' - { $$ = begin_constructor_declarator ($2, $3); } - parmlist ')' cv_qualifiers exception_specification_opt - { $$ = make_call_declarator ($5, $6, $8, $9); } - | global_scope nested_name_specifier SELFNAME LEFT_RIGHT cv_qualifiers exception_specification_opt - { $$ = begin_constructor_declarator ($2, $3); - $$ = make_call_declarator ($$, empty_parms (), $5, $6); - } - | nested_name_specifier self_template_type '(' - { $$ = begin_constructor_declarator ($1, $2); } - parmlist ')' cv_qualifiers exception_specification_opt - { $$ = make_call_declarator ($4, $5, $7, $8); } - | nested_name_specifier self_template_type LEFT_RIGHT cv_qualifiers exception_specification_opt - { $$ = begin_constructor_declarator ($1, $2); - $$ = make_call_declarator ($$, empty_parms (), $4, $5); - } - | global_scope nested_name_specifier self_template_type '(' - { $$ = begin_constructor_declarator ($2, $3); } - parmlist ')' cv_qualifiers exception_specification_opt - { $$ = make_call_declarator ($5, $6, $8, $9); } - | global_scope nested_name_specifier self_template_type LEFT_RIGHT cv_qualifiers exception_specification_opt - { $$ = begin_constructor_declarator ($2, $3); - $$ = make_call_declarator ($$, empty_parms (), $5, $6); - } - ; - -fn.def1: - typed_declspecs declarator - { if (!begin_function_definition ($1.t, $2)) - YYERROR1; } - | declmods notype_declarator - { if (!begin_function_definition ($1, $2)) - YYERROR1; } - | notype_declarator - { if (!begin_function_definition (NULL_TREE, $1)) - YYERROR1; } - | declmods constructor_declarator - { if (!begin_function_definition ($1, $2)) - YYERROR1; } - | constructor_declarator - { if (!begin_function_definition (NULL_TREE, $1)) - YYERROR1; } - ; - -component_constructor_declarator: - SELFNAME '(' parmlist ')' cv_qualifiers exception_specification_opt - { $$ = make_call_declarator ($1, $3, $5, $6); } - | SELFNAME LEFT_RIGHT cv_qualifiers exception_specification_opt - { $$ = make_call_declarator ($1, empty_parms (), $3, $4); } - | self_template_type '(' parmlist ')' cv_qualifiers exception_specification_opt - { $$ = make_call_declarator ($1, $3, $5, $6); } - | self_template_type LEFT_RIGHT cv_qualifiers exception_specification_opt - { $$ = make_call_declarator ($1, empty_parms (), $3, $4); } - ; - -/* more C++ complexity. See component_decl for a comment on the - reduce/reduce conflict introduced by these rules. */ -fn.def2: - declmods component_constructor_declarator - { tree specs, attrs; - split_specs_attrs ($1, &specs, &attrs); - attrs = build_tree_list (attrs, NULL_TREE); - $$ = start_method (specs, $2, attrs); - rest_of_mdef: - if (! $$) - YYERROR1; - if (yychar == YYEMPTY) - yychar = YYLEX; - reinit_parse_for_method (yychar, $$); } - | component_constructor_declarator - { $$ = start_method (NULL_TREE, $1, NULL_TREE); - goto rest_of_mdef; } - | typed_declspecs declarator - { tree specs, attrs; - split_specs_attrs ($1.t, &specs, &attrs); - attrs = build_tree_list (attrs, NULL_TREE); - $$ = start_method (specs, $2, attrs); goto rest_of_mdef; } - | declmods notype_declarator - { tree specs, attrs; - split_specs_attrs ($1, &specs, &attrs); - attrs = build_tree_list (attrs, NULL_TREE); - $$ = start_method (specs, $2, attrs); goto rest_of_mdef; } - | notype_declarator - { $$ = start_method (NULL_TREE, $$, NULL_TREE); - goto rest_of_mdef; } - | declmods constructor_declarator - { tree specs, attrs; - split_specs_attrs ($1, &specs, &attrs); - attrs = build_tree_list (attrs, NULL_TREE); - $$ = start_method (specs, $2, attrs); goto rest_of_mdef; } - | constructor_declarator - { $$ = start_method (NULL_TREE, $$, NULL_TREE); - goto rest_of_mdef; } - ; - -return_id: - RETURN IDENTIFIER - { - if (! current_function_parms_stored) - store_parm_decls (); - $$ = $2; - } - ; - -return_init: - return_id maybe_init - { store_return_init ($$, $2); } - | return_id '(' nonnull_exprlist ')' - { store_return_init ($$, $3); } - | return_id LEFT_RIGHT - { store_return_init ($$, NULL_TREE); } - ; - -base_init: - ':' .set_base_init member_init_list - { - if ($3 == 0) - error ("no base initializers given following ':'"); - setup_vtbl_ptr (); - /* Always keep the BLOCK node associated with the outermost - pair of curley braces of a function. These are needed - for correct operation of dwarfout.c. */ - keep_next_level (); - } - ; - -.set_base_init: - /* empty */ - { - if (! current_function_parms_stored) - store_parm_decls (); - - if (DECL_CONSTRUCTOR_P (current_function_decl)) - { - /* Make a contour for the initializer list. */ - pushlevel (0); - clear_last_expr (); - expand_start_bindings (0); - } - else if (current_class_type == NULL_TREE) - error ("base initializers not allowed for non-member functions"); - else if (! DECL_CONSTRUCTOR_P (current_function_decl)) - error ("only constructors take base initializers"); - } - ; - -member_init_list: - /* empty */ - { $$ = 0; } - | member_init - { $$ = 1; } - | member_init_list ',' member_init - | member_init_list error - ; - -member_init: - '(' nonnull_exprlist ')' - { - if (current_class_name) - pedwarn ("anachronistic old style base class initializer"); - expand_member_init (current_class_ref, NULL_TREE, $2); - } - | LEFT_RIGHT - { - if (current_class_name) - pedwarn ("anachronistic old style base class initializer"); - expand_member_init (current_class_ref, NULL_TREE, void_type_node); - } - | notype_identifier '(' nonnull_exprlist ')' - { expand_member_init (current_class_ref, $1, $3); } - | notype_identifier LEFT_RIGHT - { expand_member_init (current_class_ref, $1, void_type_node); } - | nonnested_type '(' nonnull_exprlist ')' - { expand_member_init (current_class_ref, $1, $3); } - | nonnested_type LEFT_RIGHT - { expand_member_init (current_class_ref, $1, void_type_node); } - | typename_sub '(' nonnull_exprlist ')' - { expand_member_init (current_class_ref, TYPE_MAIN_DECL ($1), - $3); } - | typename_sub LEFT_RIGHT - { expand_member_init (current_class_ref, TYPE_MAIN_DECL ($1), - void_type_node); } - ; - -identifier: - IDENTIFIER - | TYPENAME - | SELFNAME - | PTYPENAME - | NSNAME - ; - -notype_identifier: - IDENTIFIER - | PTYPENAME - | NSNAME %prec EMPTY - ; - -identifier_defn: - IDENTIFIER_DEFN - | TYPENAME_DEFN - | PTYPENAME_DEFN - ; - -explicit_instantiation: - TEMPLATE begin_explicit_instantiation typespec ';' - { do_type_instantiation ($3.t, NULL_TREE); - yyungetc (';', 1); } - end_explicit_instantiation - | TEMPLATE begin_explicit_instantiation typed_declspecs declarator - { tree specs = strip_attrs ($3.t); - do_decl_instantiation (specs, $4, NULL_TREE); } - end_explicit_instantiation - | TEMPLATE begin_explicit_instantiation notype_declarator - { do_decl_instantiation (NULL_TREE, $3, NULL_TREE); } - end_explicit_instantiation - | TEMPLATE begin_explicit_instantiation constructor_declarator - { do_decl_instantiation (NULL_TREE, $3, NULL_TREE); } - end_explicit_instantiation - | SCSPEC TEMPLATE begin_explicit_instantiation typespec ';' - { do_type_instantiation ($4.t, $1); - yyungetc (';', 1); } - end_explicit_instantiation - | SCSPEC TEMPLATE begin_explicit_instantiation typed_declspecs - declarator - { tree specs = strip_attrs ($4.t); - do_decl_instantiation (specs, $5, $1); } - end_explicit_instantiation - | SCSPEC TEMPLATE begin_explicit_instantiation notype_declarator - { do_decl_instantiation (NULL_TREE, $4, $1); } - end_explicit_instantiation - | SCSPEC TEMPLATE begin_explicit_instantiation constructor_declarator - { do_decl_instantiation (NULL_TREE, $4, $1); } - end_explicit_instantiation - ; - -begin_explicit_instantiation: - { begin_explicit_instantiation(); } - -end_explicit_instantiation: - { end_explicit_instantiation(); } - -/* The TYPENAME expansions are to deal with use of a template class name as - a template within the class itself, where the template decl is hidden by - a type decl. Got all that? */ - -template_type: - PTYPENAME '<' template_arg_list_opt template_close_bracket - .finish_template_type - { $$ = $5; } - | TYPENAME '<' template_arg_list_opt template_close_bracket - .finish_template_type - { $$ = $5; } - | self_template_type - ; - -apparent_template_type: - template_type - | identifier '<' template_arg_list_opt '>' - .finish_template_type - { $$ = $5; } - -self_template_type: - SELFNAME '<' template_arg_list_opt template_close_bracket - .finish_template_type - { $$ = $5; } - ; - -.finish_template_type: - { - if (yychar == YYEMPTY) - yychar = YYLEX; - - $$ = finish_template_type ($-3, $-1, - yychar == SCOPE); - } - -template_close_bracket: - '>' - | RSHIFT - { - /* Handle `Class>' without space in the `>>' */ - pedwarn ("`>>' should be `> >' in template class name"); - yyungetc ('>', 1); - } - ; - -template_arg_list_opt: - /* empty */ - { $$ = NULL_TREE; } - | template_arg_list - ; - -template_arg_list: - template_arg - { $$ = build_tree_list (NULL_TREE, $$); } - | template_arg_list ',' template_arg - { $$ = chainon ($$, build_tree_list (NULL_TREE, $3)); } - ; - -template_arg: - type_id - { $$ = groktypename ($1.t); } - | PTYPENAME - { $$ = lastiddecl; } - | expr_no_commas %prec ARITHCOMPARE - ; - -unop: - '-' - { $$ = NEGATE_EXPR; } - | '+' - { $$ = CONVERT_EXPR; } - | PLUSPLUS - { $$ = PREINCREMENT_EXPR; } - | MINUSMINUS - { $$ = PREDECREMENT_EXPR; } - | '!' - { $$ = TRUTH_NOT_EXPR; } - ; - -expr: - nontrivial_exprlist - { $$ = build_x_compound_expr ($$); } - | expr_no_commas - ; - -paren_expr_or_null: - LEFT_RIGHT - { error ("ANSI C++ forbids an empty condition for `%s'", - cond_stmt_keyword); - $$ = integer_zero_node; } - | '(' expr ')' - { $$ = $2; } - ; - -paren_cond_or_null: - LEFT_RIGHT - { error ("ANSI C++ forbids an empty condition for `%s'", - cond_stmt_keyword); - $$ = integer_zero_node; } - | '(' condition ')' - { $$ = $2; } - ; - -xcond: - /* empty */ - { $$ = NULL_TREE; } - | condition - | error - { $$ = NULL_TREE; } - ; - -condition: - type_specifier_seq declarator maybeasm maybe_attribute '=' - { { - tree d; - for (d = getdecls (); d; d = TREE_CHAIN (d)) - if (TREE_CODE (d) == TYPE_DECL) { - tree s = TREE_TYPE (d); - if (TREE_CODE (s) == RECORD_TYPE) - cp_error ("definition of class `%T' in condition", s); - else if (TREE_CODE (s) == ENUMERAL_TYPE) - cp_error ("definition of enum `%T' in condition", s); - } - } - current_declspecs = $1.t; - $5 = suspend_momentary (); - $$ = start_decl ($2, current_declspecs, 1, - $4, /*prefix_attributes*/ NULL_TREE); - } - init - { - cp_finish_decl ($6, $7, $4, 1, LOOKUP_ONLYCONVERTING); - resume_momentary ($5); - $$ = convert_from_reference ($6); - if (TREE_CODE (TREE_TYPE ($$)) == ARRAY_TYPE) - cp_error ("definition of array `%#D' in condition", $$); - } - | expr - ; - -compstmtend: - '}' - | maybe_label_decls stmts '}' - | maybe_label_decls stmts error '}' - | maybe_label_decls error '}' - ; - -already_scoped_stmt: - '{' - { $$ = begin_compound_stmt (1); } - compstmtend - { finish_compound_stmt (1, $2); } - | simple_stmt - ; - - -nontrivial_exprlist: - expr_no_commas ',' expr_no_commas - { $$ = expr_tree_cons (NULL_TREE, $$, - build_expr_list (NULL_TREE, $3)); } - | expr_no_commas ',' error - { $$ = expr_tree_cons (NULL_TREE, $$, - build_expr_list (NULL_TREE, error_mark_node)); } - | nontrivial_exprlist ',' expr_no_commas - { chainon ($$, build_expr_list (NULL_TREE, $3)); } - | nontrivial_exprlist ',' error - { chainon ($$, build_expr_list (NULL_TREE, error_mark_node)); } - ; - -nonnull_exprlist: - expr_no_commas - { $$ = build_expr_list (NULL_TREE, $$); } - | nontrivial_exprlist - ; - -unary_expr: - primary %prec UNARY - { $$ = $1; } - /* __extension__ turns off -pedantic for following primary. */ - | extension cast_expr %prec UNARY - { $$ = $2; - pedantic = $1; } - | '*' cast_expr %prec UNARY - { $$ = build_x_indirect_ref ($2, "unary *"); } - | '&' cast_expr %prec UNARY - { $$ = build_x_unary_op (ADDR_EXPR, $2); } - | '~' cast_expr - { $$ = build_x_unary_op (BIT_NOT_EXPR, $2); } - | unop cast_expr %prec UNARY - { $$ = finish_unary_op_expr ($1, $2); } - /* Refer to the address of a label as a pointer. */ - | ANDAND identifier - { if (pedantic) - pedwarn ("ANSI C++ forbids `&&'"); - $$ = finish_label_address_expr ($2); } - | SIZEOF unary_expr %prec UNARY - { $$ = expr_sizeof ($2); } - | SIZEOF '(' type_id ')' %prec HYPERUNARY - { $$ = c_sizeof (groktypename ($3.t)); - check_for_new_type ("sizeof", $3); } - | ALIGNOF unary_expr %prec UNARY - { $$ = grok_alignof ($2); } - | ALIGNOF '(' type_id ')' %prec HYPERUNARY - { $$ = c_alignof (groktypename ($3.t)); - check_for_new_type ("alignof", $3); } - - /* The %prec EMPTY's here are required by the = init initializer - syntax extension; see below. */ - | new new_type_id %prec EMPTY - { $$ = build_new (NULL_TREE, $2.t, NULL_TREE, $1); - check_for_new_type ("new", $2); } - | new new_type_id new_initializer - { $$ = build_new (NULL_TREE, $2.t, $3, $1); - check_for_new_type ("new", $2); } - | new new_placement new_type_id %prec EMPTY - { $$ = build_new ($2, $3.t, NULL_TREE, $1); - check_for_new_type ("new", $3); } - | new new_placement new_type_id new_initializer - { $$ = build_new ($2, $3.t, $4, $1); - check_for_new_type ("new", $3); } - /* The .begin_new_placement in the following rules is - necessary to avoid shift/reduce conflicts that lead to - mis-parsing some expressions. Of course, these constructs - are not really new-placement and it is bogus to call - begin_new_placement. But, the parser cannot always tell at this - point whether the next thing is an expression or a type-id, - so there is nothing we can do. Fortunately, - begin_new_placement does nothing harmful. When we rewrite - the parser, this lossage should be removed, of course. */ - | new '(' .begin_new_placement type_id .finish_new_placement - %prec EMPTY - { $$ = build_new (NULL_TREE, groktypename($4.t), - NULL_TREE, $1); - check_for_new_type ("new", $4); } - | new '(' .begin_new_placement type_id .finish_new_placement - new_initializer - { $$ = build_new (NULL_TREE, groktypename($4.t), $6, $1); - check_for_new_type ("new", $4); } - | new new_placement '(' .begin_new_placement type_id - .finish_new_placement %prec EMPTY - { $$ = build_new ($2, groktypename($5.t), NULL_TREE, $1); - check_for_new_type ("new", $5); } - | new new_placement '(' .begin_new_placement type_id - .finish_new_placement new_initializer - { $$ = build_new ($2, groktypename($5.t), $7, $1); - check_for_new_type ("new", $5); } - - | delete cast_expr %prec UNARY - { $$ = delete_sanity ($2, NULL_TREE, 0, $1); } - | delete '[' ']' cast_expr %prec UNARY - { $$ = delete_sanity ($4, NULL_TREE, 1, $1); - if (yychar == YYEMPTY) - yychar = YYLEX; } - | delete '[' expr ']' cast_expr %prec UNARY - { $$ = delete_sanity ($5, $3, 2, $1); - if (yychar == YYEMPTY) - yychar = YYLEX; } - | REALPART cast_expr %prec UNARY - { $$ = build_x_unary_op (REALPART_EXPR, $2); } - | IMAGPART cast_expr %prec UNARY - { $$ = build_x_unary_op (IMAGPART_EXPR, $2); } - ; - - /* Note this rule is not suitable for use in new_placement - since it uses NULL_TREE as the argument to - finish_new_placement. This rule serves only to avoid - reduce/reduce conflicts in unary_expr. See the comments - there on the use of begin/finish_new_placement. */ -.finish_new_placement: - ')' - { finish_new_placement (NULL_TREE, $-1); } - -.begin_new_placement: - { $$ = begin_new_placement (); } - -new_placement: - '(' .begin_new_placement nonnull_exprlist ')' - { $$ = finish_new_placement ($3, $2); } - | '{' .begin_new_placement nonnull_exprlist '}' - { cp_pedwarn ("old style placement syntax, use () instead"); - $$ = finish_new_placement ($3, $2); } - ; - -new_initializer: - '(' nonnull_exprlist ')' - { $$ = $2; } - | LEFT_RIGHT - { $$ = NULL_TREE; } - | '(' typespec ')' - { - cp_error ("`%T' is not a valid expression", $2.t); - $$ = error_mark_node; - } - /* GNU extension so people can use initializer lists. Note that - this alters the meaning of `new int = 1', which was previously - syntactically valid but semantically invalid. */ - | '=' init - { - if (pedantic) - pedwarn ("ANSI C++ forbids initialization of new expression with `='"); - if (TREE_CODE ($2) != TREE_LIST - && TREE_CODE ($2) != CONSTRUCTOR) - $$ = build_expr_list (NULL_TREE, $2); - else - $$ = $2; - } - ; - -/* This is necessary to postpone reduction of `int ((int)(int)(int))'. */ -regcast_or_absdcl: - '(' type_id ')' %prec EMPTY - { $2.t = finish_parmlist (build_tree_list (NULL_TREE, $2.t), 0); - $$ = make_call_declarator (NULL_TREE, $2.t, NULL_TREE, NULL_TREE); - check_for_new_type ("cast", $2); } - | regcast_or_absdcl '(' type_id ')' %prec EMPTY - { $3.t = finish_parmlist (build_tree_list (NULL_TREE, $3.t), 0); - $$ = make_call_declarator ($$, $3.t, NULL_TREE, NULL_TREE); - check_for_new_type ("cast", $3); } - ; - -cast_expr: - unary_expr - | regcast_or_absdcl unary_expr %prec UNARY - { $$ = reparse_absdcl_as_casts ($$, $2); } - | regcast_or_absdcl '{' initlist maybecomma '}' %prec UNARY - { - tree init = build_nt (CONSTRUCTOR, NULL_TREE, - nreverse ($3)); - if (pedantic) - pedwarn ("ANSI C++ forbids constructor-expressions"); - /* Indicate that this was a GNU C constructor expression. */ - TREE_HAS_CONSTRUCTOR (init) = 1; - - $$ = reparse_absdcl_as_casts ($$, init); - } - ; - -expr_no_commas: - cast_expr - /* Handle general members. */ - | expr_no_commas POINTSAT_STAR expr_no_commas - { $$ = build_x_binary_op (MEMBER_REF, $$, $3); } - | expr_no_commas DOT_STAR expr_no_commas - { $$ = build_m_component_ref ($$, $3); } - | expr_no_commas '+' expr_no_commas - { $$ = build_x_binary_op ($2, $$, $3); } - | expr_no_commas '-' expr_no_commas - { $$ = build_x_binary_op ($2, $$, $3); } - | expr_no_commas '*' expr_no_commas - { $$ = build_x_binary_op ($2, $$, $3); } - | expr_no_commas '/' expr_no_commas - { $$ = build_x_binary_op ($2, $$, $3); } - | expr_no_commas '%' expr_no_commas - { $$ = build_x_binary_op ($2, $$, $3); } - | expr_no_commas LSHIFT expr_no_commas - { $$ = build_x_binary_op ($2, $$, $3); } - | expr_no_commas RSHIFT expr_no_commas - { $$ = build_x_binary_op ($2, $$, $3); } - | expr_no_commas ARITHCOMPARE expr_no_commas - { $$ = build_x_binary_op ($2, $$, $3); } - | expr_no_commas '<' expr_no_commas - { $$ = build_x_binary_op (LT_EXPR, $$, $3); } - | expr_no_commas '>' expr_no_commas - { $$ = build_x_binary_op (GT_EXPR, $$, $3); } - | expr_no_commas EQCOMPARE expr_no_commas - { $$ = build_x_binary_op ($2, $$, $3); } - | expr_no_commas MIN_MAX expr_no_commas - { $$ = build_x_binary_op ($2, $$, $3); } - | expr_no_commas '&' expr_no_commas - { $$ = build_x_binary_op ($2, $$, $3); } - | expr_no_commas '|' expr_no_commas - { $$ = build_x_binary_op ($2, $$, $3); } - | expr_no_commas '^' expr_no_commas - { $$ = build_x_binary_op ($2, $$, $3); } - | expr_no_commas ANDAND expr_no_commas - { $$ = build_x_binary_op (TRUTH_ANDIF_EXPR, $$, $3); } - | expr_no_commas OROR expr_no_commas - { $$ = build_x_binary_op (TRUTH_ORIF_EXPR, $$, $3); } - | expr_no_commas '?' xexpr ':' expr_no_commas - { $$ = build_x_conditional_expr ($$, $3, $5); } - | expr_no_commas '=' expr_no_commas - { $$ = build_x_modify_expr ($$, NOP_EXPR, $3); - if ($$ != error_mark_node) - C_SET_EXP_ORIGINAL_CODE ($$, MODIFY_EXPR); } - | expr_no_commas ASSIGN expr_no_commas - { $$ = build_x_modify_expr ($$, $2, $3); } - | THROW - { $$ = build_throw (NULL_TREE); } - | THROW expr_no_commas - { $$ = build_throw ($2); } -/* These extensions are not defined. The second arg to build_m_component_ref - is old, build_m_component_ref now does an implicit - build_indirect_ref (x, NULL_PTR) on the second argument. - | object '&' expr_no_commas %prec UNARY - { $$ = build_m_component_ref ($$, build_x_unary_op (ADDR_EXPR, $3)); } - | object unop expr_no_commas %prec UNARY - { $$ = build_m_component_ref ($$, build_x_unary_op ($2, $3)); } - | object '(' type_id ')' expr_no_commas %prec UNARY - { tree type = groktypename ($3.t); - $$ = build_m_component_ref ($$, build_c_cast (type, $5)); } - | object primary_no_id %prec UNARY - { $$ = build_m_component_ref ($$, $2); } -*/ - ; - -notype_unqualified_id: - '~' see_typename identifier - { $$ = build_parse_node (BIT_NOT_EXPR, $3); } - | '~' see_typename template_type - { $$ = build_parse_node (BIT_NOT_EXPR, $3); } - | template_id - | operator_name - | IDENTIFIER - | PTYPENAME - | NSNAME %prec EMPTY - ; - -do_id: - { - /* If lastiddecl is a TREE_LIST, it's a baselink, which - means that we're in an expression like S::f, so - don't do_identifier; we only do that for unqualified - identifiers. */ - if (lastiddecl && TREE_CODE (lastiddecl) != TREE_LIST) - $$ = do_identifier ($-1, 1, NULL_TREE); - else - $$ = $-1; - } - -template_id: - PFUNCNAME '<' do_id template_arg_list_opt template_close_bracket - { $$ = lookup_template_function ($3, $4); } - | operator_name '<' do_id template_arg_list_opt template_close_bracket - { $$ = lookup_template_function ($3, $4); } - ; - -object_template_id: - TEMPLATE identifier '<' template_arg_list_opt template_close_bracket - { $$ = lookup_template_function ($2, $4); } - | TEMPLATE PFUNCNAME '<' template_arg_list_opt template_close_bracket - { $$ = lookup_template_function ($2, $4); } - | TEMPLATE operator_name '<' template_arg_list_opt - template_close_bracket - { $$ = lookup_template_function ($2, $4); } - ; - -unqualified_id: - notype_unqualified_id - | TYPENAME - | SELFNAME - ; - -expr_or_declarator_intern: - expr_or_declarator - | attributes expr_or_declarator - { - /* Provide support for '(' attributes '*' declarator ')' - etc */ - $$ = decl_tree_cons ($1, $2, NULL_TREE); - } - ; - -expr_or_declarator: - notype_unqualified_id - | '*' expr_or_declarator_intern %prec UNARY - { $$ = build_parse_node (INDIRECT_REF, $2); } - | '&' expr_or_declarator_intern %prec UNARY - { $$ = build_parse_node (ADDR_EXPR, $2); } - | '(' expr_or_declarator_intern ')' - { $$ = $2; } - ; - -notype_template_declarator: - IDENTIFIER '<' template_arg_list_opt template_close_bracket - { $$ = lookup_template_function ($1, $3); } - | NSNAME '<' template_arg_list template_close_bracket - { $$ = lookup_template_function ($1, $3); } - ; - -direct_notype_declarator: - complex_direct_notype_declarator - /* This precedence declaration is to prefer this reduce - to the Koenig lookup shift in primary, below. I hate yacc. */ - | notype_unqualified_id %prec '(' - | notype_template_declarator - | '(' expr_or_declarator_intern ')' - { $$ = finish_decl_parsing ($2); } - ; - -primary: - notype_unqualified_id - { - if (TREE_CODE ($1) == BIT_NOT_EXPR) - $$ = build_x_unary_op (BIT_NOT_EXPR, TREE_OPERAND ($1, 0)); - else - $$ = finish_id_expr ($1); - } - | CONSTANT - | boolean.literal - | string - { - if (processing_template_decl) - push_obstacks (&permanent_obstack, &permanent_obstack); - $$ = combine_strings ($$); - /* combine_strings doesn't set up TYPE_MAIN_VARIANT of - a const array the way we want, so fix it. */ - if (flag_const_strings) - TREE_TYPE ($$) = build_cplus_array_type - (TREE_TYPE (TREE_TYPE ($$)), - TYPE_DOMAIN (TREE_TYPE ($$))); - if (processing_template_decl) - pop_obstacks (); - } - | '(' expr ')' - { $$ = finish_parenthesized_expr ($2); } - | '(' expr_or_declarator_intern ')' - { $2 = reparse_decl_as_expr (NULL_TREE, $2); - $$ = finish_parenthesized_expr ($2); } - | '(' error ')' - { $$ = error_mark_node; } - | '(' - { tree scope = current_scope (); - if (!scope || TREE_CODE (scope) != FUNCTION_DECL) - { - error ("braced-group within expression allowed only inside a function"); - YYERROR; - } - if (pedantic) - pedwarn ("ANSI C++ forbids braced-groups within expressions"); - $$ = begin_stmt_expr (); - } - compstmt ')' - { $$ = finish_stmt_expr ($2, $3); } - /* Koenig lookup support - We could store lastiddecl in $1 to avoid another lookup, - but that would result in many additional reduce/reduce conflicts. */ - | notype_unqualified_id '(' nonnull_exprlist ')' - { $$ = finish_call_expr ($1, $3, 1); } - | notype_unqualified_id LEFT_RIGHT - { $$ = finish_call_expr ($1, NULL_TREE, 1); } - | primary '(' nonnull_exprlist ')' - { $$ = finish_call_expr ($1, $3, 0); } - | primary LEFT_RIGHT - { $$ = finish_call_expr ($1, NULL_TREE, 0); } - | primary '[' expr ']' - { $$ = grok_array_decl ($$, $3); } - | primary PLUSPLUS - { $$ = finish_increment_expr ($1, POSTINCREMENT_EXPR); } - | primary MINUSMINUS - { $$ = finish_increment_expr ($1, POSTDECREMENT_EXPR); } - /* C++ extensions */ - | THIS - { $$ = finish_this_expr (); } - | CV_QUALIFIER '(' nonnull_exprlist ')' - { - /* This is a C cast in C++'s `functional' notation - using the "implicit int" extension so that: - `const (3)' is equivalent to `const int (3)'. */ - tree type; - - if ($3 == error_mark_node) - { - $$ = error_mark_node; - break; - } - - type = cp_build_qualified_type (integer_type_node, - cp_type_qual_from_rid ($1)); - $$ = build_c_cast (type, build_compound_expr ($3)); - } - | functional_cast - | DYNAMIC_CAST '<' type_id '>' '(' expr ')' - { tree type = groktypename ($3.t); - check_for_new_type ("dynamic_cast", $3); - $$ = build_dynamic_cast (type, $6); } - | STATIC_CAST '<' type_id '>' '(' expr ')' - { tree type = groktypename ($3.t); - check_for_new_type ("static_cast", $3); - $$ = build_static_cast (type, $6); } - | REINTERPRET_CAST '<' type_id '>' '(' expr ')' - { tree type = groktypename ($3.t); - check_for_new_type ("reinterpret_cast", $3); - $$ = build_reinterpret_cast (type, $6); } - | CONST_CAST '<' type_id '>' '(' expr ')' - { tree type = groktypename ($3.t); - check_for_new_type ("const_cast", $3); - $$ = build_const_cast (type, $6); } - | TYPEID '(' expr ')' - { $$ = build_x_typeid ($3); } - | TYPEID '(' type_id ')' - { tree type = groktypename ($3.t); - check_for_new_type ("typeid", $3); - $$ = get_typeid (TYPE_MAIN_VARIANT (type)); } - | global_scope IDENTIFIER - { $$ = do_scoped_id ($2, 1); } - | global_scope template_id - { $$ = $2; } - | global_scope operator_name - { - got_scope = NULL_TREE; - if (TREE_CODE ($2) == IDENTIFIER_NODE) - $$ = do_scoped_id ($2, 1); - else - $$ = $2; - } - | overqualified_id %prec HYPERUNARY - { $$ = build_offset_ref (OP0 ($$), OP1 ($$)); } - | overqualified_id '(' nonnull_exprlist ')' - { $$ = finish_qualified_call_expr ($1, $3); } - | overqualified_id LEFT_RIGHT - { $$ = finish_qualified_call_expr ($1, NULL_TREE); } - | object object_template_id %prec UNARY - { - $$ = build_x_component_ref ($$, $2, NULL_TREE, 1); - } - | object object_template_id '(' nonnull_exprlist ')' - { $$ = finish_object_call_expr ($2, $1, $4); } - | object object_template_id LEFT_RIGHT - { $$ = finish_object_call_expr ($2, $1, NULL_TREE); } - | object unqualified_id %prec UNARY - { $$ = build_x_component_ref ($$, $2, NULL_TREE, 1); } - | object overqualified_id %prec UNARY - { if (processing_template_decl) - $$ = build_min_nt (COMPONENT_REF, $1, copy_to_permanent ($2)); - else - $$ = build_object_ref ($$, OP0 ($2), OP1 ($2)); } - | object unqualified_id '(' nonnull_exprlist ')' - { $$ = finish_object_call_expr ($2, $1, $4); } - | object unqualified_id LEFT_RIGHT - { $$ = finish_object_call_expr ($2, $1, NULL_TREE); } - | object overqualified_id '(' nonnull_exprlist ')' - { $$ = finish_qualified_object_call_expr ($2, $1, $4); } - | object overqualified_id LEFT_RIGHT - { $$ = finish_qualified_object_call_expr ($2, $1, NULL_TREE); } - /* p->int::~int() is valid -- 12.4 */ - | object '~' TYPESPEC LEFT_RIGHT - { $$ = finish_pseudo_destructor_call_expr ($1, NULL_TREE, $3); } - | object TYPESPEC SCOPE '~' TYPESPEC LEFT_RIGHT - { $$ = finish_pseudo_destructor_call_expr ($1, $2, $5); } - | object error - { - $$ = error_mark_node; - } - ; - -/* Not needed for now. - -primary_no_id: - '(' expr ')' - { $$ = $2; } - | '(' error ')' - { $$ = error_mark_node; } - | '(' - { if (current_function_decl == 0) - { - error ("braced-group within expression allowed only inside a function"); - YYERROR; - } - $$ = expand_start_stmt_expr (); } - compstmt ')' - { if (pedantic) - pedwarn ("ANSI C++ forbids braced-groups within expressions"); - $$ = expand_end_stmt_expr ($2); } - | primary_no_id '(' nonnull_exprlist ')' - { $$ = build_x_function_call ($$, $3, current_class_ref); } - | primary_no_id LEFT_RIGHT - { $$ = build_x_function_call ($$, NULL_TREE, current_class_ref); } - | primary_no_id '[' expr ']' - { goto do_array; } - | primary_no_id PLUSPLUS - { $$ = build_x_unary_op (POSTINCREMENT_EXPR, $$); } - | primary_no_id MINUSMINUS - { $$ = build_x_unary_op (POSTDECREMENT_EXPR, $$); } - | SCOPE IDENTIFIER - { goto do_scoped_id; } - | SCOPE operator_name - { if (TREE_CODE ($2) == IDENTIFIER_NODE) - goto do_scoped_id; - goto do_scoped_operator; - } - ; -*/ - -new: - NEW - { $$ = 0; } - | global_scope NEW - { got_scope = NULL_TREE; $$ = 1; } - ; - -delete: - DELETE - { $$ = 0; } - | global_scope delete - { got_scope = NULL_TREE; $$ = 1; } - ; - -boolean.literal: - CXX_TRUE - { $$ = boolean_true_node; } - | CXX_FALSE - { $$ = boolean_false_node; } - ; - -/* Produces a STRING_CST with perhaps more STRING_CSTs chained onto it. */ -string: - STRING - | string STRING - { $$ = chainon ($$, $2); } - ; - -nodecls: - /* empty */ - { - if (! current_function_parms_stored) - store_parm_decls (); - setup_vtbl_ptr (); - /* Always keep the BLOCK node associated with the outermost - pair of curley braces of a function. These are needed - for correct operation of dwarfout.c. */ - keep_next_level (); - } - ; - -object: - primary '.' - { got_object = TREE_TYPE ($$); } - | primary POINTSAT - { - $$ = build_x_arrow ($$); - got_object = TREE_TYPE ($$); - } - ; - -decl: - typespec initdecls ';' - { - resume_momentary ($2); - if ($1.t && IS_AGGR_TYPE_CODE (TREE_CODE ($1.t))) - note_got_semicolon ($1.t); - } - | typed_declspecs initdecls ';' - { - resume_momentary ($2); - note_list_got_semicolon ($1.t); - } - | declmods notype_initdecls ';' - { resume_momentary ($2); } - | typed_declspecs ';' - { - shadow_tag ($1.t); - note_list_got_semicolon ($1.t); - } - | declmods ';' - { warning ("empty declaration"); } - | extension decl - { pedantic = $1; } - ; - -/* Any kind of declarator (thus, all declarators allowed - after an explicit typespec). */ - -declarator: - after_type_declarator %prec EMPTY - | notype_declarator %prec EMPTY - ; - -/* This is necessary to postpone reduction of `int()()()()'. */ -fcast_or_absdcl: - LEFT_RIGHT %prec EMPTY - { $$ = make_call_declarator (NULL_TREE, empty_parms (), - NULL_TREE, NULL_TREE); } - | fcast_or_absdcl LEFT_RIGHT %prec EMPTY - { $$ = make_call_declarator ($$, empty_parms (), NULL_TREE, - NULL_TREE); } - ; - -/* ANSI type-id (8.1) */ -type_id: - typed_typespecs absdcl - { $$.t = build_decl_list ($1.t, $2); - $$.new_type_flag = $1.new_type_flag; } - | nonempty_cv_qualifiers absdcl - { $$.t = build_decl_list ($1.t, $2); - $$.new_type_flag = $1.new_type_flag; } - | typespec absdcl - { $$.t = build_decl_list (get_decl_list ($1.t), $2); - $$.new_type_flag = $1.new_type_flag; } - | typed_typespecs %prec EMPTY - { $$.t = build_decl_list ($1.t, NULL_TREE); - $$.new_type_flag = $1.new_type_flag; } - | nonempty_cv_qualifiers %prec EMPTY - { $$.t = build_decl_list ($1.t, NULL_TREE); - $$.new_type_flag = $1.new_type_flag; } - ; - -/* Declspecs which contain at least one type specifier or typedef name. - (Just `const' or `volatile' is not enough.) - A typedef'd name following these is taken as a name to be declared. - In the result, declspecs have a non-NULL TREE_VALUE, attributes do not. */ - -typed_declspecs: - typed_typespecs %prec EMPTY - | typed_declspecs1 - ; - -typed_declspecs1: - declmods typespec - { $$.t = decl_tree_cons (NULL_TREE, $2.t, $1); - $$.new_type_flag = $2.new_type_flag; } - | typespec reserved_declspecs %prec HYPERUNARY - { $$.t = decl_tree_cons (NULL_TREE, $1.t, $2); - $$.new_type_flag = $1.new_type_flag; } - | typespec reserved_typespecquals reserved_declspecs - { $$.t = decl_tree_cons (NULL_TREE, $1.t, chainon ($2, $3)); - $$.new_type_flag = $1.new_type_flag; } - | declmods typespec reserved_declspecs - { $$.t = decl_tree_cons (NULL_TREE, $2.t, chainon ($3, $1)); - $$.new_type_flag = $2.new_type_flag; } - | declmods typespec reserved_typespecquals - { $$.t = decl_tree_cons (NULL_TREE, $2.t, chainon ($3, $1)); - $$.new_type_flag = $2.new_type_flag; } - | declmods typespec reserved_typespecquals reserved_declspecs - { $$.t = decl_tree_cons (NULL_TREE, $2.t, - chainon ($3, chainon ($4, $1))); - $$.new_type_flag = $2.new_type_flag; } - ; - -reserved_declspecs: - SCSPEC - { if (extra_warnings) - warning ("`%s' is not at beginning of declaration", - IDENTIFIER_POINTER ($$)); - $$ = build_decl_list (NULL_TREE, $$); } - | reserved_declspecs typespecqual_reserved - { $$ = decl_tree_cons (NULL_TREE, $2.t, $$); } - | reserved_declspecs SCSPEC - { if (extra_warnings) - warning ("`%s' is not at beginning of declaration", - IDENTIFIER_POINTER ($2)); - $$ = decl_tree_cons (NULL_TREE, $2, $$); } - | reserved_declspecs attributes - { $$ = decl_tree_cons ($2, NULL_TREE, $1); } - | attributes - { $$ = decl_tree_cons ($1, NULL_TREE, NULL_TREE); } - ; - -/* List of just storage classes and type modifiers. - A declaration can start with just this, but then it cannot be used - to redeclare a typedef-name. - In the result, declspecs have a non-NULL TREE_VALUE, attributes do not. */ - -declmods: - nonempty_cv_qualifiers %prec EMPTY - { $$ = $1.t; TREE_STATIC ($$) = 1; } - | SCSPEC - { $$ = IDENTIFIER_AS_LIST ($$); } - | declmods CV_QUALIFIER - { $$ = decl_tree_cons (NULL_TREE, $2, $$); - TREE_STATIC ($$) = 1; } - | declmods SCSPEC - { if (extra_warnings && TREE_STATIC ($$)) - warning ("`%s' is not at beginning of declaration", - IDENTIFIER_POINTER ($2)); - $$ = decl_tree_cons (NULL_TREE, $2, $$); - TREE_STATIC ($$) = TREE_STATIC ($1); } - | declmods attributes - { $$ = decl_tree_cons ($2, NULL_TREE, $1); } - | attributes - { $$ = decl_tree_cons ($1, NULL_TREE, NULL_TREE); } - ; - -/* Used instead of declspecs where storage classes are not allowed - (that is, for typenames and structure components). - - C++ can takes storage classes for structure components. - Don't accept a typedef-name if anything but a modifier precedes it. */ - -typed_typespecs: - typespec %prec EMPTY - { $$.t = get_decl_list ($1.t); - $$.new_type_flag = $1.new_type_flag; } - | nonempty_cv_qualifiers typespec - { $$.t = decl_tree_cons (NULL_TREE, $2.t, $1.t); - $$.new_type_flag = $2.new_type_flag; } - | typespec reserved_typespecquals - { $$.t = decl_tree_cons (NULL_TREE, $1.t, $2); - $$.new_type_flag = $1.new_type_flag; } - | nonempty_cv_qualifiers typespec reserved_typespecquals - { $$.t = decl_tree_cons (NULL_TREE, $2.t, chainon ($3, $1.t)); - $$.new_type_flag = $1.new_type_flag; } - ; - -reserved_typespecquals: - typespecqual_reserved - { $$ = build_decl_list (NULL_TREE, $1.t); } - | reserved_typespecquals typespecqual_reserved - { $$ = decl_tree_cons (NULL_TREE, $2.t, $1); } - ; - -/* A typespec (but not a type qualifier). - Once we have seen one of these in a declaration, - if a typedef name appears then it is being redeclared. */ - -typespec: - structsp - | TYPESPEC %prec EMPTY - { $$.t = $1; $$.new_type_flag = 0; } - | complete_type_name - { $$.t = $1; $$.new_type_flag = 0; } - | TYPEOF '(' expr ')' - { $$.t = finish_typeof ($3); - $$.new_type_flag = 0; } - | TYPEOF '(' type_id ')' - { $$.t = groktypename ($3.t); - $$.new_type_flag = 0; } - | SIGOF '(' expr ')' - { tree type = TREE_TYPE ($3); - - $$.new_type_flag = 0; - if (IS_AGGR_TYPE (type)) - { - sorry ("sigof type specifier"); - $$.t = type; - } - else - { - error ("`sigof' applied to non-aggregate expression"); - $$.t = error_mark_node; - } - } - | SIGOF '(' type_id ')' - { tree type = groktypename ($3.t); - - $$.new_type_flag = 0; - if (IS_AGGR_TYPE (type)) - { - sorry ("sigof type specifier"); - $$.t = type; - } - else - { - error("`sigof' applied to non-aggregate type"); - $$.t = error_mark_node; - } - } - ; - -/* A typespec that is a reserved word, or a type qualifier. */ - -typespecqual_reserved: - TYPESPEC - { $$.t = $1; $$.new_type_flag = 0; } - | CV_QUALIFIER - { $$.t = $1; $$.new_type_flag = 0; } - | structsp - ; - -initdecls: - initdcl0 - | initdecls ',' initdcl - { check_multiple_declarators (); } - ; - -notype_initdecls: - notype_initdcl0 - | notype_initdecls ',' initdcl - { check_multiple_declarators (); } - ; - -nomods_initdecls: - nomods_initdcl0 - | nomods_initdecls ',' initdcl - { check_multiple_declarators (); } - ; - -maybeasm: - /* empty */ - { $$ = NULL_TREE; } - | asm_keyword '(' string ')' - { if (TREE_CHAIN ($3)) $3 = combine_strings ($3); $$ = $3; } - ; - -initdcl: - declarator maybeasm maybe_attribute '=' - { $$ = start_decl ($1, current_declspecs, 1, - $3, prefix_attributes); } - init -/* Note how the declaration of the variable is in effect while its init is parsed! */ - { cp_finish_decl ($5, $6, $2, 1, LOOKUP_ONLYCONVERTING); } - | declarator maybeasm maybe_attribute - { $$ = start_decl ($1, current_declspecs, 0, - $3, prefix_attributes); - cp_finish_decl ($$, NULL_TREE, $2, 1, 0); } - ; - - /* This rule assumes a certain configuration of the parser stack. - In particular, $0, the element directly before the beginning of - this rule on the stack, must be a maybeasm. $-1 must be a - declarator or notype_declarator. And $-2 must be some declmods - or declspecs. We can't move the maybeasm into this rule because - we need that reduce so we prefer fn.def1 when appropriate. */ -initdcl0_innards: - maybe_attribute '=' - { $2 = parse_decl ($-1, $-2, - $1, 1, &$$); } - /* Note how the declaration of the variable is in effect - while its init is parsed! */ - init - { cp_finish_decl ($3, $4, $0, 1, - LOOKUP_ONLYCONVERTING); - $$ = $2; } - | maybe_attribute - { tree d; - $$ = parse_decl ($-1, $-2, $1, 0, &d); - cp_finish_decl (d, NULL_TREE, $0, 1, 0); } - ; - -initdcl0: - declarator maybeasm initdcl0_innards - { $$ = $3; } - -notype_initdcl0: - notype_declarator maybeasm initdcl0_innards - { $$ = $3; } - ; - -nomods_initdcl0: - notype_declarator maybeasm - { /* Set things up as initdcl0_innards expects. */ - $2 = $1; - $1 = NULL_TREE; } - initdcl0_innards - {} - | constructor_declarator maybeasm maybe_attribute - { tree d; - parse_decl($1, NULL_TREE, $3, 0, &d); - cp_finish_decl (d, NULL_TREE, $2, 1, 0); } - ; - -/* the * rules are dummies to accept the Apollo extended syntax - so that the header files compile. */ -maybe_attribute: - /* empty */ - { $$ = NULL_TREE; } - | attributes - { $$ = $1; } - ; - -attributes: - attribute - { $$ = $1; } - | attributes attribute - { $$ = chainon ($1, $2); } - ; - -attribute: - ATTRIBUTE '(' '(' attribute_list ')' ')' - { $$ = $4; } - ; - -attribute_list: - attrib - { $$ = $1; } - | attribute_list ',' attrib - { $$ = chainon ($1, $3); } - ; - -attrib: - /* empty */ - { $$ = NULL_TREE; } - | any_word - { $$ = build_tree_list ($1, NULL_TREE); } - | any_word '(' IDENTIFIER ')' - { $$ = build_tree_list ($1, build_tree_list (NULL_TREE, $3)); } - | any_word '(' IDENTIFIER ',' nonnull_exprlist ')' - { $$ = build_tree_list ($1, tree_cons (NULL_TREE, $3, $5)); } - | any_word '(' nonnull_exprlist ')' - { $$ = build_tree_list ($1, $3); } - ; - -/* This still leaves out most reserved keywords, - shouldn't we include them? */ - -any_word: - identifier - | SCSPEC - | TYPESPEC - | CV_QUALIFIER - ; - -/* A nonempty list of identifiers, including typenames. */ -identifiers_or_typenames: - identifier - { $$ = build_tree_list (NULL_TREE, $1); } - | identifiers_or_typenames ',' identifier - { $$ = chainon ($1, build_tree_list (NULL_TREE, $3)); } - ; - -maybe_init: - /* empty */ %prec EMPTY - { $$ = NULL_TREE; } - | '=' init - { $$ = $2; } - -/* If we are processing a template, we don't want to expand this - initializer yet. */ - -init: - expr_no_commas %prec '=' - | '{' '}' - { $$ = build_nt (CONSTRUCTOR, NULL_TREE, NULL_TREE); - TREE_HAS_CONSTRUCTOR ($$) = 1; } - | '{' initlist '}' - { $$ = build_nt (CONSTRUCTOR, NULL_TREE, nreverse ($2)); - TREE_HAS_CONSTRUCTOR ($$) = 1; } - | '{' initlist ',' '}' - { $$ = build_nt (CONSTRUCTOR, NULL_TREE, nreverse ($2)); - TREE_HAS_CONSTRUCTOR ($$) = 1; } - | error - { $$ = NULL_TREE; } - ; - -/* This chain is built in reverse order, - and put in forward order where initlist is used. */ -initlist: - init - { $$ = build_tree_list (NULL_TREE, $$); } - | initlist ',' init - { $$ = expr_tree_cons (NULL_TREE, $3, $$); } - /* These are for labeled elements. */ - | '[' expr_no_commas ']' init - { $$ = build_expr_list ($2, $4); } - | identifier ':' init - { $$ = build_expr_list ($$, $3); } - | initlist ',' identifier ':' init - { $$ = expr_tree_cons ($3, $5, $$); } - ; - -fn.defpen: - PRE_PARSED_FUNCTION_DECL - { start_function (NULL_TREE, TREE_VALUE ($1), - NULL_TREE, 2); - reinit_parse_for_function (); } - -pending_inline: - fn.defpen maybe_return_init ctor_initializer_opt compstmt_or_error - { - int nested = (hack_decl_function_context - (current_function_decl) != NULL_TREE); - finish_function (lineno, (int)$3 | 2, nested); - process_next_inline ($1); - } - | fn.defpen maybe_return_init function_try_block - { - int nested = (hack_decl_function_context - (current_function_decl) != NULL_TREE); - finish_function (lineno, (int)$3 | 2, nested); - process_next_inline ($1); - } - | fn.defpen maybe_return_init error - { process_next_inline ($1); } - ; - -pending_inlines: - /* empty */ - | pending_inlines pending_inline eat_saved_input - ; - -/* A regurgitated default argument. The value of DEFARG_MARKER will be - the TREE_LIST node for the parameter in question. */ -defarg_again: - DEFARG_MARKER expr_no_commas END_OF_SAVED_INPUT - { replace_defarg ($1, $2); } - | DEFARG_MARKER error END_OF_SAVED_INPUT - { replace_defarg ($1, error_mark_node); } - -pending_defargs: - /* empty */ %prec EMPTY - | pending_defargs defarg_again - { do_pending_defargs (); } - | pending_defargs error - { do_pending_defargs (); } - ; - -structsp: - ENUM identifier '{' - { $3 = suspend_momentary (); - $$ = current_enum_type; - current_enum_type = start_enum ($2); } - enumlist maybecomma_warn '}' - { TYPE_VALUES (current_enum_type) = $5; - $$.t = finish_enum (current_enum_type); - $$.new_type_flag = 1; - current_enum_type = $4; - resume_momentary ((int) $3); - check_for_missing_semicolon ($$.t); } - | ENUM identifier '{' '}' - { $$.t = finish_enum (start_enum ($2)); - $$.new_type_flag = 1; - check_for_missing_semicolon ($$.t); } - | ENUM '{' - { $2 = suspend_momentary (); - $$ = current_enum_type; - current_enum_type = start_enum (make_anon_name ()); } - enumlist maybecomma_warn '}' - { TYPE_VALUES (current_enum_type) = $4; - $$.t = finish_enum (current_enum_type); - $$.new_type_flag = 1; - current_enum_type = $3; - resume_momentary ((int) $1); - check_for_missing_semicolon ($$.t); } - | ENUM '{' '}' - { $$.t = finish_enum (start_enum (make_anon_name())); - $$.new_type_flag = 1; - check_for_missing_semicolon ($$.t); } - | ENUM identifier - { $$.t = xref_tag (enum_type_node, $2, 1); - $$.new_type_flag = 0; } - | ENUM complex_type_name - { $$.t = xref_tag (enum_type_node, $2, 1); - $$.new_type_flag = 0; } - | TYPENAME_KEYWORD typename_sub - { $$.t = $2; - $$.new_type_flag = 0; - if (!processing_template_decl) - cp_pedwarn ("using `typename' outside of template"); } - /* C++ extensions, merged with C to avoid shift/reduce conflicts */ - | class_head left_curly - opt.component_decl_list '}' maybe_attribute - { - int semi; - - if (yychar == YYEMPTY) - yychar = YYLEX; - semi = yychar == ';'; - - $$ = finish_class_definition ($1, $5, semi); - } - pending_defargs - { finish_default_args (); } - pending_inlines - { $$.t = $6; - $$.new_type_flag = 1; - begin_inline_definitions (); } - | class_head %prec EMPTY - { - $$.new_type_flag = 0; - if (TYPE_BINFO ($1) == NULL_TREE) - { - cp_error ("%T is not a class type", $1); - $$.t = error_mark_node; - } - else - { - $$.t = $1; - /* struct B: public A; is not accepted by the WP grammar. */ - if (TYPE_BINFO_BASETYPES ($$.t) && !TYPE_SIZE ($$.t) - && ! TYPE_BEING_DEFINED ($$.t)) - cp_error ("base clause without member specification for `%#T'", - $$.t); - } - } - ; - -maybecomma: - /* empty */ - | ',' - ; - -maybecomma_warn: - /* empty */ - | ',' - { if (pedantic && !in_system_header) - pedwarn ("comma at end of enumerator list"); } - ; - -aggr: - AGGR - | aggr SCSPEC - { error ("storage class specifier `%s' not allowed after struct or class", IDENTIFIER_POINTER ($2)); } - | aggr TYPESPEC - { error ("type specifier `%s' not allowed after struct or class", IDENTIFIER_POINTER ($2)); } - | aggr CV_QUALIFIER - { error ("type qualifier `%s' not allowed after struct or class", IDENTIFIER_POINTER ($2)); } - | aggr AGGR - { error ("no body nor ';' separates two class, struct or union declarations"); } - | aggr attributes - { $$ = build_decl_list ($2, $1); } - ; - -named_class_head_sans_basetype: - aggr identifier - { - current_aggr = $1; - $$ = $2; - } - ; - -named_class_head_sans_basetype_defn: - aggr identifier_defn %prec EMPTY - { current_aggr = $$; $$ = $2; } - | named_class_head_sans_basetype '{' - { yyungetc ('{', 1); } - | named_class_head_sans_basetype ':' - { yyungetc (':', 1); } - ; - -named_complex_class_head_sans_basetype: - aggr nested_name_specifier identifier - { - current_aggr = $1; - $$ = handle_class_head ($1, $2, $3); - } - | aggr global_scope nested_name_specifier identifier - { - current_aggr = $1; - $$ = handle_class_head ($1, $3, $4); - } - | aggr global_scope identifier - { - current_aggr = $1; - $$ = handle_class_head ($1, NULL_TREE, $3); - } - | aggr apparent_template_type - { current_aggr = $$; $$ = $2; } - | aggr nested_name_specifier apparent_template_type - { current_aggr = $$; $$ = $3; } - ; - -named_class_head: - named_class_head_sans_basetype %prec EMPTY - { $$ = xref_tag (current_aggr, $1, 1); } - | named_class_head_sans_basetype_defn - { $$ = xref_tag (current_aggr, $1, 0); } - /* Class name is unqualified, so we look for base classes - in the current scope. */ - maybe_base_class_list %prec EMPTY - { - $$ = $2; - if ($3) - xref_basetypes (current_aggr, $1, $2, $3); - } - | named_complex_class_head_sans_basetype - { push_scope (CP_DECL_CONTEXT ($1)); } - maybe_base_class_list - { - pop_scope (CP_DECL_CONTEXT ($1)); - $$ = TREE_TYPE ($1); - if (current_aggr == union_type_node - && TREE_CODE ($$) != UNION_TYPE) - cp_pedwarn ("`union' tag used in declaring `%#T'", $$); - else if (TREE_CODE ($$) == UNION_TYPE - && current_aggr != union_type_node) - cp_pedwarn ("non-`union' tag used in declaring `%#T'", $$); - else if (TREE_CODE ($$) == RECORD_TYPE) - /* We might be specializing a template with a different - class-key; deal. */ - CLASSTYPE_DECLARED_CLASS ($$) = (current_aggr - == class_type_node); - if ($3) - { - maybe_process_partial_specialization ($$); - xref_basetypes (current_aggr, $1, $$, $3); - } - } - ; - -unnamed_class_head: - aggr '{' - { $$ = xref_tag ($$, make_anon_name (), 0); - yyungetc ('{', 1); } - ; - -class_head: - unnamed_class_head - | named_class_head - ; - -maybe_base_class_list: - /* empty */ %prec EMPTY - { $$ = NULL_TREE; } - | ':' see_typename %prec EMPTY - { yyungetc(':', 1); $$ = NULL_TREE; } - | ':' see_typename base_class_list %prec EMPTY - { $$ = $3; } - ; - -base_class_list: - base_class - | base_class_list ',' see_typename base_class - { /* CYGNUS LOCAL Embedded C++ */ - if (flag_embedded_cxx) - pedwarn ("Embedded C++ prohibits multiple inheritance"); - /* END CYGNUS LOCAL Embedded C++ */ - $$ = chainon ($$, $4); } - ; - -base_class: - base_class.1 - { $$ = finish_base_specifier (access_default_node, $1, - current_aggr - == signature_type_node); } - | base_class_access_list see_typename base_class.1 - { $$ = finish_base_specifier ($1, $3, - current_aggr - == signature_type_node); } - ; - -base_class.1: - typename_sub - { if ($$ != error_mark_node) $$ = TYPE_MAIN_DECL ($1); } - | nonnested_type - | SIGOF '(' expr ')' - { - if (current_aggr == signature_type_node) - { - if (IS_AGGR_TYPE (TREE_TYPE ($3))) - { - sorry ("`sigof' as base signature specifier"); - $$ = TREE_TYPE ($3); - } - else - { - error ("`sigof' applied to non-aggregate expression"); - $$ = error_mark_node; - } - } - else - { - error ("`sigof' in struct or class declaration"); - $$ = error_mark_node; - } - } - | SIGOF '(' type_id ')' - { - if (current_aggr == signature_type_node) - { - if (IS_AGGR_TYPE (groktypename ($3.t))) - { - sorry ("`sigof' as base signature specifier"); - $$ = groktypename ($3.t); - } - else - { - error ("`sigof' applied to non-aggregate expression"); - $$ = error_mark_node; - } - } - else - { - error ("`sigof' in struct or class declaration"); - $$ = error_mark_node; - } - } - ; - -base_class_access_list: - VISSPEC see_typename - | SCSPEC see_typename - { if ($1 != ridpointers[(int)RID_VIRTUAL]) - cp_error ("`%D' access", $1); - $$ = access_default_virtual_node; } - | base_class_access_list VISSPEC see_typename - { - if ($1 != access_default_virtual_node) - error ("multiple access specifiers"); - else if ($2 == access_public_node) - $$ = access_public_virtual_node; - else if ($2 == access_protected_node) - $$ = access_protected_virtual_node; - else /* $2 == access_private_node */ - $$ = access_private_virtual_node; - } - | base_class_access_list SCSPEC see_typename - { if ($2 != ridpointers[(int)RID_VIRTUAL]) - cp_error ("`%D' access", $2); - else if ($$ == access_public_node) - $$ = access_public_virtual_node; - else if ($$ == access_protected_node) - $$ = access_protected_virtual_node; - else if ($$ == access_private_node) - $$ = access_private_virtual_node; - else - error ("multiple `virtual' specifiers"); - } - ; - -left_curly: - '{' - { $0 = begin_class_definition ($0); } - ; - -self_reference: - /* empty */ - { - finish_member_declaration (build_self_reference ()); - } - ; - -opt.component_decl_list: - self_reference - | self_reference component_decl_list - | opt.component_decl_list access_specifier component_decl_list - | opt.component_decl_list access_specifier - ; - -access_specifier: - VISSPEC ':' - { - if (current_aggr == signature_type_node) - { - error ("access specifier not allowed in signature"); - $1 = access_public_node; - } - - current_access_specifier = $1; - } - ; - -/* Note: we no longer warn about the semicolon after a component_decl_list. - ARM $9.2 says that the semicolon is optional, and therefore allowed. */ -component_decl_list: - component_decl - { - finish_member_declaration ($1); - } - | component_decl_list component_decl - { - finish_member_declaration ($2); - } - ; - -component_decl: - component_decl_1 ';' - | component_decl_1 '}' - { error ("missing ';' before right brace"); - yyungetc ('}', 0); } - /* C++: handle constructors, destructors and inline functions */ - /* note that INLINE is like a TYPESPEC */ - | fn.def2 ':' /* base_init compstmt */ - { $$ = finish_method ($$); } - | fn.def2 TRY /* base_init compstmt */ - { $$ = finish_method ($$); } - | fn.def2 RETURN /* base_init compstmt */ - { $$ = finish_method ($$); } - | fn.def2 '{' /* nodecls compstmt */ - { $$ = finish_method ($$); } - | ';' - { $$ = NULL_TREE; } - | extension component_decl - { $$ = $2; - pedantic = $1; } - | template_header component_decl - { - if ($2) - $$ = finish_member_template_decl ($2); - else - /* The component was already processed. */ - $$ = NULL_TREE; - - finish_template_decl ($1); - } - | template_header typed_declspecs ';' - { - $$ = finish_member_class_template ($2.t); - finish_template_decl ($1); - } - ; - -component_decl_1: - /* Do not add a "typed_declspecs declarator" rule here for - speed; we need to call grok_x_components for enums, so the - speedup would be insignificant. */ - typed_declspecs components - { - /* Most of the productions for component_decl only - allow the creation of one new member, so we call - finish_member_declaration in component_decl_list. - For this rule and the next, however, there can be - more than one member, e.g.: - - int i, j; - - and we need the first member to be fully - registered before the second is processed. - Therefore, the rules for components take care of - this processing. To avoid registering the - components more than once, we send NULL_TREE up - here; that lets finish_member_declaration now - that there is nothing to do. */ - if (!$2) - grok_x_components ($1.t); - $$ = NULL_TREE; - } - | declmods notype_components - { - if (!$2) - grok_x_components ($1); - $$ = NULL_TREE; - } - | notype_declarator maybeasm maybe_attribute maybe_init - { $$ = grokfield ($$, NULL_TREE, $4, $2, - build_tree_list ($3, NULL_TREE)); } - | constructor_declarator maybeasm maybe_attribute maybe_init - { $$ = grokfield ($$, NULL_TREE, $4, $2, - build_tree_list ($3, NULL_TREE)); } - | ':' expr_no_commas - { $$ = grokbitfield (NULL_TREE, NULL_TREE, $2); } - | error - { $$ = NULL_TREE; } - - /* These rules introduce a reduce/reduce conflict; in - typedef int foo, bar; - class A { - foo (bar); - }; - should "A::foo" be declared as a function or "A::bar" as a data - member? In other words, is "bar" an after_type_declarator or a - parmlist? */ - | declmods component_constructor_declarator maybeasm maybe_attribute maybe_init - { tree specs, attrs; - split_specs_attrs ($1, &specs, &attrs); - $$ = grokfield ($2, specs, $5, $3, - build_tree_list ($4, attrs)); } - | component_constructor_declarator maybeasm maybe_attribute maybe_init - { $$ = grokfield ($$, NULL_TREE, $4, $2, - build_tree_list ($3, NULL_TREE)); } - | using_decl - { $$ = do_class_using_decl ($1); } - -/* The case of exactly one component is handled directly by component_decl. */ -/* ??? Huh? ^^^ */ -components: - /* empty: possibly anonymous */ - { $$ = 0; } - | component_declarator0 - { - if (PROCESSING_REAL_TEMPLATE_DECL_P ()) - $1 = finish_member_template_decl ($1); - finish_member_declaration ($1); - $$ = 1; - } - | components ',' component_declarator - { - check_multiple_declarators (); - if (PROCESSING_REAL_TEMPLATE_DECL_P ()) - $3 = finish_member_template_decl ($3); - finish_member_declaration ($3); - $$ = 2; - } - ; - -notype_components: - /* empty: possibly anonymous */ - { $$ = 0; } - | notype_component_declarator0 - { - if (PROCESSING_REAL_TEMPLATE_DECL_P ()) - $1 = finish_member_template_decl ($1); - finish_member_declaration ($1); - $$ = 1; - } - | notype_components ',' notype_component_declarator - { - check_multiple_declarators (); - if (PROCESSING_REAL_TEMPLATE_DECL_P ()) - $3 = finish_member_template_decl ($3); - finish_member_declaration ($3); - $$ = 2; - } - ; - -component_declarator0: - after_type_component_declarator0 - | notype_component_declarator0 - ; - -component_declarator: - after_type_component_declarator - | notype_component_declarator - ; - -after_type_component_declarator0: - after_type_declarator maybeasm maybe_attribute maybe_init - { split_specs_attrs ($0, ¤t_declspecs, - &prefix_attributes); - $0 = current_declspecs; - $$ = grokfield ($$, current_declspecs, $4, $2, - build_tree_list ($3, prefix_attributes)); } - | TYPENAME ':' expr_no_commas maybe_attribute - { split_specs_attrs ($0, ¤t_declspecs, - &prefix_attributes); - $0 = current_declspecs; - $$ = grokbitfield ($$, current_declspecs, $3); - cplus_decl_attributes ($$, $4, prefix_attributes); } - ; - -notype_component_declarator0: - notype_declarator maybeasm maybe_attribute maybe_init - { split_specs_attrs ($0, ¤t_declspecs, - &prefix_attributes); - $0 = current_declspecs; - $$ = grokfield ($$, current_declspecs, $4, $2, - build_tree_list ($3, prefix_attributes)); } - | constructor_declarator maybeasm maybe_attribute maybe_init - { split_specs_attrs ($0, ¤t_declspecs, - &prefix_attributes); - $0 = current_declspecs; - $$ = grokfield ($$, current_declspecs, $4, $2, - build_tree_list ($3, prefix_attributes)); } - | IDENTIFIER ':' expr_no_commas maybe_attribute - { split_specs_attrs ($0, ¤t_declspecs, - &prefix_attributes); - $0 = current_declspecs; - $$ = grokbitfield ($$, current_declspecs, $3); - cplus_decl_attributes ($$, $4, prefix_attributes); } - | ':' expr_no_commas maybe_attribute - { split_specs_attrs ($0, ¤t_declspecs, - &prefix_attributes); - $0 = current_declspecs; - $$ = grokbitfield (NULL_TREE, current_declspecs, $2); - cplus_decl_attributes ($$, $3, prefix_attributes); } - ; - -after_type_component_declarator: - after_type_declarator maybeasm maybe_attribute maybe_init - { $$ = grokfield ($$, current_declspecs, $4, $2, - build_tree_list ($3, prefix_attributes)); } - | TYPENAME ':' expr_no_commas maybe_attribute - { $$ = grokbitfield ($$, current_declspecs, $3); - cplus_decl_attributes ($$, $4, prefix_attributes); } - ; - -notype_component_declarator: - notype_declarator maybeasm maybe_attribute maybe_init - { $$ = grokfield ($$, current_declspecs, $4, $2, - build_tree_list ($3, prefix_attributes)); } - | IDENTIFIER ':' expr_no_commas maybe_attribute - { $$ = grokbitfield ($$, current_declspecs, $3); - cplus_decl_attributes ($$, $4, prefix_attributes); } - | ':' expr_no_commas maybe_attribute - { $$ = grokbitfield (NULL_TREE, current_declspecs, $2); - cplus_decl_attributes ($$, $3, prefix_attributes); } - ; - -/* We chain the enumerators in reverse order. - Because of the way enums are built, the order is - insignificant. Take advantage of this fact. */ - -enumlist: - enumerator - | enumlist ',' enumerator - { TREE_CHAIN ($3) = $$; $$ = $3; } - ; - -enumerator: - identifier - { $$ = build_enumerator ($$, NULL_TREE, current_enum_type); } - | identifier '=' expr_no_commas - { $$ = build_enumerator ($$, $3, current_enum_type); } - ; - -/* ANSI new-type-id (5.3.4) */ -new_type_id: - type_specifier_seq new_declarator - { $$.t = build_decl_list ($1.t, $2); - $$.new_type_flag = $1.new_type_flag; } - | type_specifier_seq %prec EMPTY - { $$.t = build_decl_list ($1.t, NULL_TREE); - $$.new_type_flag = $1.new_type_flag; } - /* GNU extension to allow arrays of arbitrary types with - non-constant dimension. For the use of begin_new_placement - here, see the comments in unary_expr above. */ - | '(' .begin_new_placement type_id .finish_new_placement - '[' expr ']' - { - if (pedantic) - pedwarn ("ANSI C++ forbids array dimensions with parenthesized type in new"); - $$.t = build_parse_node (ARRAY_REF, TREE_VALUE ($3.t), $6); - $$.t = build_decl_list (TREE_PURPOSE ($3.t), $$.t); - $$.new_type_flag = $3.new_type_flag; - } - ; - -cv_qualifiers: - /* empty */ %prec EMPTY - { $$ = NULL_TREE; } - | cv_qualifiers CV_QUALIFIER - { $$ = decl_tree_cons (NULL_TREE, $2, $$); } - ; - -nonempty_cv_qualifiers: - CV_QUALIFIER - { $$.t = IDENTIFIER_AS_LIST ($1); - $$.new_type_flag = 0; } - | nonempty_cv_qualifiers CV_QUALIFIER - { $$.t = decl_tree_cons (NULL_TREE, $2, $1.t); - $$.new_type_flag = $1.new_type_flag; } - ; - -/* These rules must follow the rules for function declarations - and component declarations. That way, longer rules are preferred. */ - -suspend_mom: - /* empty */ - { $$ = suspend_momentary (); } - -/* An expression which will not live on the momentary obstack. */ -nonmomentary_expr: - suspend_mom expr - { resume_momentary ((int) $1); $$ = $2; } - ; - -/* An expression which will not live on the momentary obstack. */ -maybe_parmlist: - suspend_mom '(' nonnull_exprlist ')' - { resume_momentary ((int) $1); $$ = $3; } - | suspend_mom '(' parmlist ')' - { resume_momentary ((int) $1); $$ = $3; } - | suspend_mom LEFT_RIGHT - { resume_momentary ((int) $1); $$ = empty_parms (); } - | suspend_mom '(' error ')' - { resume_momentary ((int) $1); $$ = NULL_TREE; } - ; - -/* A declarator that is allowed only after an explicit typespec. */ -/* may all be followed by prec '.' */ -after_type_declarator: - '*' nonempty_cv_qualifiers after_type_declarator %prec UNARY - { $$ = make_pointer_declarator ($2.t, $3); } - | '&' nonempty_cv_qualifiers after_type_declarator %prec UNARY - { $$ = make_reference_declarator ($2.t, $3); } - | '*' after_type_declarator %prec UNARY - { $$ = make_pointer_declarator (NULL_TREE, $2); } - | '&' after_type_declarator %prec UNARY - { $$ = make_reference_declarator (NULL_TREE, $2); } - | ptr_to_mem cv_qualifiers after_type_declarator - { tree arg = make_pointer_declarator ($2, $3); - $$ = build_parse_node (SCOPE_REF, $1, arg); - } - | direct_after_type_declarator - ; - -nonnested_type: - type_name %prec EMPTY - { - if (TREE_CODE ($1) == IDENTIFIER_NODE) - { - $$ = lookup_name ($1, 1); - if (current_class_type - && TYPE_BEING_DEFINED (current_class_type) - && ! IDENTIFIER_CLASS_VALUE ($1)) - { - /* Remember that this name has been used in the class - definition, as per [class.scope0] */ - pushdecl_class_level ($$); - } - } - else - $$ = $1; - } - | global_scope type_name - { - if (TREE_CODE ($2) == IDENTIFIER_NODE) - $$ = IDENTIFIER_GLOBAL_VALUE ($2); - else - $$ = $2; - got_scope = NULL_TREE; - } - ; - -complete_type_name: - nonnested_type - | nested_type - | global_scope nested_type - { $$ = $2; } - ; - -nested_type: - nested_name_specifier type_name %prec EMPTY - { $$ = get_type_decl ($2); } - ; - -direct_after_type_declarator: - direct_after_type_declarator maybe_parmlist cv_qualifiers exception_specification_opt %prec '.' - { $$ = make_call_declarator ($$, $2, $3, $4); } - | direct_after_type_declarator '[' nonmomentary_expr ']' - { $$ = build_parse_node (ARRAY_REF, $$, $3); } - | direct_after_type_declarator '[' ']' - { $$ = build_parse_node (ARRAY_REF, $$, NULL_TREE); } - | '(' after_type_declarator ')' - { $$ = $2; } - | nested_name_specifier type_name %prec EMPTY - { push_nested_class ($1, 3); - $$ = build_parse_node (SCOPE_REF, $$, $2); - TREE_COMPLEXITY ($$) = current_class_depth; } - | type_name %prec EMPTY - ; - -/* A declarator allowed whether or not there has been - an explicit typespec. These cannot redeclare a typedef-name. */ - -notype_declarator_intern: - notype_declarator - | attributes notype_declarator - { - /* Provide support for '(' attributes '*' declarator ')' - etc */ - $$ = decl_tree_cons ($1, $2, NULL_TREE); - } - ; - -notype_declarator: - '*' nonempty_cv_qualifiers notype_declarator_intern %prec UNARY - { $$ = make_pointer_declarator ($2.t, $3); } - | '&' nonempty_cv_qualifiers notype_declarator_intern %prec UNARY - { $$ = make_reference_declarator ($2.t, $3); } - | '*' notype_declarator_intern %prec UNARY - { $$ = make_pointer_declarator (NULL_TREE, $2); } - | '&' notype_declarator_intern %prec UNARY - { $$ = make_reference_declarator (NULL_TREE, $2); } - | ptr_to_mem cv_qualifiers notype_declarator_intern - { tree arg = make_pointer_declarator ($2, $3); - $$ = build_parse_node (SCOPE_REF, $1, arg); - } - | direct_notype_declarator - ; - -complex_notype_declarator: - '*' nonempty_cv_qualifiers notype_declarator_intern %prec UNARY - { $$ = make_pointer_declarator ($2.t, $3); } - | '&' nonempty_cv_qualifiers notype_declarator_intern %prec UNARY - { $$ = make_reference_declarator ($2.t, $3); } - | '*' complex_notype_declarator %prec UNARY - { $$ = make_pointer_declarator (NULL_TREE, $2); } - | '&' complex_notype_declarator %prec UNARY - { $$ = make_reference_declarator (NULL_TREE, $2); } - | ptr_to_mem cv_qualifiers notype_declarator_intern - { tree arg = make_pointer_declarator ($2, $3); - $$ = build_parse_node (SCOPE_REF, $1, arg); - } - | complex_direct_notype_declarator - ; - -complex_direct_notype_declarator: - direct_notype_declarator maybe_parmlist cv_qualifiers exception_specification_opt %prec '.' - { $$ = make_call_declarator ($$, $2, $3, $4); } - | '(' complex_notype_declarator ')' - { $$ = $2; } - | direct_notype_declarator '[' nonmomentary_expr ']' - { $$ = build_parse_node (ARRAY_REF, $$, $3); } - | direct_notype_declarator '[' ']' - { $$ = build_parse_node (ARRAY_REF, $$, NULL_TREE); } - | notype_qualified_id - { enter_scope_of ($1); } - | nested_name_specifier notype_template_declarator - { got_scope = NULL_TREE; - $$ = build_parse_node (SCOPE_REF, $1, $2); - enter_scope_of ($$); - } - ; - -qualified_id: - nested_name_specifier unqualified_id - { got_scope = NULL_TREE; - $$ = build_parse_node (SCOPE_REF, $$, $2); } - | nested_name_specifier object_template_id - { got_scope = NULL_TREE; - $$ = build_parse_node (SCOPE_REF, $1, $2); } - ; - -notype_qualified_id: - nested_name_specifier notype_unqualified_id - { got_scope = NULL_TREE; - $$ = build_parse_node (SCOPE_REF, $$, $2); } - | nested_name_specifier object_template_id - { got_scope = NULL_TREE; - $$ = build_parse_node (SCOPE_REF, $1, $2); } - ; - -overqualified_id: - notype_qualified_id - | global_scope notype_qualified_id - { $$ = $2; } - ; - -functional_cast: - typespec '(' nonnull_exprlist ')' - { $$ = build_functional_cast ($1.t, $3); } - | typespec '(' expr_or_declarator_intern ')' - { $$ = reparse_decl_as_expr ($1.t, $3); } - | typespec fcast_or_absdcl %prec EMPTY - { $$ = reparse_absdcl_as_expr ($1.t, $2); } - ; -type_name: - TYPENAME - | SELFNAME - | template_type %prec EMPTY - ; - -nested_name_specifier: - nested_name_specifier_1 - | nested_name_specifier nested_name_specifier_1 - { $$ = $2; } - | nested_name_specifier TEMPLATE explicit_template_type SCOPE - { got_scope = $$ = make_typename_type ($1, $3); } - ; - -/* Why the @#$%^& do type_name and notype_identifier need to be expanded - inline here?!? (jason) */ -nested_name_specifier_1: - TYPENAME SCOPE - { - if (TREE_CODE ($1) == IDENTIFIER_NODE) - { - $$ = lastiddecl; - /* Remember that this name has been used in the class - definition, as per [class.scope0] */ - if (current_class_type - && TYPE_BEING_DEFINED (current_class_type) - && ! IDENTIFIER_CLASS_VALUE ($1)) - pushdecl_class_level ($$); - } - got_scope = $$ = TYPE_MAIN_VARIANT (TREE_TYPE ($$)); - } - | SELFNAME SCOPE - { - if (TREE_CODE ($1) == IDENTIFIER_NODE) - $$ = lastiddecl; - got_scope = $$ = TREE_TYPE ($$); - } - | NSNAME SCOPE - { - if (TREE_CODE ($$) == IDENTIFIER_NODE) - $$ = lastiddecl; - got_scope = $$; - } - | template_type SCOPE - { got_scope = $$ = complete_type (TREE_TYPE ($1)); } -/* These break 'const i;' - | IDENTIFIER SCOPE - { - failed_scope: - cp_error ("`%D' is not an aggregate typedef", - lastiddecl ? lastiddecl : $$); - $$ = error_mark_node; - } - | PTYPENAME SCOPE - { goto failed_scope; } */ - ; - -typename_sub: - typename_sub0 - | global_scope typename_sub0 - { $$ = $2; } - ; - -typename_sub0: - typename_sub1 identifier %prec EMPTY - { - if (TREE_CODE_CLASS (TREE_CODE ($1)) == 't') - $$ = make_typename_type ($1, $2); - else if (TREE_CODE ($2) == IDENTIFIER_NODE) - cp_error ("`%T' is not a class or namespace", $2); - else - { - $$ = $2; - if (TREE_CODE ($$) == TYPE_DECL) - $$ = TREE_TYPE ($$); - } - } - | typename_sub1 template_type %prec EMPTY - { $$ = TREE_TYPE ($2); } - | typename_sub1 explicit_template_type %prec EMPTY - { $$ = make_typename_type ($1, $2); } - | typename_sub1 TEMPLATE explicit_template_type %prec EMPTY - { $$ = make_typename_type ($1, $3); } - ; - -typename_sub1: - typename_sub2 - { - if (TREE_CODE ($1) == IDENTIFIER_NODE) - cp_error ("`%T' is not a class or namespace", $1); - } - | typename_sub1 typename_sub2 - { - if (TREE_CODE_CLASS (TREE_CODE ($1)) == 't') - $$ = make_typename_type ($1, $2); - else if (TREE_CODE ($2) == IDENTIFIER_NODE) - cp_error ("`%T' is not a class or namespace", $2); - else - { - $$ = $2; - if (TREE_CODE ($$) == TYPE_DECL) - $$ = TREE_TYPE ($$); - } - } - | typename_sub1 explicit_template_type SCOPE - { got_scope = $$ = make_typename_type ($1, $2); } - | typename_sub1 TEMPLATE explicit_template_type SCOPE - { got_scope = $$ = make_typename_type ($1, $3); } - ; - -typename_sub2: - TYPENAME SCOPE - { - if (TREE_CODE ($1) != IDENTIFIER_NODE) - $1 = lastiddecl; - - /* Retrieve the type for the identifier, which might involve - some computation. */ - got_scope = $$ = complete_type (IDENTIFIER_TYPE_VALUE ($1)); - - if ($$ == error_mark_node) - cp_error ("`%T' is not a class or namespace", $1); - } - | SELFNAME SCOPE - { - if (TREE_CODE ($1) != IDENTIFIER_NODE) - $$ = lastiddecl; - got_scope = $$ = complete_type (TREE_TYPE ($$)); - } - | template_type SCOPE - { got_scope = $$ = complete_type (TREE_TYPE ($$)); } - | PTYPENAME SCOPE - | IDENTIFIER SCOPE - | NSNAME SCOPE - { - if (TREE_CODE ($$) == IDENTIFIER_NODE) - $$ = lastiddecl; - got_scope = $$; - } - ; - -explicit_template_type: - identifier '<' template_arg_list_opt template_close_bracket - { $$ = build_min_nt (TEMPLATE_ID_EXPR, $1, $3); } - ; - -complex_type_name: - global_scope type_name - { - if (TREE_CODE ($2) == IDENTIFIER_NODE) - $$ = IDENTIFIER_GLOBAL_VALUE ($2); - else - $$ = $2; - got_scope = NULL_TREE; - } - | nested_type - | global_scope nested_type - { $$ = $2; } - ; - -ptr_to_mem: - nested_name_specifier '*' - { got_scope = NULL_TREE; } - | global_scope nested_name_specifier '*' - { $$ = $2; got_scope = NULL_TREE; } - ; - -/* All uses of explicit global scope must go through this nonterminal so - that got_scope will be set before yylex is called to get the next token. */ -global_scope: - SCOPE - { got_scope = void_type_node; } - ; - -/* ANSI new-declarator (5.3.4) */ -new_declarator: - '*' cv_qualifiers new_declarator - { $$ = make_pointer_declarator ($2, $3); } - | '*' cv_qualifiers %prec EMPTY - { $$ = make_pointer_declarator ($2, NULL_TREE); } - | '&' cv_qualifiers new_declarator %prec EMPTY - { $$ = make_reference_declarator ($2, $3); } - | '&' cv_qualifiers %prec EMPTY - { $$ = make_reference_declarator ($2, NULL_TREE); } - | ptr_to_mem cv_qualifiers %prec EMPTY - { tree arg = make_pointer_declarator ($2, NULL_TREE); - $$ = build_parse_node (SCOPE_REF, $1, arg); - } - | ptr_to_mem cv_qualifiers new_declarator - { tree arg = make_pointer_declarator ($2, $3); - $$ = build_parse_node (SCOPE_REF, $1, arg); - } - | direct_new_declarator %prec EMPTY - ; - -/* ANSI direct-new-declarator (5.3.4) */ -direct_new_declarator: - '[' expr ']' - { $$ = build_parse_node (ARRAY_REF, NULL_TREE, $2); } - | direct_new_declarator '[' nonmomentary_expr ']' - { $$ = build_parse_node (ARRAY_REF, $$, $3); } - ; - -/* ANSI abstract-declarator (8.1) */ -absdcl: - '*' nonempty_cv_qualifiers absdcl - { $$ = make_pointer_declarator ($2.t, $3); } - | '*' absdcl - { $$ = make_pointer_declarator (NULL_TREE, $2); } - | '*' nonempty_cv_qualifiers %prec EMPTY - { $$ = make_pointer_declarator ($2.t, NULL_TREE); } - | '*' %prec EMPTY - { $$ = make_pointer_declarator (NULL_TREE, NULL_TREE); } - | '&' nonempty_cv_qualifiers absdcl - { $$ = make_reference_declarator ($2.t, $3); } - | '&' absdcl - { $$ = make_reference_declarator (NULL_TREE, $2); } - | '&' nonempty_cv_qualifiers %prec EMPTY - { $$ = make_reference_declarator ($2.t, NULL_TREE); } - | '&' %prec EMPTY - { $$ = make_reference_declarator (NULL_TREE, NULL_TREE); } - | ptr_to_mem cv_qualifiers %prec EMPTY - { tree arg = make_pointer_declarator ($2, NULL_TREE); - $$ = build_parse_node (SCOPE_REF, $1, arg); - } - | ptr_to_mem cv_qualifiers absdcl - { tree arg = make_pointer_declarator ($2, $3); - $$ = build_parse_node (SCOPE_REF, $1, arg); - } - | direct_abstract_declarator %prec EMPTY - ; - -/* ANSI direct-abstract-declarator (8.1) */ -direct_abstract_declarator: - '(' absdcl ')' - { $$ = $2; } - /* `(typedef)1' is `int'. */ - | PAREN_STAR_PAREN - | direct_abstract_declarator '(' parmlist ')' cv_qualifiers exception_specification_opt %prec '.' - { $$ = make_call_declarator ($$, $3, $5, $6); } - | direct_abstract_declarator LEFT_RIGHT cv_qualifiers exception_specification_opt %prec '.' - { $$ = make_call_declarator ($$, empty_parms (), $3, $4); } - | direct_abstract_declarator '[' nonmomentary_expr ']' %prec '.' - { $$ = build_parse_node (ARRAY_REF, $$, $3); } - | direct_abstract_declarator '[' ']' %prec '.' - { $$ = build_parse_node (ARRAY_REF, $$, NULL_TREE); } - | '(' complex_parmlist ')' cv_qualifiers exception_specification_opt %prec '.' - { $$ = make_call_declarator (NULL_TREE, $2, $4, $5); } - | regcast_or_absdcl cv_qualifiers exception_specification_opt %prec '.' - { set_quals_and_spec ($$, $2, $3); } - | fcast_or_absdcl cv_qualifiers exception_specification_opt %prec '.' - { set_quals_and_spec ($$, $2, $3); } - | '[' nonmomentary_expr ']' %prec '.' - { $$ = build_parse_node (ARRAY_REF, NULL_TREE, $2); } - | '[' ']' %prec '.' - { $$ = build_parse_node (ARRAY_REF, NULL_TREE, NULL_TREE); } - ; - -/* For C++, decls and stmts can be intermixed, so we don't need to - have a special rule that won't start parsing the stmt section - until we have a stmt that parses without errors. */ - -stmts: - stmt - | errstmt - | stmts stmt - | stmts errstmt - ; - -errstmt: - error ';' - ; - -/* Read zero or more forward-declarations for labels - that nested functions can jump to. */ -maybe_label_decls: - /* empty */ - | label_decls - { if (pedantic) - pedwarn ("ANSI C++ forbids label declarations"); } - ; - -label_decls: - label_decl - | label_decls label_decl - ; - -label_decl: - LABEL identifiers_or_typenames ';' - { tree link; - for (link = $2; link; link = TREE_CHAIN (link)) - { - tree label = shadow_label (TREE_VALUE (link)); - C_DECLARED_LABEL_FLAG (label) = 1; - declare_nonlocal_label (label); - } - } - ; - -/* This is the body of a function definition. - It causes syntax errors to ignore to the next openbrace. */ -compstmt_or_error: - compstmt - {} - | error compstmt - ; - -compstmt: - '{' - { $$ = begin_compound_stmt (0); } - compstmtend - { $$ = finish_compound_stmt (0, $2); } - ; - -simple_if: - IF - { - $$ = begin_if_stmt (); - cond_stmt_keyword = "if"; - } - paren_cond_or_null - { finish_if_stmt_cond ($3, $2); } - implicitly_scoped_stmt - { $$ = finish_then_clause ($2); } - ; - -implicitly_scoped_stmt: - compstmt - | { $$ = begin_compound_stmt (0); } - simple_stmt - { $$ = finish_compound_stmt (0, $1); } - ; - -stmt: - compstmt - {} - | simple_stmt - ; - -simple_stmt: - decl - { finish_stmt (); } - | expr ';' - { finish_expr_stmt ($1); } - | simple_if ELSE - { begin_else_clause (); } - implicitly_scoped_stmt - { - finish_else_clause ($1); - finish_if_stmt (); - } - | simple_if %prec IF - { finish_if_stmt (); } - | WHILE - { - $$ = begin_while_stmt (); - cond_stmt_keyword = "while"; - } - paren_cond_or_null - { finish_while_stmt_cond ($3, $2); } - already_scoped_stmt - { finish_while_stmt ($2); } - | DO - { $$ = begin_do_stmt (); } - implicitly_scoped_stmt WHILE - { - finish_do_body ($2); - cond_stmt_keyword = "do"; - } - paren_expr_or_null ';' - { finish_do_stmt ($6, $2); } - | FOR - { $$ = begin_for_stmt (); } - '(' for.init.statement - { finish_for_init_stmt ($2); } - xcond ';' - { finish_for_cond ($6, $2); } - xexpr ')' - { finish_for_expr ($9, $2); } - already_scoped_stmt - { finish_for_stmt ($9, $2); } - | SWITCH - { begin_switch_stmt (); } - '(' condition ')' - { $$ = finish_switch_cond ($4); } - implicitly_scoped_stmt - { finish_switch_stmt ($4, $6); } - | CASE expr_no_commas ':' - { finish_case_label ($2, NULL_TREE); } - stmt - | CASE expr_no_commas ELLIPSIS expr_no_commas ':' - { finish_case_label ($2, $4); } - stmt - | DEFAULT ':' - { finish_case_label (NULL_TREE, NULL_TREE); } - stmt - | BREAK ';' - { finish_break_stmt (); } - | CONTINUE ';' - { finish_continue_stmt (); } - | RETURN ';' - { finish_return_stmt (NULL_TREE); } - | RETURN expr ';' - { finish_return_stmt ($2); } - | asm_keyword maybe_cv_qualifier '(' string ')' ';' - { - finish_asm_stmt ($2, $4, NULL_TREE, NULL_TREE, - NULL_TREE); - } - /* This is the case with just output operands. */ - | asm_keyword maybe_cv_qualifier '(' string ':' asm_operands ')' ';' - { - finish_asm_stmt ($2, $4, $6, NULL_TREE, - NULL_TREE); - } - /* This is the case with input operands as well. */ - | asm_keyword maybe_cv_qualifier '(' string ':' asm_operands ':' asm_operands ')' ';' - { finish_asm_stmt ($2, $4, $6, $8, NULL_TREE); } - /* This is the case with clobbered registers as well. */ - | asm_keyword maybe_cv_qualifier '(' string ':' asm_operands ':' - asm_operands ':' asm_clobbers ')' ';' - { finish_asm_stmt ($2, $4, $6, $8, $10); } - | GOTO '*' expr ';' - { - if (pedantic) - pedwarn ("ANSI C++ forbids computed gotos"); - finish_goto_stmt ($3); - } - | GOTO identifier ';' - { finish_goto_stmt ($2); } - | label_colon stmt - { finish_stmt (); } - | label_colon '}' - { error ("label must be followed by statement"); - yyungetc ('}', 0); - finish_stmt (); } - | ';' - { finish_stmt (); } - | try_block - | using_directive - | namespace_using_decl - { do_local_using_decl ($1); } - | namespace_alias - ; - -function_try_block: - TRY - { - if (! current_function_parms_stored) - store_parm_decls (); - expand_start_early_try_stmts (); - } - ctor_initializer_opt compstmt - { - expand_start_all_catch (); - } - handler_seq - { - expand_end_all_catch (); - $$ = $3; - } - ; - -try_block: - TRY - { $$ = begin_try_block (); } - compstmt - { finish_try_block ($2); } - handler_seq - { finish_handler_sequence ($2); } - ; - -handler_seq: - handler - | handler_seq handler - ; - -handler: - CATCH - { $$ = begin_handler(); } - handler_args - { finish_handler_parms ($2); } - compstmt - { finish_handler ($2); } - ; - -type_specifier_seq: - typed_typespecs %prec EMPTY - | nonempty_cv_qualifiers %prec EMPTY - ; - -handler_args: - '(' ELLIPSIS ')' - { expand_start_catch_block (NULL_TREE, NULL_TREE); } - /* This doesn't allow reference parameters, the below does. - | '(' type_specifier_seq absdcl ')' - { check_for_new_type ("inside exception declarations", $2); - expand_start_catch_block ($2.t, $3); } - | '(' type_specifier_seq ')' - { check_for_new_type ("inside exception declarations", $2); - expand_start_catch_block ($2.t, NULL_TREE); } - | '(' type_specifier_seq notype_declarator ')' - { check_for_new_type ("inside exception declarations", $2); - expand_start_catch_block ($2.t, $3); } - | '(' typed_typespecs after_type_declarator ')' - { check_for_new_type ("inside exception declarations", $2); - expand_start_catch_block ($2.t, $3); } - This allows reference parameters... */ - | '(' parm ')' - { check_for_new_type ("inside exception declarations", $2); - expand_start_catch_block (TREE_PURPOSE ($2.t), - TREE_VALUE ($2.t)); } - ; - -label_colon: - IDENTIFIER ':' - { tree label; - do_label: - label = define_label (input_filename, lineno, $1); - if (label && ! minimal_parse_mode) - expand_label (label); - } - | PTYPENAME ':' - { goto do_label; } - | TYPENAME ':' - { goto do_label; } - | SELFNAME ':' - { goto do_label; } - ; - -for.init.statement: - xexpr ';' - { if ($1) cplus_expand_expr_stmt ($1); } - | decl - | '{' compstmtend - { if (pedantic) - pedwarn ("ANSI C++ forbids compound statements inside for initializations"); - } - ; - -/* Either a type-qualifier or nothing. First thing in an `asm' statement. */ - -maybe_cv_qualifier: - /* empty */ - { emit_line_note (input_filename, lineno); - $$ = NULL_TREE; } - | CV_QUALIFIER - { emit_line_note (input_filename, lineno); } - ; - -xexpr: - /* empty */ - { $$ = NULL_TREE; } - | expr - | error - { $$ = NULL_TREE; } - ; - -/* These are the operands other than the first string and colon - in asm ("addextend %2,%1": "=dm" (x), "0" (y), "g" (*x)) */ -asm_operands: - /* empty */ - { $$ = NULL_TREE; } - | nonnull_asm_operands - ; - -nonnull_asm_operands: - asm_operand - | nonnull_asm_operands ',' asm_operand - { $$ = chainon ($$, $3); } - ; - -asm_operand: - STRING '(' expr ')' - { $$ = build_tree_list ($$, $3); } - ; - -asm_clobbers: - STRING - { $$ = tree_cons (NULL_TREE, $$, NULL_TREE); } - | asm_clobbers ',' STRING - { $$ = tree_cons (NULL_TREE, $3, $$); } - ; - -/* This is what appears inside the parens in a function declarator. - Its value is represented in the format that grokdeclarator expects. - - In C++, declaring a function with no parameters - means that that function takes *no* parameters. */ - -parmlist: - /* empty */ - { - $$ = empty_parms(); - } - | complex_parmlist - | type_id - { $$ = finish_parmlist (build_tree_list (NULL_TREE, $1.t), 0); - check_for_new_type ("inside parameter list", $1); } - ; - -/* This nonterminal does not include the common sequence '(' type_id ')', - as it is ambiguous and must be disambiguated elsewhere. */ -complex_parmlist: - parms - { $$ = finish_parmlist ($$, 0); } - | parms_comma ELLIPSIS - { $$ = finish_parmlist ($1, 1); } - /* C++ allows an ellipsis without a separating ',' */ - | parms ELLIPSIS - { $$ = finish_parmlist ($1, 1); } - | type_id ELLIPSIS - { $$ = finish_parmlist (build_tree_list (NULL_TREE, - $1.t), 1); } - | ELLIPSIS - { $$ = finish_parmlist (NULL_TREE, 1); } - | parms ':' - { - /* This helps us recover from really nasty - parse errors, for example, a missing right - parenthesis. */ - yyerror ("possibly missing ')'"); - $$ = finish_parmlist ($1, 0); - yyungetc (':', 0); - yychar = ')'; - } - | type_id ':' - { - /* This helps us recover from really nasty - parse errors, for example, a missing right - parenthesis. */ - yyerror ("possibly missing ')'"); - $$ = finish_parmlist (build_tree_list (NULL_TREE, - $1.t), 0); - yyungetc (':', 0); - yychar = ')'; - } - ; - -/* A default argument to a */ -defarg: - '=' - { maybe_snarf_defarg (); } - defarg1 - { $$ = $3; } - ; - -defarg1: - DEFARG - | init - ; - -/* A nonempty list of parameter declarations or type names. */ -parms: - named_parm - { check_for_new_type ("in a parameter list", $1); - $$ = build_tree_list (NULL_TREE, $1.t); } - | parm defarg - { check_for_new_type ("in a parameter list", $1); - $$ = build_tree_list ($2, $1.t); } - | parms_comma full_parm - { check_for_new_type ("in a parameter list", $2); - $$ = chainon ($$, $2.t); } - | parms_comma bad_parm - { $$ = chainon ($$, build_tree_list (NULL_TREE, $2)); } - | parms_comma bad_parm '=' init - { $$ = chainon ($$, build_tree_list ($4, $2)); } - ; - -parms_comma: - parms ',' - | type_id ',' - { check_for_new_type ("in a parameter list", $1); - $$ = build_tree_list (NULL_TREE, $1.t); } - ; - -/* A single parameter declaration or parameter type name, - as found in a parmlist. */ -named_parm: - /* Here we expand typed_declspecs inline to avoid mis-parsing of - TYPESPEC IDENTIFIER. */ - typed_declspecs1 declarator - { tree specs = strip_attrs ($1.t); - $$.new_type_flag = $1.new_type_flag; - $$.t = build_tree_list (specs, $2); } - | typed_typespecs declarator - { $$.t = build_tree_list ($1.t, $2); - $$.new_type_flag = $1.new_type_flag; } - | typespec declarator - { $$.t = build_tree_list (get_decl_list ($1.t), $2); - $$.new_type_flag = $1.new_type_flag; } - | typed_declspecs1 absdcl - { tree specs = strip_attrs ($1.t); - $$.t = build_tree_list (specs, $2); - $$.new_type_flag = $1.new_type_flag; } - | typed_declspecs1 %prec EMPTY - { tree specs = strip_attrs ($1.t); - $$.t = build_tree_list (specs, NULL_TREE); - $$.new_type_flag = $1.new_type_flag; } - | declmods notype_declarator - { tree specs = strip_attrs ($1); - $$.t = build_tree_list (specs, $2); - $$.new_type_flag = 0; } - ; - -full_parm: - parm - { $$.t = build_tree_list (NULL_TREE, $1.t); - $$.new_type_flag = $1.new_type_flag; } - | parm defarg - { $$.t = build_tree_list ($2, $1.t); - $$.new_type_flag = $1.new_type_flag; } - ; - -parm: - named_parm - | type_id - ; - -see_typename: - /* empty */ %prec EMPTY - { see_typename (); } - ; - -bad_parm: - /* empty */ %prec EMPTY - { - error ("type specifier omitted for parameter"); - $$ = build_tree_list (integer_type_node, NULL_TREE); - } - | notype_declarator - { - error ("type specifier omitted for parameter"); - if (TREE_CODE ($$) == SCOPE_REF - && (TREE_CODE (TREE_OPERAND ($$, 0)) == TEMPLATE_TYPE_PARM - || TREE_CODE (TREE_OPERAND ($$, 0)) == TEMPLATE_TEMPLATE_PARM)) - cp_error (" perhaps you want `typename %E' to make it a type", $$); - $$ = build_tree_list (integer_type_node, $$); - } - ; - -exception_specification_opt: - /* empty */ %prec EMPTY - { $$ = NULL_TREE; } - | THROW '(' ansi_raise_identifiers ')' %prec EMPTY - { $$ = $3; } - | THROW LEFT_RIGHT %prec EMPTY - { $$ = build_decl_list (NULL_TREE, NULL_TREE); } - ; - -ansi_raise_identifier: - type_id - { $$ = build_decl_list (NULL_TREE, groktypename($1.t)); } - ; - -ansi_raise_identifiers: - ansi_raise_identifier - | ansi_raise_identifiers ',' ansi_raise_identifier - { - TREE_CHAIN ($3) = $$; - $$ = $3; - } - ; - -conversion_declarator: - /* empty */ %prec EMPTY - { $$ = NULL_TREE; } - | '*' cv_qualifiers conversion_declarator - { $$ = make_pointer_declarator ($2, $3); } - | '&' cv_qualifiers conversion_declarator - { $$ = make_reference_declarator ($2, $3); } - | ptr_to_mem cv_qualifiers conversion_declarator - { tree arg = make_pointer_declarator ($2, $3); - $$ = build_parse_node (SCOPE_REF, $1, arg); - } - ; - -operator: - OPERATOR - { got_scope = NULL_TREE; } - ; - -operator_name: - operator '*' - { $$ = ansi_opname[MULT_EXPR]; } - | operator '/' - { $$ = ansi_opname[TRUNC_DIV_EXPR]; } - | operator '%' - { $$ = ansi_opname[TRUNC_MOD_EXPR]; } - | operator '+' - { $$ = ansi_opname[PLUS_EXPR]; } - | operator '-' - { $$ = ansi_opname[MINUS_EXPR]; } - | operator '&' - { $$ = ansi_opname[BIT_AND_EXPR]; } - | operator '|' - { $$ = ansi_opname[BIT_IOR_EXPR]; } - | operator '^' - { $$ = ansi_opname[BIT_XOR_EXPR]; } - | operator '~' - { $$ = ansi_opname[BIT_NOT_EXPR]; } - | operator ',' - { $$ = ansi_opname[COMPOUND_EXPR]; } - | operator ARITHCOMPARE - { $$ = ansi_opname[$2]; } - | operator '<' - { $$ = ansi_opname[LT_EXPR]; } - | operator '>' - { $$ = ansi_opname[GT_EXPR]; } - | operator EQCOMPARE - { $$ = ansi_opname[$2]; } - | operator ASSIGN - { $$ = ansi_assopname[$2]; } - | operator '=' - { $$ = ansi_opname [MODIFY_EXPR]; } - | operator LSHIFT - { $$ = ansi_opname[$2]; } - | operator RSHIFT - { $$ = ansi_opname[$2]; } - | operator PLUSPLUS - { $$ = ansi_opname[POSTINCREMENT_EXPR]; } - | operator MINUSMINUS - { $$ = ansi_opname[PREDECREMENT_EXPR]; } - | operator ANDAND - { $$ = ansi_opname[TRUTH_ANDIF_EXPR]; } - | operator OROR - { $$ = ansi_opname[TRUTH_ORIF_EXPR]; } - | operator '!' - { $$ = ansi_opname[TRUTH_NOT_EXPR]; } - | operator '?' ':' - { $$ = ansi_opname[COND_EXPR]; } - | operator MIN_MAX - { $$ = ansi_opname[$2]; } - | operator POINTSAT %prec EMPTY - { $$ = ansi_opname[COMPONENT_REF]; } - | operator POINTSAT_STAR %prec EMPTY - { $$ = ansi_opname[MEMBER_REF]; } - | operator LEFT_RIGHT - { $$ = ansi_opname[CALL_EXPR]; } - | operator '[' ']' - { $$ = ansi_opname[ARRAY_REF]; } - | operator NEW %prec EMPTY - { $$ = ansi_opname[NEW_EXPR]; } - | operator DELETE %prec EMPTY - { $$ = ansi_opname[DELETE_EXPR]; } - | operator NEW '[' ']' - { $$ = ansi_opname[VEC_NEW_EXPR]; } - | operator DELETE '[' ']' - { $$ = ansi_opname[VEC_DELETE_EXPR]; } - /* Names here should be looked up in class scope ALSO. */ - | operator type_specifier_seq conversion_declarator - { $$ = grokoptypename ($2.t, $3); } - | operator error - { $$ = ansi_opname[ERROR_MARK]; } - ; - -%% - -#ifdef SPEW_DEBUG -const char * -debug_yytranslate (value) - int value; -{ - return yytname[YYTRANSLATE (value)]; -} - -#endif diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c deleted file mode 100755 index 712575c..0000000 --- a/gcc/cp/pt.c +++ /dev/null @@ -1,9074 +0,0 @@ -/* Handle parameterized types (templates) for GNU C++. - Copyright (C) 1992, 93-97, 1998, 1999 Free Software Foundation, Inc. - Written by Ken Raeburn (raeburn@cygnus.com) while at Watchmaker Computing. - Rewritten by Jason Merrill (jason@cygnus.com). - -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 -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -/* Known bugs or deficiencies include: - - all methods must be provided in header files; can't use a source - file that contains only the method templates and "just win". */ - -#include "config.h" -#include "system.h" -#include "obstack.h" - -#include "tree.h" -#include "flags.h" -#include "cp-tree.h" -#include "decl.h" -#include "parse.h" -#include "lex.h" -#include "output.h" -#include "defaults.h" -#include "except.h" -#include "toplev.h" - -/* The type of functions taking a tree, and some additional data, and - returning an int. */ -typedef int (*tree_fn_t) PROTO((tree, void*)); - -extern struct obstack permanent_obstack; - -extern int lineno; -extern char *input_filename; -struct pending_inline *pending_template_expansions; - -tree current_template_parms; -HOST_WIDE_INT processing_template_decl; - -tree pending_templates; -static tree *template_tail = &pending_templates; - -tree maybe_templates; -static tree *maybe_template_tail = &maybe_templates; - -int minimal_parse_mode; - -int processing_specialization; -int processing_explicit_instantiation; -int processing_template_parmlist; -static int template_header_count; - -static tree saved_trees; - -#define obstack_chunk_alloc xmalloc -#define obstack_chunk_free free - -#define UNIFY_ALLOW_NONE 0 -#define UNIFY_ALLOW_MORE_CV_QUAL 1 -#define UNIFY_ALLOW_LESS_CV_QUAL 2 -#define UNIFY_ALLOW_DERIVED 4 -#define UNIFY_ALLOW_INTEGER 8 - -static int unify PROTO((tree, tree, tree, tree, int, int*)); -static int resolve_overloaded_unification PROTO((tree, tree, tree, tree, - unification_kind_t, int, - int*)); -static int try_one_overload PROTO((tree, tree, tree, tree, tree, - unification_kind_t, int, int*)); -static int unify PROTO((tree, tree, tree, tree, int, int*)); -static void add_pending_template PROTO((tree)); -static int push_tinst_level PROTO((tree)); -static tree classtype_mangled_name PROTO((tree)); -static char *mangle_class_name_for_template PROTO((char *, tree, tree)); -static tree tsubst_expr_values PROTO((tree, tree)); -static int list_eq PROTO((tree, tree)); -static tree get_class_bindings PROTO((tree, tree, tree)); -static tree coerce_template_parms PROTO((tree, tree, tree, int, int)); -static void tsubst_enum PROTO((tree, tree, tree)); -static tree add_to_template_args PROTO((tree, tree)); -static tree add_outermost_template_args PROTO((tree, tree)); -static void maybe_adjust_types_for_deduction PROTO((unification_kind_t, tree*, - tree*)); -static int type_unification_real PROTO((tree, tree, tree, tree, - int, unification_kind_t, int, int*)); -static void note_template_header PROTO((int)); -static tree maybe_fold_nontype_arg PROTO((tree)); -static tree convert_nontype_argument PROTO((tree, tree)); -static tree convert_template_argument PROTO ((tree, tree, tree, int, - int , tree)); -static tree get_bindings_overload PROTO((tree, tree, tree)); -static int for_each_template_parm PROTO((tree, tree_fn_t, void*)); -static tree build_template_parm_index PROTO((int, int, int, tree, tree)); -static int inline_needs_template_parms PROTO((tree)); -static void push_inline_template_parms_recursive PROTO((tree, int)); -static tree retrieve_specialization PROTO((tree, tree)); -static tree register_specialization PROTO((tree, tree, tree)); -static int unregister_specialization PROTO((tree, tree)); -static tree reduce_template_parm_level PROTO((tree, tree, int)); -static tree build_template_decl PROTO((tree, tree)); -static int mark_template_parm PROTO((tree, void *)); -static tree tsubst_friend_function PROTO((tree, tree)); -static tree tsubst_friend_class PROTO((tree, tree)); -static tree get_bindings_real PROTO((tree, tree, tree, int)); -static int template_decl_level PROTO((tree)); -static tree maybe_get_template_decl_from_type_decl PROTO((tree)); -static int check_cv_quals_for_unify PROTO((int, tree, tree)); -static tree tsubst_template_arg_vector PROTO((tree, tree)); -static tree tsubst_template_parms PROTO((tree, tree)); -static void regenerate_decl_from_template PROTO((tree, tree)); -static tree most_specialized PROTO((tree, tree, tree)); -static tree most_specialized_class PROTO((tree, tree)); -static tree most_general_template PROTO((tree)); -static void set_mangled_name_for_template_decl PROTO((tree)); -static int template_class_depth_real PROTO((tree, int)); -static tree tsubst_aggr_type PROTO((tree, tree, tree, int)); -static tree tsubst_decl PROTO((tree, tree, tree, tree)); -static tree tsubst_arg_types PROTO((tree, tree, tree)); -static void check_specialization_scope PROTO((void)); -static tree process_partial_specialization PROTO((tree)); -static void set_current_access_from_decl PROTO((tree)); -static void check_default_tmpl_args PROTO((tree, tree, int, int)); -static tree tsubst_call_declarator_parms PROTO((tree, tree, tree)); - -/* We use TREE_VECs to hold template arguments. If there is only one - level of template arguments, then the TREE_VEC contains the - arguments directly. If there is more than one level of template - arguments, then each entry in the TREE_VEC is itself a TREE_VEC, - containing the template arguments for a single level. The first - entry in the outer TREE_VEC is the outermost level of template - parameters; the last is the innermost. - - It is incorrect to ever form a template argument vector containing - only one level of arguments, but which is a TREE_VEC containing as - its only entry the TREE_VEC for that level. */ - -/* Non-zero if the template arguments is actually a vector of vectors, - rather than just a vector. */ -#define TMPL_ARGS_HAVE_MULTIPLE_LEVELS(NODE) \ - (NODE != NULL_TREE \ - && TREE_CODE (NODE) == TREE_VEC \ - && TREE_VEC_LENGTH (NODE) > 0 \ - && TREE_VEC_ELT (NODE, 0) != NULL_TREE \ - && TREE_CODE (TREE_VEC_ELT (NODE, 0)) == TREE_VEC) - -/* The depth of a template argument vector. When called directly by - the parser, we use a TREE_LIST rather than a TREE_VEC to represent - template arguments. In fact, we may even see NULL_TREE if there - are no template arguments. In both of those cases, there is only - one level of template arguments. */ -#define TMPL_ARGS_DEPTH(NODE) \ - (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (NODE) ? TREE_VEC_LENGTH (NODE) : 1) - -/* The LEVELth level of the template ARGS. Note that template - parameter levels are indexed from 1, not from 0. */ -#define TMPL_ARGS_LEVEL(ARGS, LEVEL) \ - (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (ARGS) \ - ? TREE_VEC_ELT ((ARGS), (LEVEL) - 1) : ARGS) - -/* Set the LEVELth level of the template ARGS to VAL. This macro does - not work with single-level argument vectors. */ -#define SET_TMPL_ARGS_LEVEL(ARGS, LEVEL, VAL) \ - (TREE_VEC_ELT ((ARGS), (LEVEL) - 1) = (VAL)) - -/* Accesses the IDXth parameter in the LEVELth level of the ARGS. */ -#define TMPL_ARG(ARGS, LEVEL, IDX) \ - (TREE_VEC_ELT (TMPL_ARGS_LEVEL (ARGS, LEVEL), IDX)) - -/* Set the IDXth element in the LEVELth level of ARGS to VAL. This - macro does not work with single-level argument vectors. */ -#define SET_TMPL_ARG(ARGS, LEVEL, IDX, VAL) \ - (TREE_VEC_ELT (TREE_VEC_ELT ((ARGS), (LEVEL) - 1), (IDX)) = (VAL)) - -/* Given a single level of template arguments in NODE, return the - number of arguments. */ -#define NUM_TMPL_ARGS(NODE) \ - ((NODE) == NULL_TREE ? 0 \ - : (TREE_CODE (NODE) == TREE_VEC \ - ? TREE_VEC_LENGTH (NODE) : list_length (NODE))) - -/* The number of levels of template parameters given by NODE. */ -#define TMPL_PARMS_DEPTH(NODE) \ - (TREE_INT_CST_HIGH (TREE_PURPOSE (NODE))) - -/* Do any processing required when DECL (a member template declaration - using TEMPLATE_PARAMETERS as its innermost parameter list) is - finished. Returns the TEMPLATE_DECL corresponding to DECL, unless - it is a specialization, in which case the DECL itself is returned. */ - -tree -finish_member_template_decl (decl) - tree decl; -{ - if (decl == NULL_TREE || decl == void_type_node) - return NULL_TREE; - else if (decl == error_mark_node) - /* By returning NULL_TREE, the parser will just ignore this - declaration. We have already issued the error. */ - return NULL_TREE; - else if (TREE_CODE (decl) == TREE_LIST) - { - /* Assume that the class is the only declspec. */ - decl = TREE_VALUE (decl); - if (IS_AGGR_TYPE (decl) && CLASSTYPE_TEMPLATE_INFO (decl) - && ! CLASSTYPE_TEMPLATE_SPECIALIZATION (decl)) - { - tree tmpl = CLASSTYPE_TI_TEMPLATE (decl); - check_member_template (tmpl); - return tmpl; - } - return NULL_TREE; - } - else if (DECL_TEMPLATE_INFO (decl)) - { - if (!DECL_TEMPLATE_SPECIALIZATION (decl)) - { - check_member_template (DECL_TI_TEMPLATE (decl)); - return DECL_TI_TEMPLATE (decl); - } - else - return decl; - } - else - cp_error ("invalid member template declaration `%D'", decl); - - return error_mark_node; -} - -/* Returns the template nesting level of the indicated class TYPE. - - For example, in: - template - struct A - { - template - struct B {}; - }; - - A::B has depth two, while A has depth one. - Both A::B and A::B have depth one, if - COUNT_SPECIALIZATIONS is 0 or if they are instantiations, not - specializations. - - This function is guaranteed to return 0 if passed NULL_TREE so - that, for example, `template_class_depth (current_class_type)' is - always safe. */ - -static int -template_class_depth_real (type, count_specializations) - tree type; - int count_specializations; -{ - int depth; - - for (depth = 0; - type && TREE_CODE (type) != NAMESPACE_DECL; - type = (TREE_CODE (type) == FUNCTION_DECL) - ? DECL_REAL_CONTEXT (type) : TYPE_CONTEXT (type)) - { - if (TREE_CODE (type) != FUNCTION_DECL) - { - if (CLASSTYPE_TEMPLATE_INFO (type) - && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (type)) - && ((count_specializations - && CLASSTYPE_TEMPLATE_SPECIALIZATION (type)) - || uses_template_parms (CLASSTYPE_TI_ARGS (type)))) - ++depth; - } - else - { - if (DECL_TEMPLATE_INFO (type) - && PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (type)) - && ((count_specializations - && DECL_TEMPLATE_SPECIALIZATION (type)) - || uses_template_parms (DECL_TI_ARGS (type)))) - ++depth; - } - } - - return depth; -} - -/* Returns the template nesting level of the indicated class TYPE. - Like template_class_depth_real, but instantiations do not count in - the depth. */ - -int -template_class_depth (type) - tree type; -{ - return template_class_depth_real (type, /*count_specializations=*/0); -} - -/* Returns 1 if processing DECL as part of do_pending_inlines - needs us to push template parms. */ - -static int -inline_needs_template_parms (decl) - tree decl; -{ - if (! DECL_TEMPLATE_INFO (decl)) - return 0; - - return (TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (most_general_template (decl))) - > (processing_template_decl + DECL_TEMPLATE_SPECIALIZATION (decl))); -} - -/* Subroutine of maybe_begin_member_template_processing. - Push the template parms in PARMS, starting from LEVELS steps into the - chain, and ending at the beginning, since template parms are listed - innermost first. */ - -static void -push_inline_template_parms_recursive (parmlist, levels) - tree parmlist; - int levels; -{ - tree parms = TREE_VALUE (parmlist); - int i; - - if (levels > 1) - push_inline_template_parms_recursive (TREE_CHAIN (parmlist), levels - 1); - - ++processing_template_decl; - current_template_parms - = tree_cons (build_int_2 (0, processing_template_decl), - parms, current_template_parms); - TEMPLATE_PARMS_FOR_INLINE (current_template_parms) = 1; - - pushlevel (0); - for (i = 0; i < TREE_VEC_LENGTH (parms); ++i) - { - tree parm = TREE_VALUE (TREE_VEC_ELT (parms, i)); - my_friendly_assert (TREE_CODE_CLASS (TREE_CODE (parm)) == 'd', 0); - - switch (TREE_CODE (parm)) - { - case TYPE_DECL: - case TEMPLATE_DECL: - pushdecl (parm); - break; - - case PARM_DECL: - { - /* Make a CONST_DECL as is done in process_template_parm. - It is ugly that we recreate this here; the original - version built in process_template_parm is no longer - available. */ - tree decl = build_decl (CONST_DECL, DECL_NAME (parm), - TREE_TYPE (parm)); - SET_DECL_ARTIFICIAL (decl); - DECL_INITIAL (decl) = DECL_INITIAL (parm); - DECL_TEMPLATE_PARM_P (decl) = 1; - pushdecl (decl); - } - break; - - default: - my_friendly_abort (0); - } - } -} - -/* Restore the template parameter context for a member template or - a friend template defined in a class definition. */ - -void -maybe_begin_member_template_processing (decl) - tree decl; -{ - tree parms; - int levels; - - if (! inline_needs_template_parms (decl)) - return; - - parms = DECL_TEMPLATE_PARMS (most_general_template (decl)); - - levels = TMPL_PARMS_DEPTH (parms) - processing_template_decl; - - if (DECL_TEMPLATE_SPECIALIZATION (decl)) - { - --levels; - parms = TREE_CHAIN (parms); - } - - push_inline_template_parms_recursive (parms, levels); -} - -/* Undo the effects of begin_member_template_processing. */ - -void -maybe_end_member_template_processing () -{ - if (! processing_template_decl) - return; - - while (current_template_parms - && TEMPLATE_PARMS_FOR_INLINE (current_template_parms)) - { - --processing_template_decl; - current_template_parms = TREE_CHAIN (current_template_parms); - poplevel (0, 0, 0); - } -} - -/* Returns non-zero iff T is a member template function. We must be - careful as in - - template class C { void f(); } - - Here, f is a template function, and a member, but not a member - template. This function does not concern itself with the origin of - T, only its present state. So if we have - - template class C { template void f(U); } - - then neither C::f nor C::f is considered - to be a member template. But, `template void - C::f(U)' is considered a member template. */ - -int -is_member_template (t) - tree t; -{ - if (!DECL_FUNCTION_TEMPLATE_P (t)) - /* Anything that isn't a function or a template function is - certainly not a member template. */ - return 0; - - /* A local class can't have member templates. */ - if (hack_decl_function_context (t)) - return 0; - - return (DECL_FUNCTION_MEMBER_P (DECL_TEMPLATE_RESULT (t)) - /* If there are more levels of template parameters than - there are template classes surrounding the declaration, - then we have a member template. */ - && (TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (t)) > - template_class_depth (DECL_CLASS_CONTEXT (t)))); -} - -#if 0 /* UNUSED */ -/* Returns non-zero iff T is a member template class. See - is_member_template for a description of what precisely constitutes - a member template. */ - -int -is_member_template_class (t) - tree t; -{ - if (!DECL_CLASS_TEMPLATE_P (t)) - /* Anything that isn't a class template, is certainly not a member - template. */ - return 0; - - if (!DECL_CLASS_SCOPE_P (t)) - /* Anything whose context isn't a class type is surely not a - member template. */ - return 0; - - /* If there are more levels of template parameters than there are - template classes surrounding the declaration, then we have a - member template. */ - return (TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (t)) > - template_class_depth (DECL_CONTEXT (t))); -} -#endif - -/* Return a new template argument vector which contains all of ARGS, - but has as its innermost set of arguments the EXTRA_ARGS. The - resulting vector will be built on a temporary obstack, and so must - be explicitly copied to the permanent obstack, if required. */ - -static tree -add_to_template_args (args, extra_args) - tree args; - tree extra_args; -{ - tree new_args; - int extra_depth; - int i; - int j; - - extra_depth = TMPL_ARGS_DEPTH (extra_args); - new_args = make_temp_vec (TMPL_ARGS_DEPTH (args) + extra_depth); - - for (i = 1; i <= TMPL_ARGS_DEPTH (args); ++i) - SET_TMPL_ARGS_LEVEL (new_args, i, TMPL_ARGS_LEVEL (args, i)); - - for (j = 1; j <= extra_depth; ++j, ++i) - SET_TMPL_ARGS_LEVEL (new_args, i, TMPL_ARGS_LEVEL (extra_args, j)); - - return new_args; -} - -/* Like add_to_template_args, but only the outermost ARGS are added to - the EXTRA_ARGS. In particular, all but TMPL_ARGS_DEPTH - (EXTRA_ARGS) levels are added. This function is used to combine - the template arguments from a partial instantiation with the - template arguments used to attain the full instantiation from the - partial instantiation. */ - -static tree -add_outermost_template_args (args, extra_args) - tree args; - tree extra_args; -{ - tree new_args; - - /* If there are more levels of EXTRA_ARGS than there are ARGS, - something very fishy is going on. */ - my_friendly_assert (TMPL_ARGS_DEPTH (args) >= TMPL_ARGS_DEPTH (extra_args), - 0); - - /* If *all* the new arguments will be the EXTRA_ARGS, just return - them. */ - if (TMPL_ARGS_DEPTH (args) == TMPL_ARGS_DEPTH (extra_args)) - return extra_args; - - /* For the moment, we make ARGS look like it contains fewer levels. */ - TREE_VEC_LENGTH (args) -= TMPL_ARGS_DEPTH (extra_args); - - new_args = add_to_template_args (args, extra_args); - - /* Now, we restore ARGS to its full dimensions. */ - TREE_VEC_LENGTH (args) += TMPL_ARGS_DEPTH (extra_args); - - return new_args; -} - -/* We've got a template header coming up; push to a new level for storing - the parms. */ - -void -begin_template_parm_list () -{ - /* We use a non-tag-transparent scope here, which causes pushtag to - put tags in this scope, rather than in the enclosing class or - namespace scope. This is the right thing, since we want - TEMPLATE_DECLS, and not TYPE_DECLS for template classes. For a - global template class, push_template_decl handles putting the - TEMPLATE_DECL into top-level scope. For a nested template class, - e.g.: - - template struct S1 { - template struct S2 {}; - }; - - pushtag contains special code to call pushdecl_with_scope on the - TEMPLATE_DECL for S2. */ - pushlevel (0); - declare_pseudo_global_level (); - ++processing_template_decl; - ++processing_template_parmlist; - note_template_header (0); -} - -/* This routine is called when a specialization is declared. If it is - illegal to declare a specialization here, an error is reported. */ - -static void -check_specialization_scope () -{ - tree scope = current_scope (); - - /* [temp.expl.spec] - - An explicit specialization shall be declared in the namespace of - which the template is a member, or, for member templates, in the - namespace of which the enclosing class or enclosing class - template is a member. An explicit specialization of a member - function, member class or static data member of a class template - shall be declared in the namespace of which the class template - is a member. */ - if (scope && TREE_CODE (scope) != NAMESPACE_DECL) - cp_error ("explicit specialization in non-namespace scope `%D'", - scope); - - /* [temp.expl.spec] - - In an explicit specialization declaration for a member of a class - template or a member template that appears in namespace scope, - the member template and some of its enclosing class templates may - remain unspecialized, except that the declaration shall not - explicitly specialize a class member template if its enclosing - class templates are not explicitly specialized as well. */ - if (current_template_parms) - cp_error ("enclosing class templates are not explicitly specialized"); -} - -/* We've just seen template <>. */ - -void -begin_specialization () -{ - note_template_header (1); - check_specialization_scope (); -} - -/* Called at then end of processing a declaration preceeded by - template<>. */ - -void -end_specialization () -{ - reset_specialization (); -} - -/* Any template <>'s that we have seen thus far are not referring to a - function specialization. */ - -void -reset_specialization () -{ - processing_specialization = 0; - template_header_count = 0; -} - -/* We've just seen a template header. If SPECIALIZATION is non-zero, - it was of the form template <>. */ - -static void -note_template_header (specialization) - int specialization; -{ - processing_specialization = specialization; - template_header_count++; -} - -/* We're beginning an explicit instantiation. */ - -void -begin_explicit_instantiation () -{ - ++processing_explicit_instantiation; -} - - -void -end_explicit_instantiation () -{ - my_friendly_assert(processing_explicit_instantiation > 0, 0); - --processing_explicit_instantiation; -} - -/* The TYPE is being declared. If it is a template type, that means it - is a partial specialization. Do appropriate error-checking. */ - -void -maybe_process_partial_specialization (type) - tree type; -{ - if (IS_AGGR_TYPE (type) && CLASSTYPE_USE_TEMPLATE (type)) - { - if (CLASSTYPE_IMPLICIT_INSTANTIATION (type) - && TYPE_SIZE (type) == NULL_TREE) - { - SET_CLASSTYPE_TEMPLATE_SPECIALIZATION (type); - if (processing_template_decl) - push_template_decl (TYPE_MAIN_DECL (type)); - } - else if (CLASSTYPE_TEMPLATE_INSTANTIATION (type)) - cp_error ("specialization of `%T' after instantiation", type); - } -} - -/* Retrieve the specialization (in the sense of [temp.spec] - a - specialization is either an instantiation or an explicit - specialization) of TMPL for the given template ARGS. If there is - no such specialization, return NULL_TREE. The ARGS are a vector of - arguments, or a vector of vectors of arguments, in the case of - templates with more than one level of parameters. */ - -static tree -retrieve_specialization (tmpl, args) - tree tmpl; - tree args; -{ - tree s; - - my_friendly_assert (TREE_CODE (tmpl) == TEMPLATE_DECL, 0); - - /* There should be as many levels of arguments as there are - levels of parameters. */ - my_friendly_assert (TMPL_ARGS_DEPTH (args) - == TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (tmpl)), - 0); - - for (s = DECL_TEMPLATE_SPECIALIZATIONS (tmpl); - s != NULL_TREE; - s = TREE_CHAIN (s)) - if (comp_template_args (TREE_PURPOSE (s), args)) - return TREE_VALUE (s); - - return NULL_TREE; -} - -/* Returns non-zero iff DECL is a specialization of TMPL. */ - -int -is_specialization_of (decl, tmpl) - tree decl; - tree tmpl; -{ - tree t; - - if (TREE_CODE (decl) == FUNCTION_DECL) - { - for (t = decl; - t != NULL_TREE; - t = DECL_TEMPLATE_INFO (t) ? DECL_TI_TEMPLATE (t) : NULL_TREE) - if (t == tmpl) - return 1; - } - else - { - my_friendly_assert (TREE_CODE (decl) == TYPE_DECL, 0); - - for (t = TREE_TYPE (decl); - t != NULL_TREE; - t = CLASSTYPE_USE_TEMPLATE (t) - ? TREE_TYPE (CLASSTYPE_TI_TEMPLATE (t)) : NULL_TREE) - if (same_type_p (TYPE_MAIN_VARIANT (t), - TYPE_MAIN_VARIANT (TREE_TYPE (tmpl)))) - return 1; - } - - return 0; -} - -/* Register the specialization SPEC as a specialization of TMPL with - the indicated ARGS. Returns SPEC, or an equivalent prior - declaration, if available. */ - -static tree -register_specialization (spec, tmpl, args) - tree spec; - tree tmpl; - tree args; -{ - tree s; - - my_friendly_assert (TREE_CODE (tmpl) == TEMPLATE_DECL, 0); - - if (TREE_CODE (spec) == FUNCTION_DECL - && uses_template_parms (DECL_TI_ARGS (spec))) - /* This is the FUNCTION_DECL for a partial instantiation. Don't - register it; we want the corresponding TEMPLATE_DECL instead. - We use `uses_template_parms (DECL_TI_ARGS (spec))' rather than - the more obvious `uses_template_parms (spec)' to avoid problems - with default function arguments. In particular, given - something like this: - - template void f(T t1, T t = T()) - - the default argument expression is not substituted for in an - instantiation unless and until it is actually needed. */ - return spec; - - /* There should be as many levels of arguments as there are - levels of parameters. */ - my_friendly_assert (TMPL_ARGS_DEPTH (args) - == TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (tmpl)), - 0); - - for (s = DECL_TEMPLATE_SPECIALIZATIONS (tmpl); - s != NULL_TREE; - s = TREE_CHAIN (s)) - if (comp_template_args (TREE_PURPOSE (s), args)) - { - tree fn = TREE_VALUE (s); - - if (DECL_TEMPLATE_SPECIALIZATION (spec)) - { - if (DECL_TEMPLATE_INSTANTIATION (fn)) - { - if (TREE_USED (fn) - || DECL_EXPLICIT_INSTANTIATION (fn)) - { - cp_error ("specialization of %D after instantiation", - fn); - return spec; - } - else - { - /* This situation should occur only if the first - specialization is an implicit instantiation, - the second is an explicit specialization, and - the implicit instantiation has not yet been - used. That situation can occur if we have - implicitly instantiated a member function and - then specialized it later. - - We can also wind up here if a friend - declaration that looked like an instantiation - turns out to be a specialization: - - template void foo(T); - class S { friend void foo<>(int) }; - template <> void foo(int); - - We transform the existing DECL in place so that - any pointers to it become pointers to the - updated declaration. - - If there was a definition for the template, but - not for the specialization, we want this to - look as if there is no definition, and vice - versa. */ - DECL_INITIAL (fn) = NULL_TREE; - duplicate_decls (spec, fn); - - return fn; - } - } - else if (DECL_TEMPLATE_SPECIALIZATION (fn)) - { - duplicate_decls (spec, fn); - return fn; - } - } - } - - DECL_TEMPLATE_SPECIALIZATIONS (tmpl) - = perm_tree_cons (args, spec, DECL_TEMPLATE_SPECIALIZATIONS (tmpl)); - - return spec; -} - -/* Unregister the specialization SPEC as a specialization of TMPL. - Returns nonzero if the SPEC was listed as a specialization of - TMPL. */ - -static int -unregister_specialization (spec, tmpl) - tree spec; - tree tmpl; -{ - tree* s; - - for (s = &DECL_TEMPLATE_SPECIALIZATIONS (tmpl); - *s != NULL_TREE; - s = &TREE_CHAIN (*s)) - if (TREE_VALUE (*s) == spec) - { - *s = TREE_CHAIN (*s); - return 1; - } - - return 0; -} - -/* Print the list of candidate FNS in an error message. */ - -void -print_candidates (fns) - tree fns; -{ - tree fn; - - char* str = "candidates are:"; - - for (fn = fns; fn != NULL_TREE; fn = TREE_CHAIN (fn)) - { - cp_error_at ("%s %+#D", str, TREE_VALUE (fn)); - str = " "; - } -} - -/* Returns the template (one of the functions given by TEMPLATE_ID) - which can be specialized to match the indicated DECL with the - explicit template args given in TEMPLATE_ID. If - NEED_MEMBER_TEMPLATE is true the function is a specialization of a - member template. The template args (those explicitly specified and - those deduced) are output in a newly created vector *TARGS_OUT. If - it is impossible to determine the result, an error message is - issued, unless COMPLAIN is 0. The DECL may be NULL_TREE if none is - available. */ - -tree -determine_specialization (template_id, decl, targs_out, - need_member_template, - complain) - tree template_id; - tree decl; - tree* targs_out; - int need_member_template; - int complain; -{ - tree fns, targs_in; - tree templates = NULL_TREE; - tree fn; - - *targs_out = NULL_TREE; - - if (template_id == error_mark_node) - return error_mark_node; - - fns = TREE_OPERAND (template_id, 0); - targs_in = TREE_OPERAND (template_id, 1); - - if (fns == error_mark_node) - return error_mark_node; - - /* Check for baselinks. */ - if (TREE_CODE (fns) == TREE_LIST) - fns = TREE_VALUE (fns); - - for (; fns; fns = OVL_NEXT (fns)) - { - tree tmpl; - - fn = OVL_CURRENT (fns); - if (!need_member_template - && TREE_CODE (fn) == FUNCTION_DECL - && DECL_FUNCTION_MEMBER_P (fn) - && DECL_USE_TEMPLATE (fn) - && DECL_TI_TEMPLATE (fn)) - /* We can get here when processing something like: - template class X { void f(); } - template <> void X::f() {} - We're specializing a member function, but not a member - template. */ - tmpl = DECL_TI_TEMPLATE (fn); - else if (TREE_CODE (fn) != TEMPLATE_DECL - || (need_member_template && !is_member_template (fn))) - continue; - else - tmpl = fn; - - if (list_length (targs_in) > DECL_NTPARMS (tmpl)) - continue; - - if (decl == NULL_TREE) - { - /* Unify against ourselves to make sure that the args we have - make sense and there aren't any undeducible parms. It's OK if - not all the parms are specified; they might be deduced - later. */ - tree targs = get_bindings_overload (tmpl, DECL_RESULT (tmpl), - targs_in); - - if (targs) - /* Unification was successful. */ - templates = scratch_tree_cons (targs, tmpl, templates); - } - else - templates = scratch_tree_cons (NULL_TREE, tmpl, templates); - } - - if (decl != NULL_TREE) - { - tree tmpl = most_specialized (templates, decl, targs_in); - tree inner_args; - tree tmpl_args; - - if (tmpl == error_mark_node) - goto ambiguous; - else if (tmpl == NULL_TREE) - goto no_match; - - inner_args = get_bindings (tmpl, decl, targs_in); - tmpl_args = DECL_TI_ARGS (DECL_RESULT (tmpl)); - if (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (tmpl_args)) - { - *targs_out = copy_node (tmpl_args); - SET_TMPL_ARGS_LEVEL (*targs_out, - TMPL_ARGS_DEPTH (*targs_out), - inner_args); - } - else - *targs_out = inner_args; - - return tmpl; - } - - if (templates == NULL_TREE) - { - no_match: - if (complain) - { - cp_error_at ("template-id `%D' for `%+D' does not match any template declaration", - template_id, decl); - return error_mark_node; - } - return NULL_TREE; - } - else if (TREE_CHAIN (templates) != NULL_TREE - || uses_template_parms (TREE_PURPOSE (templates))) - { - ambiguous: - if (complain) - { - cp_error_at ("ambiguous template specialization `%D' for `%+D'", - template_id, decl); - print_candidates (templates); - return error_mark_node; - } - return NULL_TREE; - } - - /* We have one, and exactly one, match. */ - *targs_out = TREE_PURPOSE (templates); - return TREE_VALUE (templates); -} - -/* Check to see if the function just declared, as indicated in - DECLARATOR, and in DECL, is a specialization of a function - template. We may also discover that the declaration is an explicit - instantiation at this point. - - Returns DECL, or an equivalent declaration that should be used - instead. - - FLAGS is a bitmask consisting of the following flags: - - 2: The function has a definition. - 4: The function is a friend. - - The TEMPLATE_COUNT is the number of references to qualifying - template classes that appeared in the name of the function. For - example, in - - template struct S { void f(); }; - void S::f(); - - the TEMPLATE_COUNT would be 1. However, explicitly specialized - classes are not counted in the TEMPLATE_COUNT, so that in - - template struct S {}; - template <> struct S { void f(); } - template <> void S::f(); - - the TEMPLATE_COUNT would be 0. (Note that this declaration is - illegal; there should be no template <>.) - - If the function is a specialization, it is marked as such via - DECL_TEMPLATE_SPECIALIZATION. Furthermore, its DECL_TEMPLATE_INFO - is set up correctly, and it is added to the list of specializations - for that template. */ - -tree -check_explicit_specialization (declarator, decl, template_count, flags) - tree declarator; - tree decl; - int template_count; - int flags; -{ - int have_def = flags & 2; - int is_friend = flags & 4; - int specialization = 0; - int explicit_instantiation = 0; - int member_specialization = 0; - - tree ctype = DECL_CLASS_CONTEXT (decl); - tree dname = DECL_NAME (decl); - - if (processing_specialization) - { - /* The last template header was of the form template <>. */ - - if (template_header_count > template_count) - { - /* There were more template headers than qualifying template - classes. */ - if (template_header_count - template_count > 1) - /* There shouldn't be that many template parameter - lists. There can be at most one parameter list for - every qualifying class, plus one for the function - itself. */ - cp_error ("too many template parameter lists in declaration of `%D'", decl); - - SET_DECL_TEMPLATE_SPECIALIZATION (decl); - if (ctype) - member_specialization = 1; - else - specialization = 1; - } - else if (template_header_count == template_count) - { - /* The counts are equal. So, this might be a - specialization, but it is not a specialization of a - member template. It might be something like - - template struct S { - void f(int i); - }; - template <> - void S::f(int i) {} */ - specialization = 1; - SET_DECL_TEMPLATE_SPECIALIZATION (decl); - } - else - { - /* This cannot be an explicit specialization. There are not - enough headers for all of the qualifying classes. For - example, we might have: - - template <> - void S::T::f(); - - But, we're missing another template <>. */ - cp_error("too few template parameter lists in declaration of `%D'", decl); - return decl; - } - } - else if (processing_explicit_instantiation) - { - if (template_header_count) - cp_error ("template parameter list used in explicit instantiation"); - - if (have_def) - cp_error ("definition provided for explicit instantiation"); - - explicit_instantiation = 1; - } - else if (ctype != NULL_TREE - && !TYPE_BEING_DEFINED (ctype) - && CLASSTYPE_TEMPLATE_INSTANTIATION (ctype) - && !is_friend) - { - /* This case catches outdated code that looks like this: - - template struct S { void f(); }; - void S::f() {} // Missing template <> - - We disable this check when the type is being defined to - avoid complaining about default compiler-generated - constructors, destructors, and assignment operators. - Since the type is an instantiation, not a specialization, - these are the only functions that can be defined before - the class is complete. */ - - /* If they said - template void S::f() {} - that's bogus. */ - if (template_header_count) - { - cp_error ("template parameters specified in specialization"); - return decl; - } - - if (pedantic) - cp_pedwarn - ("explicit specialization not preceded by `template <>'"); - specialization = 1; - SET_DECL_TEMPLATE_SPECIALIZATION (decl); - } - else if (TREE_CODE (declarator) == TEMPLATE_ID_EXPR) - { - if (is_friend) - /* This could be something like: - - template void f(T); - class S { friend void f<>(int); } */ - specialization = 1; - else - { - /* This case handles bogus declarations like template <> - template void f(); */ - - cp_error ("template-id `%D' in declaration of primary template", - declarator); - return decl; - } - } - - if (specialization || member_specialization) - { - tree t = TYPE_ARG_TYPES (TREE_TYPE (decl)); - for (; t; t = TREE_CHAIN (t)) - if (TREE_PURPOSE (t)) - { - cp_pedwarn - ("default argument specified in explicit specialization"); - break; - } - if (current_lang_name == lang_name_c) - cp_error ("template specialization with C linkage"); - } - - if (specialization || member_specialization || explicit_instantiation) - { - tree gen_tmpl; - tree tmpl = NULL_TREE; - tree targs = NULL_TREE; - - /* Make sure that the declarator is a TEMPLATE_ID_EXPR. */ - if (TREE_CODE (declarator) != TEMPLATE_ID_EXPR) - { - tree fns; - - my_friendly_assert (TREE_CODE (declarator) == IDENTIFIER_NODE, - 0); - if (!ctype) - fns = IDENTIFIER_NAMESPACE_VALUE (dname); - else - fns = dname; - - declarator = - lookup_template_function (fns, NULL_TREE); - } - - if (declarator == error_mark_node) - return error_mark_node; - - if (TREE_CODE (TREE_OPERAND (declarator, 0)) == LOOKUP_EXPR) - { - /* A friend declaration. We can't do much, because we don't - know what this resolves to, yet. */ - my_friendly_assert (is_friend != 0, 0); - my_friendly_assert (!explicit_instantiation, 0); - SET_DECL_IMPLICIT_INSTANTIATION (decl); - return decl; - } - - if (ctype != NULL_TREE && TYPE_BEING_DEFINED (ctype)) - { - if (!explicit_instantiation) - /* A specialization in class scope. This is illegal, - but the error will already have been flagged by - check_specialization_scope. */ - return error_mark_node; - else - { - /* It's not legal to write an explicit instantiation in - class scope, e.g.: - - class C { template void f(); } - - This case is caught by the parser. However, on - something like: - - template class C { void f(); }; - - (which is illegal) we can get here. The error will be - issued later. */ - ; - } - - return decl; - } - else if (ctype != NULL_TREE - && (TREE_CODE (TREE_OPERAND (declarator, 0)) == - IDENTIFIER_NODE)) - { - /* Find the list of functions in ctype that have the same - name as the declared function. */ - tree name = TREE_OPERAND (declarator, 0); - tree fns; - - if (name == constructor_name (ctype) - || name == constructor_name_full (ctype)) - { - int is_constructor = DECL_CONSTRUCTOR_P (decl); - - if (is_constructor ? !TYPE_HAS_CONSTRUCTOR (ctype) - : !TYPE_HAS_DESTRUCTOR (ctype)) - { - /* From [temp.expl.spec]: - - If such an explicit specialization for the member - of a class template names an implicitly-declared - special member function (clause _special_), the - program is ill-formed. - - Similar language is found in [temp.explicit]. */ - cp_error ("specialization of implicitly-declared special member function"); - - return decl; - } - - name = is_constructor ? ctor_identifier : dtor_identifier; - } - - fns = lookup_fnfields (TYPE_BINFO (ctype), name, 1); - - if (fns == NULL_TREE) - { - cp_error ("no member function `%s' declared in `%T'", - IDENTIFIER_POINTER (name), - ctype); - return decl; - } - else - TREE_OPERAND (declarator, 0) = fns; - } - - /* Figure out what exactly is being specialized at this point. - Note that for an explicit instantiation, even one for a - member function, we cannot tell apriori whether the - instantiation is for a member template, or just a member - function of a template class. Even if a member template is - being instantiated, the member template arguments may be - elided if they can be deduced from the rest of the - declaration. */ - tmpl = determine_specialization (declarator, decl, - &targs, - member_specialization, - 1); - - if (tmpl && tmpl != error_mark_node) - { - gen_tmpl = most_general_template (tmpl); - - if (explicit_instantiation) - { - /* We don't set DECL_EXPLICIT_INSTANTIATION here; that - is done by do_decl_instantiation later. */ - decl = instantiate_template (tmpl, innermost_args (targs)); - return decl; - } - - /* If we though that the DECL was a member function, but it - turns out to be specializing a static member function, - make DECL a static member function as well. */ - if (DECL_STATIC_FUNCTION_P (tmpl) - && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl)) - { - revert_static_member_fn (&decl, 0, 0); - last_function_parms = TREE_CHAIN (last_function_parms); - } - - /* Set up the DECL_TEMPLATE_INFO for DECL. */ - DECL_TEMPLATE_INFO (decl) - = perm_tree_cons (tmpl, targs, NULL_TREE); - - /* Mangle the function name appropriately. Note that we do - not mangle specializations of non-template member - functions of template classes, e.g. with - - template struct S { void f(); } - - and given the specialization - - template <> void S::f() {} - - we do not mangle S::f() here. That's because it's - just an ordinary member function and doesn't need special - treatment. We do this here so that the ordinary, - non-template, name-mangling algorith will not be used - later. */ - if ((is_member_template (tmpl) || ctype == NULL_TREE) - && name_mangling_version >= 1) - set_mangled_name_for_template_decl (decl); - - if (is_friend && !have_def) - /* This is not really a declaration of a specialization. - It's just the name of an instantiation. But, it's not - a request for an instantiation, either. */ - SET_DECL_IMPLICIT_INSTANTIATION (decl); - - /* Register this specialization so that we can find it - again. */ - decl = register_specialization (decl, gen_tmpl, targs); - - return decl; - } - } - - return decl; -} - -/* TYPE is being declared. Verify that the use of template headers - and such is reasonable. Issue error messages if not. */ - -void -maybe_check_template_type (type) - tree type; -{ - if (template_header_count) - { - /* We are in the scope of some `template <...>' header. */ - - int context_depth - = template_class_depth_real (TYPE_CONTEXT (type), - /*count_specializations=*/1); - - if (template_header_count <= context_depth) - /* This is OK; the template headers are for the context. We - are actually too lenient here; like - check_explicit_specialization we should consider the number - of template types included in the actual declaration. For - example, - - template struct S { - template template - struct I {}; - }; - - is illegal, but: - - template struct S { - template struct I; - }; - - template template ::I {}; - - is not. */ - ; - else if (template_header_count > context_depth + 1) - /* There are two many template parameter lists. */ - cp_error ("too many template parameter lists in declaration of `%T'", type); - } -} - -/* Returns 1 iff PARMS1 and PARMS2 are identical sets of template - parameters. These are represented in the same format used for - DECL_TEMPLATE_PARMS. */ - -int comp_template_parms (parms1, parms2) - tree parms1; - tree parms2; -{ - tree p1; - tree p2; - - if (parms1 == parms2) - return 1; - - for (p1 = parms1, p2 = parms2; - p1 != NULL_TREE && p2 != NULL_TREE; - p1 = TREE_CHAIN (p1), p2 = TREE_CHAIN (p2)) - { - tree t1 = TREE_VALUE (p1); - tree t2 = TREE_VALUE (p2); - int i; - - my_friendly_assert (TREE_CODE (t1) == TREE_VEC, 0); - my_friendly_assert (TREE_CODE (t2) == TREE_VEC, 0); - - if (TREE_VEC_LENGTH (t1) != TREE_VEC_LENGTH (t2)) - return 0; - - for (i = 0; i < TREE_VEC_LENGTH (t2); ++i) - { - tree parm1 = TREE_VALUE (TREE_VEC_ELT (t1, i)); - tree parm2 = TREE_VALUE (TREE_VEC_ELT (t2, i)); - - if (TREE_CODE (parm1) != TREE_CODE (parm2)) - return 0; - - if (TREE_CODE (parm1) == TEMPLATE_TYPE_PARM) - continue; - else if (!same_type_p (TREE_TYPE (parm1), TREE_TYPE (parm2))) - return 0; - } - } - - if ((p1 != NULL_TREE) != (p2 != NULL_TREE)) - /* One set of parameters has more parameters lists than the - other. */ - return 0; - - return 1; -} - -/* Complain if DECL shadows a template parameter. - - [temp.local]: A template-parameter shall not be redeclared within its - scope (including nested scopes). */ - -void -check_template_shadow (decl) - tree decl; -{ - tree olddecl = IDENTIFIER_VALUE (DECL_NAME (decl)); - - if (current_template_parms && olddecl) - { - /* We check for decl != olddecl to avoid bogus errors for using a - name inside a class. We check TPFI to avoid duplicate errors for - inline member templates. */ - if (decl != olddecl && DECL_TEMPLATE_PARM_P (olddecl) - && ! TEMPLATE_PARMS_FOR_INLINE (current_template_parms)) - { - cp_error_at ("declaration of `%#D'", decl); - cp_error_at (" shadows template parm `%#D'", olddecl); - } - } -} - -/* Return a new TEMPLATE_PARM_INDEX with the indicated INDEX, LEVEL, - ORIG_LEVEL, DECL, and TYPE. */ - -static tree -build_template_parm_index (index, level, orig_level, decl, type) - int index; - int level; - int orig_level; - tree decl; - tree type; -{ - tree t = make_node (TEMPLATE_PARM_INDEX); - TEMPLATE_PARM_IDX (t) = index; - TEMPLATE_PARM_LEVEL (t) = level; - TEMPLATE_PARM_ORIG_LEVEL (t) = orig_level; - TEMPLATE_PARM_DECL (t) = decl; - TREE_TYPE (t) = type; - - return t; -} - -/* Return a TEMPLATE_PARM_INDEX, similar to INDEX, but whose - TEMPLATE_PARM_LEVEL has been decreased by LEVELS. If such a - TEMPLATE_PARM_INDEX already exists, it is returned; otherwise, a - new one is created. */ - -static tree -reduce_template_parm_level (index, type, levels) - tree index; - tree type; - int levels; -{ - if (TEMPLATE_PARM_DESCENDANTS (index) == NULL_TREE - || (TEMPLATE_PARM_LEVEL (TEMPLATE_PARM_DESCENDANTS (index)) - != TEMPLATE_PARM_LEVEL (index) - levels)) - { - tree decl - = build_decl (TREE_CODE (TEMPLATE_PARM_DECL (index)), - DECL_NAME (TEMPLATE_PARM_DECL (index)), - type); - tree t - = build_template_parm_index (TEMPLATE_PARM_IDX (index), - TEMPLATE_PARM_LEVEL (index) - levels, - TEMPLATE_PARM_ORIG_LEVEL (index), - decl, type); - TEMPLATE_PARM_DESCENDANTS (index) = t; - - /* Template template parameters need this. */ - DECL_TEMPLATE_PARMS (decl) - = DECL_TEMPLATE_PARMS (TEMPLATE_PARM_DECL (index)); - } - - return TEMPLATE_PARM_DESCENDANTS (index); -} - -/* Process information from new template parameter NEXT and append it to the - LIST being built. */ - -tree -process_template_parm (list, next) - tree list, next; -{ - tree parm; - tree decl = 0; - tree defval; - int is_type, idx; - - parm = next; - my_friendly_assert (TREE_CODE (parm) == TREE_LIST, 259); - defval = TREE_PURPOSE (parm); - parm = TREE_VALUE (parm); - is_type = TREE_PURPOSE (parm) == class_type_node; - - if (list) - { - tree p = TREE_VALUE (tree_last (list)); - - if (TREE_CODE (p) == TYPE_DECL) - idx = TEMPLATE_TYPE_IDX (TREE_TYPE (p)); - else if (TREE_CODE (p) == TEMPLATE_DECL) - idx = TEMPLATE_TYPE_IDX (TREE_TYPE (DECL_TEMPLATE_RESULT (p))); - else - idx = TEMPLATE_PARM_IDX (DECL_INITIAL (p)); - ++idx; - } - else - idx = 0; - - if (!is_type) - { - my_friendly_assert (TREE_CODE (TREE_PURPOSE (parm)) == TREE_LIST, 260); - /* is a const-param */ - parm = grokdeclarator (TREE_VALUE (parm), TREE_PURPOSE (parm), - PARM, 0, NULL_TREE); - - /* [temp.param] - - The top-level cv-qualifiers on the template-parameter are - ignored when determining its type. */ - TREE_TYPE (parm) = TYPE_MAIN_VARIANT (TREE_TYPE (parm)); - - /* A template parameter is not modifiable. */ - TREE_READONLY (parm) = 1; - if (IS_AGGR_TYPE (TREE_TYPE (parm)) - && TREE_CODE (TREE_TYPE (parm)) != TEMPLATE_TYPE_PARM - && TREE_CODE (TREE_TYPE (parm)) != TYPENAME_TYPE) - { - cp_error ("`%#T' is not a valid type for a template constant parameter", - TREE_TYPE (parm)); - if (DECL_NAME (parm) == NULL_TREE) - error (" a template type parameter must begin with `class' or `typename'"); - TREE_TYPE (parm) = void_type_node; - } - else if (pedantic - && (TREE_CODE (TREE_TYPE (parm)) == REAL_TYPE - || TREE_CODE (TREE_TYPE (parm)) == COMPLEX_TYPE)) - cp_pedwarn ("`%T' is not a valid type for a template constant parameter", - TREE_TYPE (parm)); - if (TREE_PERMANENT (parm) == 0) - { - parm = copy_node (parm); - TREE_PERMANENT (parm) = 1; - } - decl = build_decl (CONST_DECL, DECL_NAME (parm), TREE_TYPE (parm)); - DECL_INITIAL (parm) = DECL_INITIAL (decl) - = build_template_parm_index (idx, processing_template_decl, - processing_template_decl, - decl, TREE_TYPE (parm)); - } - else - { - tree t; - parm = TREE_VALUE (parm); - - if (parm && TREE_CODE (parm) == TEMPLATE_DECL) - { - t = make_lang_type (TEMPLATE_TEMPLATE_PARM); - /* This is for distinguishing between real templates and template - template parameters */ - TREE_TYPE (parm) = t; - TREE_TYPE (DECL_TEMPLATE_RESULT (parm)) = t; - decl = parm; - } - else - { - t = make_lang_type (TEMPLATE_TYPE_PARM); - /* parm is either IDENTIFIER_NODE or NULL_TREE */ - decl = build_decl (TYPE_DECL, parm, t); - } - - TYPE_NAME (t) = decl; - TYPE_STUB_DECL (t) = decl; - parm = decl; - TEMPLATE_TYPE_PARM_INDEX (t) - = build_template_parm_index (idx, processing_template_decl, - processing_template_decl, - decl, TREE_TYPE (parm)); - } - SET_DECL_ARTIFICIAL (decl); - DECL_TEMPLATE_PARM_P (decl) = 1; - pushdecl (decl); - parm = build_tree_list (defval, parm); - return chainon (list, parm); -} - -/* The end of a template parameter list has been reached. Process the - tree list into a parameter vector, converting each parameter into a more - useful form. Type parameters are saved as IDENTIFIER_NODEs, and others - as PARM_DECLs. */ - -tree -end_template_parm_list (parms) - tree parms; -{ - int nparms; - tree parm; - tree saved_parmlist = make_tree_vec (list_length (parms)); - - current_template_parms - = tree_cons (build_int_2 (0, processing_template_decl), - saved_parmlist, current_template_parms); - - for (parm = parms, nparms = 0; parm; parm = TREE_CHAIN (parm), nparms++) - TREE_VEC_ELT (saved_parmlist, nparms) = parm; - - --processing_template_parmlist; - - return saved_parmlist; -} - -/* end_template_decl is called after a template declaration is seen. */ - -void -end_template_decl () -{ - reset_specialization (); - - if (! processing_template_decl) - return; - - /* This matches the pushlevel in begin_template_parm_list. */ - poplevel (0, 0, 0); - - --processing_template_decl; - current_template_parms = TREE_CHAIN (current_template_parms); - (void) get_pending_sizes (); /* Why? */ -} - -/* Given a template argument vector containing the template PARMS. - The innermost PARMS are given first. */ - -tree -current_template_args () -{ - tree header; - tree args = NULL_TREE; - int length = TMPL_PARMS_DEPTH (current_template_parms); - int l = length; - - /* If there is only one level of template parameters, we do not - create a TREE_VEC of TREE_VECs. Instead, we return a single - TREE_VEC containing the arguments. */ - if (length > 1) - args = make_tree_vec (length); - - for (header = current_template_parms; header; header = TREE_CHAIN (header)) - { - tree a = copy_node (TREE_VALUE (header)); - int i; - - TREE_TYPE (a) = NULL_TREE; - for (i = TREE_VEC_LENGTH (a) - 1; i >= 0; --i) - { - tree t = TREE_VEC_ELT (a, i); - - /* T will be a list if we are called from within a - begin/end_template_parm_list pair, but a vector directly - if within a begin/end_member_template_processing pair. */ - if (TREE_CODE (t) == TREE_LIST) - { - t = TREE_VALUE (t); - - if (TREE_CODE (t) == TYPE_DECL - || TREE_CODE (t) == TEMPLATE_DECL) - t = TREE_TYPE (t); - else - t = DECL_INITIAL (t); - TREE_VEC_ELT (a, i) = t; - } - } - - if (length > 1) - TREE_VEC_ELT (args, --l) = a; - else - args = a; - } - - return args; -} - -/* Return a TEMPLATE_DECL corresponding to DECL, using the indicated - template PARMS. Used by push_template_decl below. */ - -static tree -build_template_decl (decl, parms) - tree decl; - tree parms; -{ - tree tmpl = build_lang_decl (TEMPLATE_DECL, DECL_NAME (decl), NULL_TREE); - DECL_TEMPLATE_PARMS (tmpl) = parms; - DECL_CONTEXT (tmpl) = DECL_CONTEXT (decl); - if (DECL_LANG_SPECIFIC (decl)) - { - DECL_CLASS_CONTEXT (tmpl) = DECL_CLASS_CONTEXT (decl); - DECL_STATIC_FUNCTION_P (tmpl) = - DECL_STATIC_FUNCTION_P (decl); - } - - return tmpl; -} - -struct template_parm_data -{ - /* The level of the template parameters we are currently - processing. */ - int level; - - /* The index of the specialization argument we are currently - processing. */ - int current_arg; - - /* An array whose size is the number of template parameters. The - elements are non-zero if the parameter has been used in any one - of the arguments processed so far. */ - int* parms; - - /* An array whose size is the number of template arguments. The - elements are non-zero if the argument makes use of template - parameters of this level. */ - int* arg_uses_template_parms; -}; - -/* Subroutine of push_template_decl used to see if each template - parameter in a partial specialization is used in the explicit - argument list. If T is of the LEVEL given in DATA (which is - treated as a template_parm_data*), then DATA->PARMS is marked - appropriately. */ - -static int -mark_template_parm (t, data) - tree t; - void* data; -{ - int level; - int idx; - struct template_parm_data* tpd = (struct template_parm_data*) data; - - if (TREE_CODE (t) == TEMPLATE_PARM_INDEX) - { - level = TEMPLATE_PARM_LEVEL (t); - idx = TEMPLATE_PARM_IDX (t); - } - else - { - level = TEMPLATE_TYPE_LEVEL (t); - idx = TEMPLATE_TYPE_IDX (t); - } - - if (level == tpd->level) - { - tpd->parms[idx] = 1; - tpd->arg_uses_template_parms[tpd->current_arg] = 1; - } - - /* Return zero so that for_each_template_parm will continue the - traversal of the tree; we want to mark *every* template parm. */ - return 0; -} - -/* Process the partial specialization DECL. */ - -static tree -process_partial_specialization (decl) - tree decl; -{ - tree type = TREE_TYPE (decl); - tree maintmpl = CLASSTYPE_TI_TEMPLATE (type); - tree specargs = CLASSTYPE_TI_ARGS (type); - tree inner_args = innermost_args (specargs); - tree inner_parms = INNERMOST_TEMPLATE_PARMS (current_template_parms); - tree main_inner_parms = DECL_INNERMOST_TEMPLATE_PARMS (maintmpl); - int nargs = TREE_VEC_LENGTH (inner_args); - int ntparms = TREE_VEC_LENGTH (inner_parms); - int i; - int did_error_intro = 0; - struct template_parm_data tpd; - struct template_parm_data tpd2; - - /* We check that each of the template parameters given in the - partial specialization is used in the argument list to the - specialization. For example: - - template struct S; - template struct S; - - The second declaration is OK because `T*' uses the template - parameter T, whereas - - template struct S; - - is no good. Even trickier is: - - template - struct S1 - { - template - struct S2; - template - struct S2; - }; - - The S2 declaration is actually illegal; it is a - full-specialization. Of course, - - template - struct S2; - - or some such would have been OK. */ - tpd.level = TMPL_PARMS_DEPTH (current_template_parms); - tpd.parms = alloca (sizeof (int) * ntparms); - bzero ((PTR) tpd.parms, sizeof (int) * ntparms); - - tpd.arg_uses_template_parms = alloca (sizeof (int) * nargs); - bzero ((PTR) tpd.arg_uses_template_parms, sizeof (int) * nargs); - for (i = 0; i < nargs; ++i) - { - tpd.current_arg = i; - for_each_template_parm (TREE_VEC_ELT (inner_args, i), - &mark_template_parm, - &tpd); - } - for (i = 0; i < ntparms; ++i) - if (tpd.parms[i] == 0) - { - /* One of the template parms was not used in the - specialization. */ - if (!did_error_intro) - { - cp_error ("template parameters not used in partial specialization:"); - did_error_intro = 1; - } - - cp_error (" `%D'", - TREE_VALUE (TREE_VEC_ELT (inner_parms, i))); - } - - /* [temp.class.spec] - - The argument list of the specialization shall not be identical to - the implicit argument list of the primary template. */ - if (comp_template_args (inner_args, - innermost_args (CLASSTYPE_TI_ARGS (TREE_TYPE - (maintmpl))))) - cp_error ("partial specialization `%T' does not specialize any template arguments", type); - - /* [temp.class.spec] - - A partially specialized non-type argument expression shall not - involve template parameters of the partial specialization except - when the argument expression is a simple identifier. - - The type of a template parameter corresponding to a specialized - non-type argument shall not be dependent on a parameter of the - specialization. */ - my_friendly_assert (nargs == DECL_NTPARMS (maintmpl), 0); - tpd2.parms = 0; - for (i = 0; i < nargs; ++i) - { - tree arg = TREE_VEC_ELT (inner_args, i); - if (/* These first two lines are the `non-type' bit. */ - TREE_CODE_CLASS (TREE_CODE (arg)) != 't' - && TREE_CODE (arg) != TEMPLATE_DECL - /* This next line is the `argument expression is not just a - simple identifier' condition and also the `specialized - non-type argument' bit. */ - && TREE_CODE (arg) != TEMPLATE_PARM_INDEX) - { - if (tpd.arg_uses_template_parms[i]) - cp_error ("template argument `%E' involves template parameter(s)", arg); - else - { - /* Look at the corresponding template parameter, - marking which template parameters its type depends - upon. */ - tree type = - TREE_TYPE (TREE_VALUE (TREE_VEC_ELT (main_inner_parms, - i))); - - if (!tpd2.parms) - { - /* We haven't yet initialized TPD2. Do so now. */ - tpd2.arg_uses_template_parms - = (int*) alloca (sizeof (int) * nargs); - /* The number of parameters here is the number in the - main template, which, as checked in the assertion - above, is NARGS. */ - tpd2.parms = (int*) alloca (sizeof (int) * nargs); - tpd2.level = - TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (maintmpl)); - } - - /* Mark the template parameters. But this time, we're - looking for the template parameters of the main - template, not in the specialization. */ - tpd2.current_arg = i; - tpd2.arg_uses_template_parms[i] = 0; - bzero ((PTR) tpd2.parms, sizeof (int) * nargs); - for_each_template_parm (type, - &mark_template_parm, - &tpd2); - - if (tpd2.arg_uses_template_parms [i]) - { - /* The type depended on some template parameters. - If they are fully specialized in the - specialization, that's OK. */ - int j; - for (j = 0; j < nargs; ++j) - if (tpd2.parms[j] != 0 - && tpd.arg_uses_template_parms [j]) - { - cp_error ("type `%T' of template argument `%E' depends on template parameter(s)", - type, - arg); - break; - } - } - } - } - } - - if (retrieve_specialization (maintmpl, specargs)) - /* We've already got this specialization. */ - return decl; - - DECL_TEMPLATE_SPECIALIZATIONS (maintmpl) = CLASSTYPE_TI_SPEC_INFO (type) - = perm_tree_cons (inner_args, inner_parms, - DECL_TEMPLATE_SPECIALIZATIONS (maintmpl)); - TREE_TYPE (DECL_TEMPLATE_SPECIALIZATIONS (maintmpl)) = type; - return decl; -} - -/* Check that a template declaration's use of default arguments is not - invalid. Here, PARMS are the template parameters. IS_PRIMARY is - non-zero if DECL is the thing declared by a primary template. - IS_PARTIAL is non-zero if DECL is a partial specialization. */ - -static void -check_default_tmpl_args (decl, parms, is_primary, is_partial) - tree decl; - tree parms; - int is_primary; - int is_partial; -{ - char* msg; - int last_level_to_check; - - /* [temp.param] - - A default template-argument shall not be specified in a - function template declaration or a function template definition, nor - in the template-parameter-list of the definition of a member of a - class template. */ - - if (current_class_type - && !TYPE_BEING_DEFINED (current_class_type) - && DECL_REAL_CONTEXT (decl) == current_class_type - && DECL_DEFINED_IN_CLASS_P (decl)) - /* We already checked these parameters when the template was - declared, so there's no need to do it again now. This is an - inline member function definition. */ - return; - - if (TREE_CODE (decl) != TYPE_DECL || is_partial || !is_primary) - /* For an ordinary class template, default template arguments are - allowed at the innermost level, e.g.: - template - struct S {}; - but, in a partial specialization, they're not allowed even - there, as we have in [temp.class.spec]: - - The template parameter list of a specialization shall not - contain default template argument values. - - So, for a partial specialization, or for a function template, - we look at all of them. */ - ; - else - /* But, for a primary class template that is not a partial - specialization we look at all template parameters except the - innermost ones. */ - parms = TREE_CHAIN (parms); - - /* Figure out what error message to issue. */ - if (TREE_CODE (decl) == FUNCTION_DECL) - msg = "default argument for template parameter in function template `%D'"; - else if (is_partial) - msg = "default argument in partial specialization `%D'"; - else - msg = "default argument for template parameter for class enclosing `%D'"; - - if (current_class_type && TYPE_BEING_DEFINED (current_class_type)) - /* If we're inside a class definition, there's no need to - examine the parameters to the class itself. On the one - hand, they will be checked when the class is defined, and, - on the other, default arguments are legal in things like: - template - struct S { template void f(U); }; - Here the default argument for `S' has no bearing on the - declaration of `f'. */ - last_level_to_check = template_class_depth (current_class_type) + 1; - else - /* Check everything. */ - last_level_to_check = 0; - - for (; parms && TMPL_PARMS_DEPTH (parms) >= last_level_to_check; - parms = TREE_CHAIN (parms)) - { - tree inner_parms = TREE_VALUE (parms); - int i, ntparms; - - ntparms = TREE_VEC_LENGTH (inner_parms); - for (i = 0; i < ntparms; ++i) - if (TREE_PURPOSE (TREE_VEC_ELT (inner_parms, i))) - { - if (msg) - { - cp_error (msg, decl); - msg = 0; - } - - /* Clear out the default argument so that we are not - confused later. */ - TREE_PURPOSE (TREE_VEC_ELT (inner_parms, i)) = NULL_TREE; - } - - /* At this point, if we're still interested in issuing messages, - they must apply to classes surrounding the object declared. */ - if (msg) - msg = "default argument for template parameter for class enclosing `%D'"; - } -} - -/* Creates a TEMPLATE_DECL for the indicated DECL using the template - parameters given by current_template_args, or reuses a - previously existing one, if appropriate. Returns the DECL, or an - equivalent one, if it is replaced via a call to duplicate_decls. - - If IS_FRIEND is non-zero, DECL is a friend declaration. */ - -tree -push_template_decl_real (decl, is_friend) - tree decl; - int is_friend; -{ - tree tmpl; - tree args; - tree info; - tree ctx; - int primary; - int is_partial; - - /* See if this is a partial specialization. */ - is_partial = (TREE_CODE (decl) == TYPE_DECL && DECL_ARTIFICIAL (decl) - && TREE_CODE (TREE_TYPE (decl)) != ENUMERAL_TYPE - && CLASSTYPE_TEMPLATE_SPECIALIZATION (TREE_TYPE (decl))); - - is_friend |= (TREE_CODE (decl) == FUNCTION_DECL && DECL_FRIEND_P (decl)); - - if (is_friend) - /* For a friend, we want the context of the friend function, not - the type of which it is a friend. */ - ctx = DECL_CONTEXT (decl); - else if (DECL_REAL_CONTEXT (decl) - && TREE_CODE (DECL_REAL_CONTEXT (decl)) != NAMESPACE_DECL) - /* In the case of a virtual function, we want the class in which - it is defined. */ - ctx = DECL_REAL_CONTEXT (decl); - else - /* Otherwise, if we're currently definining some class, the DECL - is assumed to be a member of the class. */ - ctx = current_class_type; - - if (ctx && TREE_CODE (ctx) == NAMESPACE_DECL) - ctx = NULL_TREE; - - if (!DECL_CONTEXT (decl)) - DECL_CONTEXT (decl) = FROB_CONTEXT (current_namespace); - - /* For determining whether this is a primary template or not, we're really - interested in the lexical context, not the true context. */ - if (is_friend) - info = current_class_type; - else - info = ctx; - - /* See if this is a primary template. */ - if (info && TREE_CODE (info) == FUNCTION_DECL) - primary = 0; - /* Note that template_class_depth returns 0 if given NULL_TREE, so - this next line works even when we are at global scope. */ - else if (processing_template_decl > template_class_depth (info)) - primary = 1; - else - primary = 0; - - if (primary) - { - if (current_lang_name == lang_name_c) - cp_error ("template with C linkage"); - if (TREE_CODE (decl) == TYPE_DECL && ANON_AGGRNAME_P (DECL_NAME (decl))) - cp_error ("template class without a name"); - if (TREE_CODE (decl) == TYPE_DECL - && TREE_CODE (TREE_TYPE (decl)) == ENUMERAL_TYPE) - cp_error ("template declaration of `%#T'", TREE_TYPE (decl)); - } - - /* Check to see that the rules regarding the use of default - arguments are not being violated. */ - check_default_tmpl_args (decl, current_template_parms, - primary, is_partial); - - if (is_partial) - return process_partial_specialization (decl); - - args = current_template_args (); - - if (!ctx - || TREE_CODE (ctx) == FUNCTION_DECL - || TYPE_BEING_DEFINED (ctx) - || (is_friend && !DECL_TEMPLATE_INFO (decl))) - { - if (DECL_LANG_SPECIFIC (decl) - && DECL_TEMPLATE_INFO (decl) - && DECL_TI_TEMPLATE (decl)) - tmpl = DECL_TI_TEMPLATE (decl); - else - { - tmpl = build_template_decl (decl, current_template_parms); - - if (DECL_LANG_SPECIFIC (decl) - && DECL_TEMPLATE_SPECIALIZATION (decl)) - { - /* A specialization of a member template of a template - class. */ - SET_DECL_TEMPLATE_SPECIALIZATION (tmpl); - DECL_TEMPLATE_INFO (tmpl) = DECL_TEMPLATE_INFO (decl); - DECL_TEMPLATE_INFO (decl) = NULL_TREE; - } - } - } - else - { - tree a, t, current, parms; - int i; - - if (CLASSTYPE_TEMPLATE_INSTANTIATION (ctx)) - cp_error ("must specialize `%#T' before defining member `%#D'", - ctx, decl); - if (TREE_CODE (decl) == TYPE_DECL) - { - if ((IS_AGGR_TYPE_CODE (TREE_CODE (TREE_TYPE (decl))) - || TREE_CODE (TREE_TYPE (decl)) == ENUMERAL_TYPE) - && TYPE_TEMPLATE_INFO (TREE_TYPE (decl)) - && TYPE_TI_TEMPLATE (TREE_TYPE (decl))) - tmpl = TYPE_TI_TEMPLATE (TREE_TYPE (decl)); - else - { - cp_error ("`%D' does not declare a template type", decl); - return decl; - } - } - else if (! DECL_TEMPLATE_INFO (decl)) - { - cp_error ("template definition of non-template `%#D'", decl); - return decl; - } - else - tmpl = DECL_TI_TEMPLATE (decl); - - if (is_member_template (tmpl) - && DECL_FUNCTION_TEMPLATE_P (tmpl) - && DECL_TEMPLATE_INFO (decl) && DECL_TI_ARGS (decl) - && DECL_TEMPLATE_SPECIALIZATION (decl)) - { - tree new_tmpl; - - /* The declaration is a specialization of a member - template, declared outside the class. Therefore, the - innermost template arguments will be NULL, so we - replace them with the arguments determined by the - earlier call to check_explicit_specialization. */ - args = DECL_TI_ARGS (decl); - - new_tmpl - = build_template_decl (decl, current_template_parms); - DECL_TEMPLATE_RESULT (new_tmpl) = decl; - TREE_TYPE (new_tmpl) = TREE_TYPE (decl); - DECL_TI_TEMPLATE (decl) = new_tmpl; - SET_DECL_TEMPLATE_SPECIALIZATION (new_tmpl); - DECL_TEMPLATE_INFO (new_tmpl) = - perm_tree_cons (tmpl, args, NULL_TREE); - - register_specialization (new_tmpl, tmpl, args); - return decl; - } - - /* Make sure the template headers we got make sense. */ - - parms = DECL_TEMPLATE_PARMS (tmpl); - i = TMPL_PARMS_DEPTH (parms); - if (TMPL_ARGS_DEPTH (args) != i) - { - cp_error ("expected %d levels of template parms for `%#D', got %d", - i, decl, TMPL_ARGS_DEPTH (args)); - } - else - for (current = decl; i > 0; --i, parms = TREE_CHAIN (parms)) - { - a = TMPL_ARGS_LEVEL (args, i); - t = INNERMOST_TEMPLATE_PARMS (parms); - - if (TREE_VEC_LENGTH (t) != TREE_VEC_LENGTH (a)) - { - if (current == decl) - cp_error ("got %d template parameters for `%#D'", - TREE_VEC_LENGTH (a), decl); - else - cp_error ("got %d template parameters for `%#T'", - TREE_VEC_LENGTH (a), current); - cp_error (" but %d required", TREE_VEC_LENGTH (t)); - } - - /* Perhaps we should also check that the parms are used in the - appropriate qualifying scopes in the declarator? */ - - if (current == decl) - current = ctx; - else - current = TYPE_CONTEXT (current); - } - } - - DECL_TEMPLATE_RESULT (tmpl) = decl; - TREE_TYPE (tmpl) = TREE_TYPE (decl); - - /* Push template declarations for global functions and types. Note - that we do not try to push a global template friend declared in a - template class; such a thing may well depend on the template - parameters of the class. */ - if (! ctx - && !(is_friend && template_class_depth (current_class_type) > 0)) - tmpl = pushdecl_namespace_level (tmpl); - - if (primary) - DECL_PRIMARY_TEMPLATE (tmpl) = tmpl; - - info = perm_tree_cons (tmpl, args, NULL_TREE); - - if (TREE_CODE (decl) == TYPE_DECL && DECL_ARTIFICIAL (decl)) - { - SET_TYPE_TEMPLATE_INFO (TREE_TYPE (tmpl), info); - if ((!ctx || TREE_CODE (ctx) != FUNCTION_DECL) - && TREE_CODE (TREE_TYPE (decl)) != ENUMERAL_TYPE) - DECL_NAME (decl) = classtype_mangled_name (TREE_TYPE (decl)); - } - else if (! DECL_LANG_SPECIFIC (decl)) - cp_error ("template declaration of `%#D'", decl); - else - DECL_TEMPLATE_INFO (decl) = info; - - return DECL_TEMPLATE_RESULT (tmpl); -} - -tree -push_template_decl (decl) - tree decl; -{ - return push_template_decl_real (decl, 0); -} - -/* Called when a class template TYPE is redeclared with the indicated - template PARMS, e.g.: - - template struct S; - template struct S {}; */ - -void -redeclare_class_template (type, parms) - tree type; - tree parms; -{ - tree tmpl = CLASSTYPE_TI_TEMPLATE (type); - tree tmpl_parms; - int i; - - if (!PRIMARY_TEMPLATE_P (tmpl)) - /* The type is nested in some template class. Nothing to worry - about here; there are no new template parameters for the nested - type. */ - return; - - parms = INNERMOST_TEMPLATE_PARMS (parms); - tmpl_parms = DECL_INNERMOST_TEMPLATE_PARMS (tmpl); - - if (TREE_VEC_LENGTH (parms) != TREE_VEC_LENGTH (tmpl_parms)) - { - cp_error_at ("previous declaration `%D'", tmpl); - cp_error ("used %d template parameter%s instead of %d", - TREE_VEC_LENGTH (tmpl_parms), - TREE_VEC_LENGTH (tmpl_parms) == 1 ? "" : "s", - TREE_VEC_LENGTH (parms)); - return; - } - - for (i = 0; i < TREE_VEC_LENGTH (tmpl_parms); ++i) - { - tree tmpl_parm = TREE_VALUE (TREE_VEC_ELT (tmpl_parms, i)); - tree parm = TREE_VALUE (TREE_VEC_ELT (parms, i)); - tree tmpl_default = TREE_PURPOSE (TREE_VEC_ELT (tmpl_parms, i)); - tree parm_default = TREE_PURPOSE (TREE_VEC_ELT (parms, i)); - - if (TREE_CODE (tmpl_parm) != TREE_CODE (parm)) - { - cp_error_at ("template parameter `%#D'", tmpl_parm); - cp_error ("redeclared here as `%#D'", parm); - return; - } - - if (tmpl_default != NULL_TREE && parm_default != NULL_TREE) - { - /* We have in [temp.param]: - - A template-parameter may not be given default arguments - by two different declarations in the same scope. */ - cp_error ("redefinition of default argument for `%#D'", parm); - cp_error_at (" original definition appeared here", tmpl_parm); - return; - } - - if (parm_default != NULL_TREE) - /* Update the previous template parameters (which are the ones - that will really count) with the new default value. */ - TREE_PURPOSE (TREE_VEC_ELT (tmpl_parms, i)) = parm_default; - } -} - -/* Attempt to convert the non-type template parameter EXPR to the - indicated TYPE. If the conversion is successful, return the - converted value. If the conversion is unsuccesful, return - NULL_TREE if we issued an error message, or error_mark_node if we - did not. We issue error messages for out-and-out bad template - parameters, but not simply because the conversion failed, since we - might be just trying to do argument deduction. By the time this - function is called, neither TYPE nor EXPR may make use of template - parameters. */ - -static tree -convert_nontype_argument (type, expr) - tree type; - tree expr; -{ - tree expr_type = TREE_TYPE (expr); - - /* A template-argument for a non-type, non-template - template-parameter shall be one of: - - --an integral constant-expression of integral or enumeration - type; or - - --the name of a non-type template-parameter; or - - --the name of an object or function with external linkage, - including function templates and function template-ids but - excluding non-static class members, expressed as id-expression; - or - - --the address of an object or function with external linkage, - including function templates and function template-ids but - excluding non-static class members, expressed as & id-expression - where the & is optional if the name refers to a function or - array; or - - --a pointer to member expressed as described in _expr.unary.op_. */ - - /* An integral constant-expression can include const variables - or enumerators. */ - if (INTEGRAL_TYPE_P (expr_type) && TREE_READONLY_DECL_P (expr)) - expr = decl_constant_value (expr); - - if (is_overloaded_fn (expr)) - /* OK for now. We'll check that it has external linkage later. - Check this first since if expr_type is the unknown_type_node - we would otherwise complain below. */ - ; - else if (TYPE_PTR_P (expr_type) - || TREE_CODE (expr_type) == ARRAY_TYPE - || TREE_CODE (type) == REFERENCE_TYPE - /* If expr is the address of an overloaded function, we - will get the unknown_type_node at this point. */ - || expr_type == unknown_type_node) - { - tree referent; - tree e = expr; - STRIP_NOPS (e); - - if (TREE_CODE (type) == REFERENCE_TYPE - || TREE_CODE (expr_type) == ARRAY_TYPE) - referent = e; - else - { - if (TREE_CODE (e) != ADDR_EXPR) - { - bad_argument: - cp_error ("`%E' is not a valid template argument", expr); - error ("it must be %s%s with external linkage", - TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE - ? "a pointer to " : "", - TREE_CODE (TREE_TYPE (TREE_TYPE (expr))) == FUNCTION_TYPE - ? "a function" : "an object"); - return NULL_TREE; - } - - referent = TREE_OPERAND (e, 0); - STRIP_NOPS (referent); - } - - if (TREE_CODE (referent) == STRING_CST) - { - cp_error ("string literal %E is not a valid template argument", - referent); - error ("because it is the address of an object with static linkage"); - return NULL_TREE; - } - - if (is_overloaded_fn (referent)) - /* We'll check that it has external linkage later. */ - ; - else if (TREE_CODE (referent) != VAR_DECL) - goto bad_argument; - else if (!TREE_PUBLIC (referent)) - { - cp_error ("address of non-extern `%E' cannot be used as template argument", referent); - return error_mark_node; - } - } - else if (INTEGRAL_TYPE_P (expr_type) - || TYPE_PTRMEM_P (expr_type) - || TYPE_PTRMEMFUNC_P (expr_type) - /* The next two are g++ extensions. */ - || TREE_CODE (expr_type) == REAL_TYPE - || TREE_CODE (expr_type) == COMPLEX_TYPE) - { - if (! TREE_CONSTANT (expr)) - { - non_constant: - cp_error ("non-constant `%E' cannot be used as template argument", - expr); - return NULL_TREE; - } - } - else - { - cp_error ("object `%E' cannot be used as template argument", expr); - return NULL_TREE; - } - - switch (TREE_CODE (type)) - { - case INTEGER_TYPE: - case BOOLEAN_TYPE: - case ENUMERAL_TYPE: - /* For a non-type template-parameter of integral or enumeration - type, integral promotions (_conv.prom_) and integral - conversions (_conv.integral_) are applied. */ - if (!INTEGRAL_TYPE_P (expr_type)) - return error_mark_node; - - /* It's safe to call digest_init in this case; we know we're - just converting one integral constant expression to another. */ - expr = digest_init (type, expr, (tree*) 0); - - if (TREE_CODE (expr) != INTEGER_CST) - /* Curiously, some TREE_CONSTANT integral expressions do not - simplify to integer constants. For example, `3 % 0', - remains a TRUNC_MOD_EXPR. */ - goto non_constant; - - return expr; - - case REAL_TYPE: - case COMPLEX_TYPE: - /* These are g++ extensions. */ - if (TREE_CODE (expr_type) != TREE_CODE (type)) - return error_mark_node; - - expr = digest_init (type, expr, (tree*) 0); - - if (TREE_CODE (expr) != REAL_CST) - goto non_constant; - - return expr; - - case POINTER_TYPE: - { - tree type_pointed_to = TREE_TYPE (type); - - if (TYPE_PTRMEM_P (type)) - /* For a non-type template-parameter of type pointer to data - member, qualification conversions (_conv.qual_) are - applied. */ - return perform_qualification_conversions (type, expr); - else if (TREE_CODE (type_pointed_to) == FUNCTION_TYPE) - { - /* For a non-type template-parameter of type pointer to - function, only the function-to-pointer conversion - (_conv.func_) is applied. If the template-argument - represents a set of overloaded functions (or a pointer to - such), the matching function is selected from the set - (_over.over_). */ - tree fns; - tree fn; - - if (TREE_CODE (expr) == ADDR_EXPR) - fns = TREE_OPERAND (expr, 0); - else - fns = expr; - - fn = instantiate_type (type_pointed_to, fns, 0); - - if (fn == error_mark_node) - return error_mark_node; - - if (!TREE_PUBLIC (fn)) - { - if (really_overloaded_fn (fns)) - return error_mark_node; - else - goto bad_argument; - } - - expr = build_unary_op (ADDR_EXPR, fn, 0); - - my_friendly_assert (same_type_p (type, TREE_TYPE (expr)), - 0); - return expr; - } - else - { - /* For a non-type template-parameter of type pointer to - object, qualification conversions (_conv.qual_) and the - array-to-pointer conversion (_conv.array_) are applied. - [Note: In particular, neither the null pointer conversion - (_conv.ptr_) nor the derived-to-base conversion - (_conv.ptr_) are applied. Although 0 is a valid - template-argument for a non-type template-parameter of - integral type, it is not a valid template-argument for a - non-type template-parameter of pointer type.] - - The call to decay_conversion performs the - array-to-pointer conversion, if appropriate. */ - expr = decay_conversion (expr); - - if (expr == error_mark_node) - return error_mark_node; - else - return perform_qualification_conversions (type, expr); - } - } - break; - - case REFERENCE_TYPE: - { - tree type_referred_to = TREE_TYPE (type); - - if (TREE_CODE (type_referred_to) == FUNCTION_TYPE) - { - /* For a non-type template-parameter of type reference to - function, no conversions apply. If the - template-argument represents a set of overloaded - functions, the matching function is selected from the - set (_over.over_). */ - tree fns = expr; - tree fn; - - fn = instantiate_type (type_referred_to, fns, 0); - - if (fn == error_mark_node) - return error_mark_node; - - if (!TREE_PUBLIC (fn)) - { - if (really_overloaded_fn (fns)) - /* Don't issue an error here; we might get a different - function if the overloading had worked out - differently. */ - return error_mark_node; - else - goto bad_argument; - } - - my_friendly_assert (same_type_p (type_referred_to, - TREE_TYPE (fn)), - 0); - - return fn; - } - else - { - /* For a non-type template-parameter of type reference to - object, no conversions apply. The type referred to by the - reference may be more cv-qualified than the (otherwise - identical) type of the template-argument. The - template-parameter is bound directly to the - template-argument, which must be an lvalue. */ - if ((TYPE_MAIN_VARIANT (expr_type) - != TYPE_MAIN_VARIANT (type_referred_to)) - || !at_least_as_qualified_p (type_referred_to, - expr_type) - || !real_lvalue_p (expr)) - return error_mark_node; - else - return expr; - } - } - break; - - case RECORD_TYPE: - { - if (!TYPE_PTRMEMFUNC_P (type)) - /* This handles templates like - template void f(); - when T is substituted with any class. The second template - parameter becomes invalid and the template candidate is - rejected. */ - return error_mark_node; - - /* For a non-type template-parameter of type pointer to member - function, no conversions apply. If the template-argument - represents a set of overloaded member functions, the - matching member function is selected from the set - (_over.over_). */ - - if (!TYPE_PTRMEMFUNC_P (expr_type) && - expr_type != unknown_type_node) - return error_mark_node; - - if (TREE_CODE (expr) == CONSTRUCTOR) - { - /* A ptr-to-member constant. */ - if (!same_type_p (type, expr_type)) - return error_mark_node; - else - return expr; - } - - if (TREE_CODE (expr) != ADDR_EXPR) - return error_mark_node; - - expr = instantiate_type (type, expr, 0); - - if (expr == error_mark_node) - return error_mark_node; - - my_friendly_assert (same_type_p (type, TREE_TYPE (expr)), - 0); - return expr; - } - break; - - default: - /* All non-type parameters must have one of these types. */ - my_friendly_abort (0); - break; - } - - return error_mark_node; -} - -/* Return 1 if PARM_PARMS and ARG_PARMS matches using rule for - template template parameters. Both PARM_PARMS and ARG_PARMS are - vectors of TREE_LIST nodes containing TYPE_DECL, TEMPLATE_DECL - or PARM_DECL. - - ARG_PARMS may contain more parameters than PARM_PARMS. If this is - the case, then extra parameters must have default arguments. - - Consider the example: - template class vector; - template