aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEtienne Servais <servais@adacore.com>2022-01-18 15:45:40 +0100
committerPierre-Marie de Rodat <derodat@adacore.com>2022-05-10 08:19:22 +0000
commit3ad8cac47099983e9b24103e8327bc2518044877 (patch)
tree9ad184524bbb781646cfd9e2f5f05d6e98f8daaa
parentd979a676fde85a362cb8d7b142300a494370f3e9 (diff)
downloadgcc-3ad8cac47099983e9b24103e8327bc2518044877.zip
gcc-3ad8cac47099983e9b24103e8327bc2518044877.tar.gz
gcc-3ad8cac47099983e9b24103e8327bc2518044877.tar.bz2
[Ada] Reject numeric literals with too big exponents
While the compiler can compute numeric literal with arbitrary large exponents, this may take ages and is most likely a typo. Better emit an error when we certainly expect it to take long. The chosen threshold takes about 100s to compute. gcc/ada/ * scng.adb (Nlit): Error on big UI_Scale.
-rw-r--r--gcc/ada/scng.adb9
1 files changed, 9 insertions, 0 deletions
diff --git a/gcc/ada/scng.adb b/gcc/ada/scng.adb
index d0fb7f1..676a4f2 100644
--- a/gcc/ada/scng.adb
+++ b/gcc/ada/scng.adb
@@ -772,6 +772,15 @@ package body Scng is
if UI_Scale = 0 then
Int_Literal_Value := UI_Num_Value;
+ -- When the exponent is large, computing is expected to take a
+ -- rather unreasonable time. We generate an error so that it
+ -- does not appear that the compiler has gotten stuck. Such a
+ -- large exponent is most likely a typo anyway.
+
+ elsif UI_Scale >= 800_000 then
+ Error_Msg_SC ("exponent too large");
+ Int_Literal_Value := No_Uint;
+
-- Avoid doing possibly expensive calculations in cases like
-- parsing 163E800_000# when semantics will not be done anyway.
-- This is especially useful when parsing garbled input.