; Options for the Java front end.
; Copyright (C) 2003 Free Software Foundation, Inc.
;
; This file is part of GCC.
;
; GCC 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.
; 
; GCC 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 GCC; see the file COPYING.  If not, write to the Free
; Software Foundation, 59 Temple Place - Suite 330, Boston, MA
; 02111-1307, USA.

; See c.opt for a description of this file's format.

; Please try to keep this file in ASCII collating order.

Language
Java

I
Java Joined
; Documented for C

M
Java
; Documented for C

MD_
Java Undocumented
; Documented for C

MF
Java Separate
; Documented for C

MM
Java
; Documented for C

MMD_
Java Undocumented
; Documented for C

MP
Java
; Documented for C

MT
Java Separate
; Documented for C

Wall
Java
; Documented for C

Wdeprecated
Java Var(warn_deprecated) VarExists
Warn if a deprecated compiler feature, class, method, or field is used

Wextraneous-semicolon
Java Var(flag_extraneous_semicolon)
Warn if deprecated empty statements are found

Wout-of-date
Java Var(flag_newer) Init(1)
Warn if .class files are out of date

Wredundant-modifiers
Java Var(flag_redundant)
Warn if modifiers are specified when not necessary

fCLASSPATH=
Java JoinedOrMissing RejectNegative
--CLASSPATH	Deprecated; use --classpath instead

fassert
Java Var(flag_assert) Init(1)
Permit the use of the assert keyword

fassume-compiled
Java

fassume-compiled=
Java JoinedOrMissing

fenable-assertions
Java

fenable-assertions=
Java JoinedOrMissing

fdisable-assertions
Java

fdisable-assertions=
Java JoinedOrMissing

fbootclasspath=
Java JoinedOrMissing RejectNegative
--bootclasspath=<path>	Replace system path

fcheck-references
Java Var(flag_check_references)
Generate checks for references to NULL

fclasspath=
Java JoinedOrMissing RejectNegative
--classpath=<path>	Set class path

fcompile-resource=
Java Joined RejectNegative

femit-class-file
Java Var(flag_emit_class_files) VarExists
Output a class file

femit-class-files
Java Var(flag_emit_class_files)
Alias for -femit-class-file

fencoding=
Java Joined RejectNegative
--encoding=<encoding>	Choose input encoding (defaults from your locale)

fextdirs=
Java Joined RejectNegative
--extdirs=<path>	Set the extension directory path

ffilelist-file
Java Var(flag_filelist_file)
Input file is a file with a list of filenames to compile

fforce-classes-archive-check
Java Var(flag_force_classes_archive_check)
Always check for non gcj generated classes archives

fhash-synchronization
Java Var(flag_hash_synchronization)
Assume the runtime uses a hash table to map an object to its synchronization structure

findirect-dispatch
Java Var(flag_indirect_dispatch)
Use offset tables for virtual method calls

finline-functions
Java

fjni
Java Var(flag_jni)
Assume native functions are implemented using JNI

foptimize-static-class-initialization
Java Var(flag_optimize_sci)
Enable optimization of static class initialization code

foutput-class-dir=
Java Joined RejectNegative

fstore-check
Java Var(flag_store_check) Init(1)
Enable assignability checks for stores into object arrays

fuse-boehm-gc
Java Var(flag_use_boehm_gc)
Generate code for the Boehm GC

fuse-divide-subroutine
Java Var(flag_use_divide_subroutine) Init(1)
Call a library routine to do integer divisions

version
Java
