; Options for the Java front end.
; Copyright (C) 2003, 2005 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, 51 Franklin Street, Fifth Floor, Boston, MA
; 02110-1301, USA.

; See the GCC internals manual 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)
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-classes
Java Var(flag_indirect_classes) Init(1)
Generate instances of Class at runtime

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

freduced-reflection
Java Var(flag_reduced_reflection)
Reduce the amount of reflection meta-data generated

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

fbootstrap-classes
Java Var(flag_bootstrap_classes)
Generated should be loaded by bootstrap loader

version
Java
