| /** |
| * Functions for raising errors. |
| * |
| * Copyright: Copyright (C) 1999-2022 by The D Language Foundation, All Rights Reserved |
| * Authors: $(LINK2 https://www.digitalmars.com, Walter Bright) |
| * License: $(LINK2 https://www.boost.org/LICENSE_1_0.txt, Boost License 1.0) |
| * Source: $(LINK2 https://github.com/dlang/dmd/blob/master/src/dmd/errors.d, _errors.d) |
| * Documentation: https://dlang.org/phobos/dmd_errors.html |
| * Coverage: https://codecov.io/gh/dlang/dmd/src/master/src/dmd/errors.d |
| */ |
| |
| module dmd.errors; |
| |
| import core.stdc.stdarg; |
| import dmd.globals; |
| |
| nothrow: |
| |
| /** |
| * Color highlighting to classify messages |
| */ |
| enum Classification : Color |
| { |
| error = Color.brightRed, /// for errors |
| gagged = Color.brightBlue, /// for gagged errors |
| warning = Color.brightYellow, /// for warnings |
| deprecation = Color.brightCyan, /// for deprecations |
| tip = Color.brightGreen, /// for tip messages |
| } |
| |
| enum Color : int |
| { |
| black = 0, |
| red = 1, |
| green = 2, |
| blue = 4, |
| yellow = red | green, |
| magenta = red | blue, |
| cyan = green | blue, |
| lightGray = red | green | blue, |
| bright = 8, |
| darkGray = bright | black, |
| brightRed = bright | red, |
| brightGreen = bright | green, |
| brightBlue = bright | blue, |
| brightYellow = bright | yellow, |
| brightMagenta = bright | magenta, |
| brightCyan = bright | cyan, |
| white = bright | lightGray, |
| } |
| |
| |
| static if (__VERSION__ < 2092) |
| private extern (C++) void noop(const ref Loc loc, const(char)* format, ...) {} |
| else |
| pragma(printf) private extern (C++) void noop(const ref Loc loc, const(char)* format, ...) {} |
| |
| |
| package auto previewErrorFunc(bool isDeprecated, FeatureState featureState) @safe @nogc pure nothrow |
| { |
| if (featureState == FeatureState.enabled) |
| return &error; |
| else if (featureState == FeatureState.disabled || isDeprecated) |
| return &noop; |
| else |
| return &deprecation; |
| } |
| |
| package auto previewSupplementalFunc(bool isDeprecated, FeatureState featureState) @safe @nogc pure nothrow |
| { |
| if (featureState == FeatureState.enabled) |
| return &errorSupplemental; |
| else if (featureState == FeatureState.disabled || isDeprecated) |
| return &noop; |
| else |
| return &deprecationSupplemental; |
| } |
| |
| |
| /** |
| * Print an error message, increasing the global error count. |
| * Params: |
| * loc = location of error |
| * format = printf-style format specification |
| * ... = printf-style variadic arguments |
| */ |
| static if (__VERSION__ < 2092) |
| extern (C++) void error(const ref Loc loc, const(char)* format, ...) |
| { |
| va_list ap; |
| va_start(ap, format); |
| verror(loc, format, ap); |
| va_end(ap); |
| } |
| else |
| pragma(printf) extern (C++) void error(const ref Loc loc, const(char)* format, ...) |
| { |
| va_list ap; |
| va_start(ap, format); |
| verror(loc, format, ap); |
| va_end(ap); |
| } |
| |
| /** |
| * Same as above, but takes a filename and line information arguments as separate parameters. |
| * Params: |
| * filename = source file of error |
| * linnum = line in the source file |
| * charnum = column number on the line |
| * format = printf-style format specification |
| * ... = printf-style variadic arguments |
| */ |
| static if (__VERSION__ < 2092) |
| extern (C++) void error(const(char)* filename, uint linnum, uint charnum, const(char)* format, ...) |
| { |
| const loc = Loc(filename, linnum, charnum); |
| va_list ap; |
| va_start(ap, format); |
| verror(loc, format, ap); |
| va_end(ap); |
| } |
| else |
| pragma(printf) extern (C++) void error(const(char)* filename, uint linnum, uint charnum, const(char)* format, ...) |
| { |
| const loc = Loc(filename, linnum, charnum); |
| va_list ap; |
| va_start(ap, format); |
| verror(loc, format, ap); |
| va_end(ap); |
| } |
| |
| /** |
| * Print additional details about an error message. |
| * Doesn't increase the error count or print an additional error prefix. |
| * Params: |
| * loc = location of error |
| * format = printf-style format specification |
| * ... = printf-style variadic arguments |
| */ |
| static if (__VERSION__ < 2092) |
| extern (C++) void errorSupplemental(const ref Loc loc, const(char)* format, ...) |
| { |
| va_list ap; |
| va_start(ap, format); |
| verrorSupplemental(loc, format, ap); |
| va_end(ap); |
| } |
| else |
| pragma(printf) extern (C++) void errorSupplemental(const ref Loc loc, const(char)* format, ...) |
| { |
| va_list ap; |
| va_start(ap, format); |
| verrorSupplemental(loc, format, ap); |
| va_end(ap); |
| } |
| |
| /** |
| * Print a warning message, increasing the global warning count. |
| * Params: |
| * loc = location of warning |
| * format = printf-style format specification |
| * ... = printf-style variadic arguments |
| */ |
| static if (__VERSION__ < 2092) |
| extern (C++) void warning(const ref Loc loc, const(char)* format, ...) |
| { |
| va_list ap; |
| va_start(ap, format); |
| vwarning(loc, format, ap); |
| va_end(ap); |
| } |
| else |
| pragma(printf) extern (C++) void warning(const ref Loc loc, const(char)* format, ...) |
| { |
| va_list ap; |
| va_start(ap, format); |
| vwarning(loc, format, ap); |
| va_end(ap); |
| } |
| |
| /** |
| * Print additional details about a warning message. |
| * Doesn't increase the warning count or print an additional warning prefix. |
| * Params: |
| * loc = location of warning |
| * format = printf-style format specification |
| * ... = printf-style variadic arguments |
| */ |
| static if (__VERSION__ < 2092) |
| extern (C++) void warningSupplemental(const ref Loc loc, const(char)* format, ...) |
| { |
| va_list ap; |
| va_start(ap, format); |
| vwarningSupplemental(loc, format, ap); |
| va_end(ap); |
| } |
| else |
| pragma(printf) extern (C++) void warningSupplemental(const ref Loc loc, const(char)* format, ...) |
| { |
| va_list ap; |
| va_start(ap, format); |
| vwarningSupplemental(loc, format, ap); |
| va_end(ap); |
| } |
| |
| /** |
| * Print a deprecation message, may increase the global warning or error count |
| * depending on whether deprecations are ignored. |
| * Params: |
| * loc = location of deprecation |
| * format = printf-style format specification |
| * ... = printf-style variadic arguments |
| */ |
| static if (__VERSION__ < 2092) |
| extern (C++) void deprecation(const ref Loc loc, const(char)* format, ...) |
| { |
| va_list ap; |
| va_start(ap, format); |
| vdeprecation(loc, format, ap); |
| va_end(ap); |
| } |
| else |
| pragma(printf) extern (C++) void deprecation(const ref Loc loc, const(char)* format, ...) |
| { |
| va_list ap; |
| va_start(ap, format); |
| vdeprecation(loc, format, ap); |
| va_end(ap); |
| } |
| |
| /** |
| * Print additional details about a deprecation message. |
| * Doesn't increase the error count, or print an additional deprecation prefix. |
| * Params: |
| * loc = location of deprecation |
| * format = printf-style format specification |
| * ... = printf-style variadic arguments |
| */ |
| static if (__VERSION__ < 2092) |
| extern (C++) void deprecationSupplemental(const ref Loc loc, const(char)* format, ...) |
| { |
| va_list ap; |
| va_start(ap, format); |
| vdeprecationSupplemental(loc, format, ap); |
| va_end(ap); |
| } |
| else |
| pragma(printf) extern (C++) void deprecationSupplemental(const ref Loc loc, const(char)* format, ...) |
| { |
| va_list ap; |
| va_start(ap, format); |
| vdeprecationSupplemental(loc, format, ap); |
| va_end(ap); |
| } |
| |
| /** |
| * Print a verbose message. |
| * Doesn't prefix or highlight messages. |
| * Params: |
| * loc = location of message |
| * format = printf-style format specification |
| * ... = printf-style variadic arguments |
| */ |
| static if (__VERSION__ < 2092) |
| extern (C++) void message(const ref Loc loc, const(char)* format, ...) |
| { |
| va_list ap; |
| va_start(ap, format); |
| vmessage(loc, format, ap); |
| va_end(ap); |
| } |
| else |
| pragma(printf) extern (C++) void message(const ref Loc loc, const(char)* format, ...) |
| { |
| va_list ap; |
| va_start(ap, format); |
| vmessage(loc, format, ap); |
| va_end(ap); |
| } |
| |
| /** |
| * Same as above, but doesn't take a location argument. |
| * Params: |
| * format = printf-style format specification |
| * ... = printf-style variadic arguments |
| */ |
| static if (__VERSION__ < 2092) |
| extern (C++) void message(const(char)* format, ...) |
| { |
| va_list ap; |
| va_start(ap, format); |
| vmessage(Loc.initial, format, ap); |
| va_end(ap); |
| } |
| else |
| pragma(printf) extern (C++) void message(const(char)* format, ...) |
| { |
| va_list ap; |
| va_start(ap, format); |
| vmessage(Loc.initial, format, ap); |
| va_end(ap); |
| } |
| |
| /** |
| * The type of the diagnostic handler |
| * see verrorPrint for arguments |
| * Returns: true if error handling is done, false to continue printing to stderr |
| */ |
| alias DiagnosticHandler = bool delegate(const ref Loc location, Color headerColor, const(char)* header, const(char)* messageFormat, va_list args, const(char)* prefix1, const(char)* prefix2); |
| |
| /** |
| * The diagnostic handler. |
| * If non-null it will be called for every diagnostic message issued by the compiler. |
| * If it returns false, the message will be printed to stderr as usual. |
| */ |
| __gshared DiagnosticHandler diagnosticHandler; |
| |
| /** |
| * Print a tip message with the prefix and highlighting. |
| * Params: |
| * format = printf-style format specification |
| * ... = printf-style variadic arguments |
| */ |
| static if (__VERSION__ < 2092) |
| extern (C++) void tip(const(char)* format, ...) |
| { |
| va_list ap; |
| va_start(ap, format); |
| vtip(format, ap); |
| va_end(ap); |
| } |
| else |
| pragma(printf) extern (C++) void tip(const(char)* format, ...) |
| { |
| va_list ap; |
| va_start(ap, format); |
| vtip(format, ap); |
| va_end(ap); |
| } |
| |
| |
| /** |
| * Same as $(D error), but takes a va_list parameter, and optionally additional message prefixes. |
| * Params: |
| * loc = location of error |
| * format = printf-style format specification |
| * ap = printf-style variadic arguments |
| * p1 = additional message prefix |
| * p2 = additional message prefix |
| * header = title of error message |
| */ |
| extern (C++) void verror(const ref Loc loc, const(char)* format, va_list ap, const(char)* p1 = null, const(char)* p2 = null, const(char)* header = "Error: "); |
| |
| /** |
| * Same as $(D errorSupplemental), but takes a va_list parameter. |
| * Params: |
| * loc = location of error |
| * format = printf-style format specification |
| * ap = printf-style variadic arguments |
| */ |
| static if (__VERSION__ < 2092) |
| extern (C++) void verrorSupplemental(const ref Loc loc, const(char)* format, va_list ap); |
| else |
| pragma(printf) extern (C++) void verrorSupplemental(const ref Loc loc, const(char)* format, va_list ap); |
| |
| /** |
| * Same as $(D warning), but takes a va_list parameter. |
| * Params: |
| * loc = location of warning |
| * format = printf-style format specification |
| * ap = printf-style variadic arguments |
| */ |
| static if (__VERSION__ < 2092) |
| extern (C++) void vwarning(const ref Loc loc, const(char)* format, va_list ap); |
| else |
| pragma(printf) extern (C++) void vwarning(const ref Loc loc, const(char)* format, va_list ap); |
| |
| /** |
| * Same as $(D warningSupplemental), but takes a va_list parameter. |
| * Params: |
| * loc = location of warning |
| * format = printf-style format specification |
| * ap = printf-style variadic arguments |
| */ |
| static if (__VERSION__ < 2092) |
| extern (C++) void vwarningSupplemental(const ref Loc loc, const(char)* format, va_list ap); |
| else |
| pragma(printf) extern (C++) void vwarningSupplemental(const ref Loc loc, const(char)* format, va_list ap); |
| |
| /** |
| * Same as $(D deprecation), but takes a va_list parameter, and optionally additional message prefixes. |
| * Params: |
| * loc = location of deprecation |
| * format = printf-style format specification |
| * ap = printf-style variadic arguments |
| * p1 = additional message prefix |
| * p2 = additional message prefix |
| */ |
| extern (C++) void vdeprecation(const ref Loc loc, const(char)* format, va_list ap, const(char)* p1 = null, const(char)* p2 = null); |
| |
| /** |
| * Same as $(D message), but takes a va_list parameter. |
| * Params: |
| * loc = location of message |
| * format = printf-style format specification |
| * ap = printf-style variadic arguments |
| */ |
| static if (__VERSION__ < 2092) |
| extern (C++) void vmessage(const ref Loc loc, const(char)* format, va_list ap); |
| else |
| pragma(printf) extern (C++) void vmessage(const ref Loc loc, const(char)* format, va_list ap); |
| |
| /** |
| * Same as $(D tip), but takes a va_list parameter. |
| * Params: |
| * format = printf-style format specification |
| * ap = printf-style variadic arguments |
| */ |
| static if (__VERSION__ < 2092) |
| extern (C++) void vtip(const(char)* format, va_list ap); |
| else |
| pragma(printf) extern (C++) void vtip(const(char)* format, va_list ap); |
| |
| /** |
| * Same as $(D deprecationSupplemental), but takes a va_list parameter. |
| * Params: |
| * loc = location of deprecation |
| * format = printf-style format specification |
| * ap = printf-style variadic arguments |
| */ |
| static if (__VERSION__ < 2092) |
| extern (C++) void vdeprecationSupplemental(const ref Loc loc, const(char)* format, va_list ap); |
| else |
| pragma(printf) extern (C++) void vdeprecationSupplemental(const ref Loc loc, const(char)* format, va_list ap); |
| |
| /** |
| * The type of the fatal error handler |
| * Returns: true if error handling is done, false to do exit(EXIT_FAILURE) |
| */ |
| alias FatalErrorHandler = bool delegate(); |
| |
| /** |
| * The fatal error handler. |
| * If non-null it will be called for every fatal() call issued by the compiler. |
| */ |
| __gshared FatalErrorHandler fatalErrorHandler; |
| |
| /** |
| * Call this after printing out fatal error messages to clean up and exit the |
| * compiler. You can also set a fatalErrorHandler to override this behaviour. |
| */ |
| extern (C++) void fatal(); |
| |
| /** |
| * Try to stop forgetting to remove the breakpoints from |
| * release builds. |
| */ |
| extern (C++) void halt(); |