This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Mainline: diagnostics machinery tweak



This patch removes the global variables errorcount, warningcount and
sorrycount and puts then in the diagnostic context output buffer.
They are still accessible as macros.  In the long term they will take
a diagnostic context as a parameter.
Mark, the diagnostic_state bit is not included in this patch.  It is
a subject of a separate patch.

Bootstrapped and tested on an i686-pc-linux-gnu.

-- Gaby
CodeSourcery, LLC            http://www.codesourcery.com
     http://www.codesourcery.com/gcc-compile.shtml

gcc/

2001-06-10  Mark Mitchell <mark@codesourcery.com>
	    Gabriel Dos Reis  <gdr@codesourcery.com>

	* Makefile.in (c-parse.o): Depend on diagnostic.h
	(dwarf2out.o): Likewise.

	* dwarf2out.c: #include diagnostic.h

	* toplev.h (warningcount, errorcount, sorrycount): Remove
	declarations. 

	* toplev.c (warningcount, errorcount, sorrycount): Remove
	definitions. 

	* diagnostic.h (struct output_buffer): Reorder fields.
	(diagnostic_kind_count): New macro.	
	(errorcount, warningcount, sorrycount): Define as macros.
	(diagnostic_report_warnings_p): New macro.
	(output_state): Add diagnostic_count field.

	* diagnostic.c (warningcount, errorcount, inhibit_warnings):
	Remove tentative declaration.
	(count_error): Use diagnostic_report_warnings_p.

	* c-parse.in: #include diagnostic.h

ch/

2001-06-10  Gabriel Dos Reis  <gdr@codesourcery.com>

	* decl.c: #include diagnostic.h
	* actions.c: #include diagnostic.h
	* Makefile.in (actions.o): Depend on diagnostic.h
	(decl.o): Depend on diagnostic.h

cp/

2001-06-10  Mark Mitchell <mark@codesourcery.com>
	    Gabriel Dos Reis  <gdr@codesourcery.com>

	* Make-lang.in (cp/call.o): Depend on diagnostic.h
	(cp/typeck.o): Depend on diagnostic.h
	(cp/typeck2.o): Depend on diagnostic.h
	(cp/repo.o): Depend on dignostic.h	
	* typeck.c: #include diagnostic.h
	(convert_for_initialization): Remove extern declaration for
	warningcount and errorcount.

	* call.c: #include diagnostic.h
	(convert_like_real): Remove extern declaration for warnincount and
	errorcount. 

	* repo.c: #include diagnostic.h
	* typeck2.c: #include diagnostic.h

Index: Makefile.in
===================================================================
RCS file: /cvs/gcc/egcs/gcc/Makefile.in,v
retrieving revision 1.673
diff -p -r1.673 Makefile.in
*** Makefile.in	2001/06/09 22:39:23	1.673
--- Makefile.in	2001/06/10 13:40:08
*************** s-crt0:	$(CRT0_S) $(MCRT0_S) $(GCC_PASSE
*** 1133,1139 ****
  c-errors.o: c-errors.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(C_TREE_H) flags.h \
      diagnostic.h $(TM_P_H)
  c-parse.o : $(srcdir)/c-parse.c $(CONFIG_H) $(TREE_H) c-lex.h $(GGC_H) intl.h \
!     $(C_TREE_H) input.h flags.h $(SYSTEM_H) toplev.h output.h cpplib.h
  	$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c $(srcdir)/c-parse.c
  
  $(srcdir)/c-parse.c: $(srcdir)/c-parse.y
--- 1133,1140 ----
  c-errors.o: c-errors.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(C_TREE_H) flags.h \
      diagnostic.h $(TM_P_H)
  c-parse.o : $(srcdir)/c-parse.c $(CONFIG_H) $(TREE_H) c-lex.h $(GGC_H) intl.h \
!     $(C_TREE_H) input.h flags.h $(SYSTEM_H) toplev.h output.h cpplib.h \
!     diagnostic.h
  	$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c $(srcdir)/c-parse.c
  
  $(srcdir)/c-parse.c: $(srcdir)/c-parse.y
*************** sdbout.o : sdbout.c $(CONFIG_H) $(SYSTEM
*** 1386,1392 ****
  dwarfout.o : dwarfout.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(RTL_H) dwarf.h \
     flags.h insn-config.h reload.h output.h toplev.h dwarfout.h $(TM_P_H)
  dwarf2out.o : dwarf2out.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(RTL_H) dwarf2.h \
!    flags.h insn-config.h reload.h output.h \
     hard-reg-set.h $(REGS_H) $(EXPR_H) toplev.h dwarf2out.h varray.h \
     $(GGC_H) except.h dwarf2asm.h $(TM_P_H)
  dwarf2asm.o : dwarf2asm.c $(CONFIG_H) $(SYSTEM_H) flags.h $(RTL_H) $(TREE_H) \
--- 1387,1393 ----
  dwarfout.o : dwarfout.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(RTL_H) dwarf.h \
     flags.h insn-config.h reload.h output.h toplev.h dwarfout.h $(TM_P_H)
  dwarf2out.o : dwarf2out.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(RTL_H) dwarf2.h \
!    flags.h insn-config.h reload.h output.h diagnostic.h \
     hard-reg-set.h $(REGS_H) $(EXPR_H) toplev.h dwarf2out.h varray.h \
     $(GGC_H) except.h dwarf2asm.h $(TM_P_H)
  dwarf2asm.o : dwarf2asm.c $(CONFIG_H) $(SYSTEM_H) flags.h $(RTL_H) $(TREE_H) \
Index: c-parse.in
===================================================================
RCS file: /cvs/gcc/egcs/gcc/c-parse.in,v
retrieving revision 1.93
diff -p -r1.93 c-parse.in
*** c-parse.in	2001/05/25 19:44:20	1.93
--- c-parse.in	2001/06/10 13:40:08
*************** end ifc
*** 51,56 ****
--- 51,57 ----
  #include "output.h"
  #include "toplev.h"
  #include "ggc.h"
+ #include "diagnostic.h"  
    
  #ifdef MULTIBYTE_CHARS
  #include <locale.h>
Index: diagnostic.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/diagnostic.c,v
retrieving revision 1.56
diff -p -r1.56 diagnostic.c
*** diagnostic.c	2001/05/23 17:15:07	1.56
--- diagnostic.c	2001/06/10 13:40:08
*************** static void default_diagnostic_finalizer
*** 103,112 ****
  static void error_recursion PARAMS ((void)) ATTRIBUTE_NORETURN;
  
  extern int rtl_dump_and_exit;
- extern int inhibit_warnings;
  extern int warnings_are_errors;
- extern int warningcount;
- extern int errorcount;
  
  /* Front-end specific tree formatter, if non-NULL.  */
  printer_fn lang_printer = NULL;
--- 103,109 ----
*************** int
*** 1049,1057 ****
  count_error (warningp)
       int warningp;
  {
!   if (warningp
!       && (inhibit_warnings
!           || (in_system_header && !warn_system_headers)))
      return 0;
  
    if (warningp && !warnings_are_errors)
--- 1046,1052 ----
  count_error (warningp)
       int warningp;
  {
!   if (warningp && !diagnostic_report_warnings_p ())
      return 0;
  
    if (warningp && !warnings_are_errors)
Index: diagnostic.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/diagnostic.h,v
retrieving revision 1.25
diff -p -r1.25 diagnostic.h
*** diagnostic.h	2001/05/26 01:31:34	1.25
--- diagnostic.h	2001/06/10 13:40:08
*************** typedef struct
*** 55,63 ****
--- 55,65 ----
  {
    /* The prefix for each new line.   */
    const char *prefix;
+ 
    /* The real upper bound of number of characters per line, taking into
       account the case of a very very looong prefix.  */  
    int maximum_length;
+ 
    /* The ideal upper bound of number of characters per line, as suggested
       by front-end. */  
    int ideal_maximum_length;
*************** typedef struct
*** 77,87 ****
--- 79,94 ----
       o DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE: emit current PREFIX each time
         a physical line is started.  */
    int prefixing_rule;
+ 
    /* The current char to output.  Updated by front-end (*format_map) when
       it is called to report front-end printer for a specified format.  */  
    const char *cursor;
+ 
    /* A pointer to the variable argument-list for formatting.  */  
    va_list *format_args;
+ 
+   /* The number of times we have issued diagnostics.  */
+   int diagnostic_count[DK_LAST_DIAGNOSTIC_KIND];
  } output_state;
  
  /* The output buffer datatype.  This is best seen as an abstract datatype.  */
*************** struct output_buffer
*** 90,105 ****
    /* Internal data.  These fields should not be accessed directly by
       front-ends.  */
  
    /* Where to output formatted text.  */
    FILE* stream;
    /* The obstack where the text is built up.  */  
    struct obstack obstack;
    /* The amount of characters output so far.  */  
    int line_length;
-   /* The current state of the buffer.  */
-   output_state state;
  };
  
  #define output_buffer_attached_stream(BUFFER) (BUFFER)->stream
  #define output_buffer_text_cursor(BUFFER) (BUFFER)->state.cursor
  #define output_buffer_format_args(BUFFER) *((BUFFER)->state.format_args)
--- 97,116 ----
    /* Internal data.  These fields should not be accessed directly by
       front-ends.  */
  
+   /* The current state of the buffer.  */
+   output_state state;
+ 
    /* Where to output formatted text.  */
    FILE* stream;
+ 
    /* The obstack where the text is built up.  */  
    struct obstack obstack;
+ 
    /* The amount of characters output so far.  */  
    int line_length;
  };
  
+ #define output_buffer_state(BUFFER) (BUFFER)->state
  #define output_buffer_attached_stream(BUFFER) (BUFFER)->stream
  #define output_buffer_text_cursor(BUFFER) (BUFFER)->state.cursor
  #define output_buffer_format_args(BUFFER) *((BUFFER)->state.format_args)
*************** extern int diagnostic_message_length_per
*** 177,182 ****
--- 188,210 ----
     avoided.  This global buffer will go away, once all such usage
     has been removed.  */
  extern output_buffer *diagnostic_buffer;
+ 
+ #define diagnostic_kind_count(BUFFER, DK) \
+    (BUFFER)->state.diagnostic_count[(int) DK]
+ 
+ /* The number of errors that have been issued so far.  Ideally, these
+    would take an output_buffer as an argument.  */
+ #define errorcount diagnostic_kind_count (diagnostic_buffer, DK_ERROR)
+ /* Similarly, but for warnings.  */
+ #define warningcount diagnostic_kind_count (diagnostic_buffer, DK_WARNING)
+ /* Similarly, but for sorrys.  */
+ #define sorrycount diagnostic_kind_count (diagnostic_buffer, DK_SORRY)
+ 
+ /* Returns non-zero if warnings should be emitted.  */
+ #define diagnostic_report_warnings_p()			\
+   (!inhibit_warnings					\
+    && !(in_system_header && !warn_system_headers))
+ 
  
  /* Prototypes */
  extern void set_diagnostic_context	PARAMS ((diagnostic_context *,
Index: dwarf2out.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/dwarf2out.c,v
retrieving revision 1.276
diff -p -r1.276 dwarf2out.c
*** dwarf2out.c	2001/06/06 01:57:49	1.276
--- dwarf2out.c	2001/06/10 13:40:09
*************** Boston, MA 02111-1307, USA.  */
*** 56,61 ****
--- 56,62 ----
  #include "ggc.h"
  #include "md5.h"
  #include "tm_p.h"
+ #include "diagnostic.h"
  
  /* DWARF2 Abbreviation Glossary:
     CFA = Canonical Frame Address
Index: toplev.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/toplev.c,v
retrieving revision 1.468
diff -p -r1.468 toplev.c
*** toplev.c	2001/06/10 00:31:07	1.468
--- toplev.c	2001/06/10 13:40:09
*************** int optimize = 0;
*** 379,390 ****
  
  int optimize_size = 0;
  
- /* Number of error messages and warning messages so far.  */
- 
- int errorcount = 0;
- int warningcount = 0;
- int sorrycount = 0;
- 
  /* Nonzero if we should exit after parsing options.  */
  static int exit_after_options = 0;
  
--- 379,384 ----
Index: toplev.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/toplev.h,v
retrieving revision 1.64
diff -p -r1.64 toplev.h
*** toplev.h	2001/06/05 08:03:44	1.64
--- toplev.h	2001/06/10 13:40:09
*************** extern void note_deferral_of_defined_inl
*** 132,140 ****
  					PARAMS ((union tree_node *));
  extern void note_outlining_of_inline_function
  					PARAMS ((union tree_node *));
- extern int errorcount;
- extern int warningcount;
- extern int sorrycount;
  
  extern const char *progname;
  extern const char *dump_base_name;
--- 132,137 ----

Index: ch/Makefile.in
===================================================================
RCS file: /cvs/gcc/egcs/gcc/ch/Makefile.in,v
retrieving revision 1.31
diff -p -r1.31 Makefile.in
*** Makefile.in	2001/01/28 01:50:07	1.31
--- Makefile.in	2001/06/10 13:40:10
*************** $(srcdir)/hash.h:
*** 269,280 ****
  
  actions.o : actions.c $(CONFIG_H) $(CHILL_TREE_H) actions.h $(RTL_H)	\
  	lex.h $(srcdir)/../flags.h $(srcdir)/../input.h			\
! 	$(EXPR_H) $(srcdir)/../system.h $(srcdir)/../toplev.h
  convert.o : convert.c $(CONFIG_H) $(CHILL_TREE_H) $(srcdir)/../flags.h \
  	$(srcdir)/../tree.h $(srcdir)/../system.h $(srcdir)/../toplev.h \
  	$(srcdir)/../convert.h
  decl.o : decl.c $(CONFIG_H) $(CHILL_TREE_H) $(srcdir)/../flags.h lex.h \
! 	$(srcdir)/../system.h $(srcdir)/../toplev.h
  except.o : except.c $(CONFIG_H) $(srcdir)/../tree.h $(RTL_H) $(CHILL_TREE_H) \
  	$(srcdir)/../system.h $(srcdir)/../toplev.h
  expr.o : expr.c $(CONFIG_H) $(RTL_H) $(CHILL_TREE_H) $(srcdir)/../flags.h \
--- 269,280 ----
  
  actions.o : actions.c $(CONFIG_H) $(CHILL_TREE_H) actions.h $(RTL_H)	\
  	lex.h $(srcdir)/../flags.h $(srcdir)/../input.h			\
! 	$(EXPR_H) $(srcdir)/../system.h $(srcdir)/../toplev.h diagnostic.h
  convert.o : convert.c $(CONFIG_H) $(CHILL_TREE_H) $(srcdir)/../flags.h \
  	$(srcdir)/../tree.h $(srcdir)/../system.h $(srcdir)/../toplev.h \
  	$(srcdir)/../convert.h
  decl.o : decl.c $(CONFIG_H) $(CHILL_TREE_H) $(srcdir)/../flags.h lex.h \
! 	$(srcdir)/../system.h $(srcdir)/../toplev.h diagnostic.h
  except.o : except.c $(CONFIG_H) $(srcdir)/../tree.h $(RTL_H) $(CHILL_TREE_H) \
  	$(srcdir)/../system.h $(srcdir)/../toplev.h
  expr.o : expr.c $(CONFIG_H) $(RTL_H) $(CHILL_TREE_H) $(srcdir)/../flags.h \
Index: ch/actions.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/ch/actions.c,v
retrieving revision 1.19
diff -p -r1.19 actions.c
*** actions.c	2000/11/07 22:49:55	1.19
--- actions.c	2001/06/10 13:40:10
*************** Boston, MA 02111-1307, USA.  */
*** 32,37 ****
--- 32,38 ----
  #include "obstack.h"
  #include "assert.h"
  #include "toplev.h"
+ #include "diagnostic.h"
  
  static int id_cmp PARAMS ((tree *, tree *));
  static void warn_unhandled PARAMS ((const char *));
Index: ch/decl.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/ch/decl.c,v
retrieving revision 1.31
diff -p -r1.31 decl.c
*** decl.c	2001/02/23 20:38:55	1.31
--- decl.c	2001/06/10 13:40:10
*************** Boston, MA 02111-1307, USA.  */
*** 191,196 ****
--- 191,197 ----
  #include "input.h"
  #include "rtl.h"
  #include "toplev.h"
+ #include "diagnostic.h"
  
  #define IS_UNKNOWN_TYPE(type) (TYPE_SIZE(type)==0)
  #define BUILTIN_NESTING_LEVEL (-1)

Index: cp/Make-lang.in
===================================================================
RCS file: /cvs/gcc/egcs/gcc/cp/Make-lang.in,v
retrieving revision 1.84
diff -p -r1.84 Make-lang.in
*** Make-lang.in	2001/04/30 22:46:00	1.84
--- Make-lang.in	2001/06/10 13:40:11
*************** cp/decl.o: cp/decl.c $(CXX_TREE_H) flags
*** 245,254 ****
    cp/operators.def $(TM_P_H)
  cp/decl2.o: cp/decl2.c $(CXX_TREE_H) flags.h cp/lex.h cp/decl.h $(EXPR_H) \
    output.h except.h toplev.h dwarf2out.h dwarfout.h $(GGC_H) $(RTL_H)
! cp/typeck2.o: cp/typeck2.c $(CXX_TREE_H) flags.h toplev.h output.h $(TM_P_H)
! cp/typeck.o: cp/typeck.c $(CXX_TREE_H) flags.h $(RTL_H) $(EXPR_H) toplev.h 
  cp/class.o: cp/class.c $(CXX_TREE_H) flags.h toplev.h $(RTL_H)
! cp/call.o: cp/call.c $(CXX_TREE_H) flags.h toplev.h $(RTL_H) $(EXPR_H) $(GGC_H)
  cp/friend.o: cp/friend.c $(CXX_TREE_H) flags.h $(RTL_H) toplev.h $(EXPR_H)
  cp/init.o: cp/init.c $(CXX_TREE_H) flags.h $(RTL_H) $(EXPR_H) toplev.h \
    $(GGC_H) except.h
--- 245,257 ----
    cp/operators.def $(TM_P_H)
  cp/decl2.o: cp/decl2.c $(CXX_TREE_H) flags.h cp/lex.h cp/decl.h $(EXPR_H) \
    output.h except.h toplev.h dwarf2out.h dwarfout.h $(GGC_H) $(RTL_H)
! cp/typeck2.o: cp/typeck2.c $(CXX_TREE_H) flags.h toplev.h output.h $(TM_P_H) \
!    diagnostic.h
! cp/typeck.o: cp/typeck.c $(CXX_TREE_H) flags.h $(RTL_H) $(EXPR_H) toplev.h \
!    diagnostic.h
  cp/class.o: cp/class.c $(CXX_TREE_H) flags.h toplev.h $(RTL_H)
! cp/call.o: cp/call.c $(CXX_TREE_H) flags.h toplev.h $(RTL_H) $(EXPR_H) \
!      $(GGC_H) diagnostic.h
  cp/friend.o: cp/friend.c $(CXX_TREE_H) flags.h $(RTL_H) toplev.h $(EXPR_H)
  cp/init.o: cp/init.c $(CXX_TREE_H) flags.h $(RTL_H) $(EXPR_H) toplev.h \
    $(GGC_H) except.h
*************** cp/pt.o: cp/pt.c $(CXX_TREE_H) cp/decl.h
*** 269,275 ****
    $(GGC_H) $(RTL_H) except.h
  cp/error.o: cp/error.c $(CXX_TREE_H) toplev.h diagnostic.h
  cp/errfn.o: cp/errfn.c $(CXX_TREE_H) toplev.h
! cp/repo.o: cp/repo.c $(CXX_TREE_H) toplev.h $(GGC_H)
  cp/semantics.o: cp/semantics.c $(CXX_TREE_H) cp/lex.h except.h toplev.h \
    flags.h $(GGC_H) output.h $(RTL_H) $(TIMEVAR_H) $(EXPR_H)
  cp/dump.o: cp/dump.c $(CXX_TREE_H) c-dump.h
--- 272,278 ----
    $(GGC_H) $(RTL_H) except.h
  cp/error.o: cp/error.c $(CXX_TREE_H) toplev.h diagnostic.h
  cp/errfn.o: cp/errfn.c $(CXX_TREE_H) toplev.h
! cp/repo.o: cp/repo.c $(CXX_TREE_H) toplev.h $(GGC_H) diagnostic.h
  cp/semantics.o: cp/semantics.c $(CXX_TREE_H) cp/lex.h except.h toplev.h \
    flags.h $(GGC_H) output.h $(RTL_H) $(TIMEVAR_H) $(EXPR_H)
  cp/dump.o: cp/dump.c $(CXX_TREE_H) c-dump.h
Index: cp/call.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/cp/call.c,v
retrieving revision 1.272
diff -p -r1.272 call.c
*** call.c	2001/06/06 17:10:51	1.272
--- call.c	2001/06/10 13:40:12
*************** Boston, MA 02111-1307, USA.  */
*** 34,39 ****
--- 34,40 ----
  #include "toplev.h"
  #include "expr.h"
  #include "ggc.h"
+ #include "diagnostic.h"
  
  extern int inhibit_warnings;
  
*************** convert_like_real (convs, expr, fn, argn
*** 3716,3722 ****
       int argnum;
       int inner;
  {
-   extern int warningcount, errorcount;
    int savew, savee;
  
    tree totype = TREE_TYPE (convs);
--- 3717,3722 ----
Index: cp/repo.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/cp/repo.c,v
retrieving revision 1.36
diff -p -r1.36 repo.c
*** repo.c	2001/06/06 03:15:33	1.36
--- repo.c	2001/06/10 13:40:12
*************** Boston, MA 02111-1307, USA.  */
*** 33,38 ****
--- 33,39 ----
  #include "obstack.h"
  #include "toplev.h"
  #include "ggc.h"
+ #include "diagnostic.h"
  
  static tree repo_get_id PARAMS ((tree));
  static char *extract_string PARAMS ((char **));
Index: cp/typeck.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/cp/typeck.c,v
retrieving revision 1.349
diff -p -r1.349 typeck.c
*** typeck.c	2001/06/06 17:10:52	1.349
--- typeck.c	2001/06/10 13:40:13
*************** Boston, MA 02111-1307, USA.  */
*** 40,45 ****
--- 40,46 ----
  #include "flags.h"
  #include "output.h"
  #include "toplev.h"
+ #include "diagnostic.h"
  
  static tree convert_for_assignment PARAMS ((tree, tree, const char *, tree,
  					  int));
*************** convert_for_initialization (exp, type, r
*** 6431,6437 ****
    if (codel == REFERENCE_TYPE)
      {
        /* This should eventually happen in convert_arguments.  */
-       extern int warningcount, errorcount;
        int savew = 0, savee = 0;
  
        if (fndecl)
--- 6432,6437 ----
Index: cp/typeck2.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/cp/typeck2.c,v
retrieving revision 1.101
diff -p -r1.101 typeck2.c
*** typeck2.c	2001/05/02 14:38:33	1.101
--- typeck2.c	2001/06/10 13:40:13
*************** Boston, MA 02111-1307, USA.  */
*** 38,43 ****
--- 38,44 ----
  #include "flags.h"
  #include "toplev.h"
  #include "output.h"
+ #include "diagnostic.h"
  
  static tree process_init_constructor PARAMS ((tree, tree, tree *));
  


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]