diff options
author | Etienne Servais <servais@adacore.com> | 2022-01-18 15:45:40 +0100 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2022-05-10 08:19:22 +0000 |
commit | 3ad8cac47099983e9b24103e8327bc2518044877 (patch) | |
tree | 9ad184524bbb781646cfd9e2f5f05d6e98f8daaa | |
parent | d979a676fde85a362cb8d7b142300a494370f3e9 (diff) | |
download | gcc-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.adb | 9 |
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. |