diff options
author | Ian Lance Taylor <iant@golang.org> | 2023-06-21 11:04:04 -0700 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2023-06-21 11:04:04 -0700 |
commit | 97e31a0a2a2d2273687fcdb4e5416aab1a2186e1 (patch) | |
tree | d5c1cae4de436a0fe54a5f0a2a197d309f3d654c /gcc/rust/rust-diagnostics.cc | |
parent | 6612f4f8cb9b0d5af18ec69ad04e56debc3e6ced (diff) | |
parent | 577223aebc7acdd31e62b33c1682fe54a622ae27 (diff) | |
download | gcc-97e31a0a2a2d2273687fcdb4e5416aab1a2186e1.zip gcc-97e31a0a2a2d2273687fcdb4e5416aab1a2186e1.tar.gz gcc-97e31a0a2a2d2273687fcdb4e5416aab1a2186e1.tar.bz2 |
Merge from trunk revision 577223aebc7acdd31e62b33c1682fe54a622ae27.
Diffstat (limited to 'gcc/rust/rust-diagnostics.cc')
-rw-r--r-- | gcc/rust/rust-diagnostics.cc | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/gcc/rust/rust-diagnostics.cc b/gcc/rust/rust-diagnostics.cc index c0f02c2..4e5c2ec 100644 --- a/gcc/rust/rust-diagnostics.cc +++ b/gcc/rust/rust-diagnostics.cc @@ -231,14 +231,49 @@ rust_debug_loc (const Location location, const char *fmt, ...) } namespace Rust { -Error::Error (const Location location, const char *fmt, ...) : locus (location) + +/** + * This function takes ownership of `args` and calls `va_end` on it + */ +static Error +va_constructor (Error::Kind kind, Location locus, const char *fmt, va_list args) + RUST_ATTRIBUTE_GCC_DIAG (3, 0); + +static Error +va_constructor (Error::Kind kind, Location locus, const char *fmt, va_list args) +{ + std::string message = expand_message (fmt, args); + message.shrink_to_fit (); + va_end (args); + + return Error (kind, locus, message); +} + +Error::Error (const Location location, const char *fmt, ...) + : kind (Kind::Err), locus (location) { va_list ap; + va_start (ap, fmt); + *this = va_constructor (Kind::Err, location, fmt, ap); +} + +Error +Error::Hint (const Location location, const char *fmt, ...) +{ + va_list ap; va_start (ap, fmt); - message = expand_message (fmt, ap); - va_end (ap); - message.shrink_to_fit (); + return va_constructor (Kind::Hint, location, fmt, ap); +} + +Error +Error::Fatal (const Location location, const char *fmt, ...) +{ + va_list ap; + va_start (ap, fmt); + + return va_constructor (Kind::FatalErr, location, fmt, ap); } + } // namespace Rust |