mirror of
https://github.com/gcc-mirror/gcc.git
synced 2026-05-06 14:59:39 +02:00
a68: Add error on integral denotation overflow
Signed-off-by: James Bohl <bohlj47@gmail.com> gcc/algol68/ChangeLog * a68-low-units.cc (a68_lower_denotation): Add error on integral denotation overflow. gcc/testsuite/ChangeLog * algol68/compile/error-denotation-1.a68: New test. * algol68/compile/error-denotation-2.a68: Likewise. * algol68/compile/error-denotation-3.a68: Likewise. * algol68/execute/plusab-1.a68: Fixed denotation overflow.
This commit is contained in:
committed by
Jose E. Marchesi
parent
3275b86a82
commit
f059aa93d3
@@ -41,6 +41,7 @@
|
||||
#include "convert.h"
|
||||
|
||||
#include "a68.h"
|
||||
#include "a68-pretty-print.h"
|
||||
|
||||
/* Note that enclosed clauses, which are units, are handled in
|
||||
a68-low-clauses. */
|
||||
@@ -250,8 +251,19 @@ a68_lower_denotation (NODE_T *p, LOW_CTX_T ctx)
|
||||
s = SUB (p);
|
||||
|
||||
type = CTYPE (moid);
|
||||
errno = 0;
|
||||
#if defined(INT64_T_IS_LONG)
|
||||
int64_t val = strtol (NSYMBOL (s), &end, 10);
|
||||
#else
|
||||
int64_t val = strtoll (NSYMBOL (s), &end, 10);
|
||||
#endif
|
||||
gcc_assert (end[0] == '\0');
|
||||
if (errno == ERANGE || val > wi::max_value (type).to_shwi ())
|
||||
{
|
||||
a68_moid_format_token m (moid);
|
||||
a68_error (s, "denotation is too large for %e", &m);
|
||||
}
|
||||
|
||||
return build_int_cst (type, val);
|
||||
}
|
||||
if (moid == M_BITS
|
||||
|
||||
4
gcc/testsuite/algol68/compile/error-denotation-1.a68
Normal file
4
gcc/testsuite/algol68/compile/error-denotation-1.a68
Normal file
@@ -0,0 +1,4 @@
|
||||
{ dg-options {-fstropping=supper} }
|
||||
begin int i0 := 123456789012345678901234567890; { dg-error "denotation is too large for int" }
|
||||
skip
|
||||
end
|
||||
6
gcc/testsuite/algol68/compile/error-denotation-2.a68
Normal file
6
gcc/testsuite/algol68/compile/error-denotation-2.a68
Normal file
@@ -0,0 +1,6 @@
|
||||
{ dg-options {-fstropping=supper} }
|
||||
{ dg-require-effective-target int32 }
|
||||
begin int i0 := 2147483648; { dg-error "denotation is too large for int" }
|
||||
int i1 := 2147483647;
|
||||
skip
|
||||
end
|
||||
6
gcc/testsuite/algol68/compile/error-denotation-3.a68
Normal file
6
gcc/testsuite/algol68/compile/error-denotation-3.a68
Normal file
@@ -0,0 +1,6 @@
|
||||
{ dg-options {-fstropping=supper} }
|
||||
{ dg-require-effective-target longlong64 }
|
||||
begin long long int i0 := long long 9223372036854775808; { dg-error "denotation is too large for long long int" }
|
||||
long long int i1 := long long 9223372036854775807;
|
||||
skip
|
||||
end
|
||||
@@ -12,11 +12,11 @@ BEGIN BEGIN INT i := 10;
|
||||
i PLUSAB SHORT 100;
|
||||
ASSERT (i = SHORT 1200)
|
||||
END;
|
||||
BEGIN SHORT SHORT INT i := SHORT SHORT 10000;
|
||||
i +:= SHORT SHORT 1000;
|
||||
ASSERT (i = SHORT SHORT 11000);
|
||||
i PLUSAB SHORT SHORT 1000;
|
||||
ASSERT (i = SHORT SHORT 12000)
|
||||
BEGIN SHORT SHORT INT i := SHORT SHORT 100;
|
||||
i +:= SHORT SHORT 10;
|
||||
ASSERT (i = SHORT SHORT 110);
|
||||
i PLUSAB SHORT SHORT 10;
|
||||
ASSERT (i = SHORT SHORT 120)
|
||||
END;
|
||||
|
||||
BEGIN LONG INT i := LONG 1000;
|
||||
|
||||
Reference in New Issue
Block a user