[Ada] Spurious run-time error with 64-bit modular types
authorEd Schonberg <schonberg@adacore.com>
Wed, 10 Jul 2019 09:02:55 +0000 (09:02 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Wed, 10 Jul 2019 09:02:55 +0000 (09:02 +0000)
commit4669743bd255d2ab4ff33672e8843a914e5c1d35
tree96e179791fdde784f987de9c6a842e0f35cd889c
parentccba4bf136ef7012e7387119a86da56575802c4f
[Ada] Spurious run-time error with 64-bit modular types

As a lexical element an integer literal has type Universal_Integer, i.e
is compatible with any integer type. This is semantically consistent and
simplifies type checking and subsequent constant folding when
applicable.  An exception is caused by 64-bit modular types, whose upper
bound is not representable in a non-static context that will use 64-bit
integers at run-time. For such cases we need to preserve the information
that the analyzed literal has that modular type. For simplicity we
preseve the information for all integer literals that result from a
modular operation.  This happens after prior analysis (or construction)
of the literal, and after type checking and resolution.

2019-07-10  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* sem_ch2.adb (Analyze_Integer_Literal): Preserve the type of
the literal if prior analysis determined that its type is a
modular integer type.

gcc/testsuite/

* gnat.dg/modular5.adb: New testcase.

From-SVN: r273352
gcc/ada/ChangeLog
gcc/ada/sem_ch2.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/modular5.adb [new file with mode: 0644]