blob: 114bd44e32c97dfc521d8c3bb3489d64105da016 [file] [log] [blame]
/**
* 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);
/**
* Call this after printing out fatal error messages to clean up and exit
* the compiler.
*/
extern (C++) void fatal();
/**
* Try to stop forgetting to remove the breakpoints from
* release builds.
*/
extern (C++) void halt();