; Options for the Rust front end.
; Copyright (C) 2003-2025 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 3, 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 COPYING3.  If not see
; <http://www.gnu.org/licenses/>.

; See the GCC internals manual for a description of this file's format.

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

; Describes command-line options used by this frontend

Language
Rust

I
Rust Joined Separate
; Documented in c.opt

L
Rust Joined Separate
; Not documented

Wall
Rust
; Documented in c.opt

Wunused-variable
Rust Var(warn_unused_variable) Warning
; documented in common.opt

Wunused-const-variable
Rust Warning Alias(Wunused-const-variable=, 2, 0)
Warn when a const variable is unused.

Wunused-const-variable=
Rust Joined RejectNegative UInteger Var(warn_unused_const_variable) Warning LangEnabledBy(Rust,Wunused-variable, 1, 0) IntegerRange(0, 2)
Warn when a const variable is unused.

Wunused-result
Rust Var(warn_unused_result) Warning
Warn if a caller of a function, marked with attribute warn_unused_result, does not use its return value.

Winfinite-recursion
Rust Var(warn_infinite_recursion) Warning
Warn for infinitely recursive calls.

frust-crate=
Rust Joined RejectNegative
-frust-crate=<name>             Set the crate name for the compilation

frust-extern=
Rust RejectNegative Joined
-frust-extern=              Specify where an external library is located

frust-debug
Rust Var(flag_rust_debug)
Dump various Rust front end internals.

frust-dump-
Rust Joined RejectNegative
-frust-dump-<type>              Dump Rust frontend internal information.

frust-incomplete-and-experimental-compiler-do-not-use
Rust Var(flag_rust_experimental)
Enable experimental compilation of Rust files at your own risk

frust-max-recursion-depth=
Rust RejectNegative Type(int) Var(rust_max_recursion_depth) Init(64)
-frust-max-recursion-depth=<integer>

frust-crate-type=
Rust Joined RejectNegative Enum(frust_crate_type) Var(flag_rust_crate_type)
-frust-crate-type=[bin|lib|rlib|dylib|cdylib|staticlib|proc-macro]     Crate type to emit

Enum
Name(frust_crate_type) Type(int) UnknownError(unknown crate type: '%qs')

EnumValue
Enum(frust_crate_type) String(bin) Value(0)

EnumValue
Enum(frust_crate_type) String(lib) Value(1)

EnumValue
Enum(frust_crate_type) String(rlib) Value(2)

EnumValue
Enum(frust_crate_type) String(dylib) Value(3)

EnumValue
Enum(frust_crate_type) String(cdylib) Value(4)

EnumValue
Enum(frust_crate_type) String(staticlib) Value(5)

EnumValue
Enum(frust_crate_type) String(proc-macro) Value(6)

frust-mangling=
Rust Joined RejectNegative Enum(frust_mangling) Var(flag_rust_mangling)
-frust-mangling=[legacy|v0]     Version to use for name mangling

Enum
Name(frust_mangling) Type(int) UnknownError(unknown rust mangling option %qs)

EnumValue
Enum(frust_mangling) String(legacy) Value(0)

EnumValue
Enum(frust_mangling) String(v0) Value(1)

frust-cfg=
Rust Joined RejectNegative
-frust-cfg=<name>             Set a config expansion option

frust-edition=
Rust Joined RejectNegative Enum(frust_edition) Var(flag_rust_edition)
-frust-edition=[2015|2018|2021]             Edition to use when compiling rust code

Enum
Name(frust_edition) Type(int) UnknownError(unknown rust edition %qs)

EnumValue
Enum(frust_edition) String(2015) Value(0)

EnumValue
Enum(frust_edition) String(2018) Value(1)

EnumValue
Enum(frust_edition) String(2021) Value(2)

frust-embed-metadata
Rust Var(flag_rust_embed_metadata)
Enable embedding metadata directly into object files

frust-metadata-output=
Rust Joined RejectNegative
-frust-metadata-output=<path.rox>  Path to output crate metadata

o
Rust Joined Separate
; Documented in common.opt

frust-compile-until=
Rust Joined RejectNegative Enum(frust_compile_until) Var(flag_rust_compile_until)
-frust-compile-until=[ast|attributecheck|expansion|astvalidation|featuregating|nameresolution|lowering|typecheck|privacy|unsafety|const|borrowcheck|compilation|end]             The pipeline will run up until this stage when compiling Rust code

Enum
Name(frust_compile_until) Type(int) UnknownError(unknown rust compile-until %qs)

EnumValue
Enum(frust_compile_until) String(ast) Value(0)

EnumValue
Enum(frust_compile_until) String(attributecheck) Value(1)

EnumValue
Enum(frust_compile_until) String(expansion) Value(2)

EnumValue
Enum(frust_compile_until) String(astvalidation) Value(3)

EnumValue
Enum(frust_compile_until) String(featuregating) Value(4)

EnumValue
Enum(frust_compile_until) String(nameresolution) Value(5)

EnumValue
Enum(frust_compile_until) String(lowering) Value(6)

EnumValue
Enum(frust_compile_until) String(typecheck) Value(7)

EnumValue
Enum(frust_compile_until) String(privacy) Value(8)

EnumValue
Enum(frust_compile_until) String(unsafety) Value(9)

EnumValue
Enum(frust_compile_until) String(const) Value(10)

EnumValue
Enum(frust_compile_until) String(borrowcheck) Value(11)

EnumValue
Enum(frust_compile_until) String(compilation) Value(12)

EnumValue
Enum(frust_compile_until) String(end) Value(13)

frust-name-resolution-2.0
Rust Var(flag_name_resolution_2_0)
Use the temporary and experimental name resolution pipeline instead of the stable one

frust-borrowcheck
Rust Var(flag_borrowcheck)
Use the WIP borrow checker.

frust-panic=
Rust Joined RejectNegative Enum(frust_panic) Var(flag_rust_panic)
-frust-edition=[unwind|abort]             Panic strategy to compile crate with

Enum
Name(frust_panic) Type(int) UnknownError(unknown panic strategy %qs)

EnumValue
Enum(frust_panic) String(unwind) Value(0)

EnumValue
Enum(frust_panic) String(abort) Value(1)

frust-overflow-checks
Rust Var(flag_overflow_checks) Init(1)
Enable the overflow checks in code generation

; This comment is to ensure we retain the blank line above.
