mirror of
https://forge.sourceware.org/marek/gcc.git
synced 2026-02-22 03:47:02 -05:00
Make sure all declarations added by autoconf are seen by system headers. libga68/ChangeLog: * ga68-alloc.c: Include ga68.h before all includes. * ga68-error.c: Likewise. * ga68-standenv.c: Likewise. * ga68-unistr.c: Likewise. Signed-off-by: Pietro Monteiro <pietro@sociotechnical.xyz>
153 lines
4.1 KiB
C
153 lines
4.1 KiB
C
/* Support run-time routines for error handling.
|
|
|
|
Copyright (C) 2025 Jose E. Marchesi.
|
|
|
|
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.
|
|
|
|
Under Section 7 of GPL version 3, you are granted additional permissions
|
|
described in the GCC Runtime Library Exception, version 3.1, as published by
|
|
the Free Software Foundation.
|
|
|
|
You should have received a copy of the GNU General Public License and a copy
|
|
of the GCC Runtime Library Exception along with this program; see the files
|
|
COPYING3 and COPYING.RUNTIME respectively. If not, see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
#include "ga68.h"
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h> /* For abort. */
|
|
|
|
|
|
/* Run-time error handling.
|
|
|
|
Please use the following format when outputing runtime error messages:
|
|
|
|
FILE:LINE:[COLUMN:] TEXT
|
|
|
|
This keeps the output aligned with other runtime libraries such as the
|
|
sanitizers. */
|
|
|
|
/* Emit a formatted error message to the standard output and then terminate the
|
|
process with an error code. */
|
|
|
|
void
|
|
_libga68_abort (const char *fmt, ...)
|
|
{
|
|
va_list ap;
|
|
|
|
va_start (ap, fmt);
|
|
vfprintf (stderr, fmt, ap);
|
|
abort ();
|
|
va_end (ap);
|
|
}
|
|
|
|
/* Assertion failure. */
|
|
|
|
void
|
|
_libga68_assert (const char *filename, unsigned int lineno)
|
|
{
|
|
_libga68_abort ("%s:%u: runtime error: ASSERT failure\n",
|
|
filename, lineno);
|
|
}
|
|
|
|
/* Attempt to dereference NIL failure. */
|
|
|
|
void
|
|
_libga68_derefnil (const char *filename, unsigned int lineno)
|
|
{
|
|
_libga68_abort ("%s:%u: runtime error: attempt to dereference NIL\n",
|
|
filename, lineno);
|
|
}
|
|
|
|
/* Invalid character expression. */
|
|
|
|
void
|
|
_libga68_invalidcharerror (const char *filename, unsigned int lineno,
|
|
int c)
|
|
{
|
|
if (c < 0)
|
|
_libga68_abort ("%s:%u: runtime error: %d is not a valid character point\n",
|
|
filename, lineno, c);
|
|
_libga68_abort ("%s:%u: runtime error: U+%x is not a valid character point\n",
|
|
filename, lineno, c);
|
|
}
|
|
|
|
/* Out of bounds error in bits ELEM operator. */
|
|
|
|
void
|
|
_libga68_bitsboundserror (const char *filename, unsigned int lineno,
|
|
ssize_t pos)
|
|
{
|
|
_libga68_abort ("%s:%u: runtime error: bound %zd out of range in ELEM\n",
|
|
filename, lineno, pos);
|
|
}
|
|
|
|
/* Unreachable error. */
|
|
|
|
void
|
|
_libga68_unreachable (const char *filename, unsigned int lineno)
|
|
{
|
|
_libga68_abort ("%s:%u: runtime error: unreachable reached\n",
|
|
filename, lineno);
|
|
}
|
|
|
|
/* Lower bound failure. */
|
|
|
|
void
|
|
_libga68_lower_bound (const char *filename, unsigned int lineno,
|
|
ssize_t index, ssize_t lower_bound)
|
|
{
|
|
_libga68_abort ("%s:%u: runtime error: lower bound %zd must be >= %zd\n",
|
|
filename, lineno, index, lower_bound);
|
|
}
|
|
|
|
/* Upper bound failure. */
|
|
|
|
void
|
|
_libga68_upper_bound (const char *filename, unsigned int lineno,
|
|
ssize_t index, ssize_t upper_bound)
|
|
{
|
|
_libga68_abort ("%s:%u: runtime error: upper bound %zd must be <= %zd\n",
|
|
filename, lineno, index, upper_bound);
|
|
}
|
|
|
|
/* Bounds failure. */
|
|
|
|
void
|
|
_libga68_bounds (const char *filename, unsigned int lineno,
|
|
ssize_t index, ssize_t lower_bound, ssize_t upper_bound)
|
|
{
|
|
_libga68_abort ("%s:%u: runtime error: bound %zd out of range [%zd:%zd]\n",
|
|
filename, lineno, index, lower_bound, upper_bound);
|
|
}
|
|
|
|
/* Dimension failure. */
|
|
|
|
void
|
|
_libga68_dim (const char *filename, unsigned int lineno,
|
|
size_t dim, size_t index)
|
|
{
|
|
_libga68_abort ("%s:%u: runtime error: invalid dimension %zd; shall be > 0 and <= %zu\n",
|
|
filename, lineno, index, dim);
|
|
}
|
|
|
|
/* Multiples have different bounds in assignations. */
|
|
|
|
void
|
|
_libga68_bounds_mismatch (const char *filename, unsigned int lineno,
|
|
size_t dim, ssize_t lb1, ssize_t ub1,
|
|
ssize_t lb2, ssize_t ub2)
|
|
{
|
|
_libga68_abort ("%s:%u: runtime error: multiple bounds mismatch in \
|
|
assignation: dim %zu: [%zd:%zd] /= [%zd:%zd]\n",
|
|
filename, lineno, dim, lb1, ub1, lb2, ub2);
|
|
}
|